Хороший вопрос. Вам нужно Join
массив в строку:
Sub Filtering()
Dim arr As Variant: arr = Array("Hello", "World", "Wide", "Web")
With Application
Dim MX_LEN As Long: MX_LEN = .Evaluate("MAX(LEN({""" & Join(arr, """,""") & """}))")
End With
End Sub
Немного подробнее о том, почему это работает:
.Evaluate
необходимо передать строку в виде действительной формулы. Поэтому нам нужно подумать, как мы запишем это на листе Excel. ОП упомянул, что MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))")
сработало. Очень логично, потому что на листе, который будет читаться (давайте предположим, что rng будет A1:A5
):
=MAX(LEN(A1:A5))
Теперь, поскольку Evaluate
распознает, что мы хотели ввести это как формулу массива, он вернет правильное значение.
ОП сказал, что хочет передать функцию массива. Поэтому мы можем обратить логику и подумать, как будет выглядеть функция на листе:
=MAX(LEN({"Hello", "World", "Wide", "Web"}))
Теперь нам просто нужно построить эту строку, используя Join
, и не забыть фигурные скобки. Чтобы проверить, правильно ли мы его строим, можно проверить с помощью Debug.Print "MAX(LEN({""" & Join(arr, """,""") & """}))"
Если мы хотим имитировать это, но вместо этого для первого измерения двумерного массива мы можем применить следующее:
With Application
MX_LEN = .Evaluate("MAX(LEN({""" & Join(.Transpose(.Index(arr, 0, 1)), """,""") & """}))")
End With
Одно замечание, как и во многих других случаях, длина строки не может превышать 255 символов. В противном случае Evaluate
вернет ошибку (согласно документации)
Это означает, что .Evaluate
нельзя использовать для больших строк, что делает цикл по массиву наиболее эффективной стратегией перехода.
Однако, если вы действительно не хотите зацикливаться, вы можете вместо этого заполнить ячейку формулой и прочитать результат ячейки value2
:
With Application
Sheet1.Range("A1").Formula = "=MAX(LEN({""" & Join(.Transpose(.Index(arr, 0, 1)), """,""") & """}))"
End With
Теперь вы можете прочитать это через:
MX_LEN = Sheet1.Range("A1").Value2
person
JvdV
schedule
20.11.2019