使用 Excel VBA 评估一维数组中可变长度字符串的最大长度

Evaluate the Maximum Length amongst variable length strings in an one-dimensional Array using Excel VBA

我有一个包含可变长度字符串的一维数组。我想使用 EVALUATEMAXLEN 函数的组合在这些字符串中找到最大长度。

我知道对于声明为 Rng 的工作表范围,以下代码有效:

MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))")

但是我无法用一维数组实现类似的东西Arr

MX_LEN = EVALUATE("MAX(LEN(" & Arr & "))")

编辑:

我使用以下代码得到 Runtime error 13: Type Mismatch。这是一个二维数组,我只访问其中的第一维。

观察:

密码是:

MX = Application.Evaluate("MAX(LEN({""" & Join(Application.Transpose(Application.Index(Arr, 0, 1)), """, """) & """}))")

P.S: 我不想循环数组,因为数组很小。

问得好。你需要把数组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 sheet。 OP提到 MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))") 有效。非常合乎逻辑,因为在作品sheet 上会读到(假设 rng 为 A1:A5):

=MAX(LEN(A1:A5))

现在,因为 Evaluate 会识别出我们打算将其作为数组公式输入,所以它会 return 正确的值。

OP 说他想要喂养一个数组。因此我们可以颠倒逻辑并思考 sheet 上的函数看起来像:

=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 将 return 出错(根据文档)

这意味着 .Evaluate 不能用于大字符串,使数组循环成为最有效的首选策略。

但是,如果您真的不想循环,您可以用公式填充单元格,然后读取单元格的结果 value2:

With Application
    Sheet1.Range("A1").Formula = "=MAX(LEN({""" & Join(.Transpose(.Index(arr, 0, 1)), """,""") & """}))"
End With

现在你可以读完了:

MX_LEN = Sheet1.Range("A1").Value2