首页 > 解决方案 > 使用 Excel VBA 评估一维数组中可变长度字符串的最大长度

问题描述

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

我知道对于声明的工作表 Range 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)), """, """) & """}))")

PS:我不想循环数组,因为数组非常小。

标签: arraysexcelvbamaxevaluate

解决方案


好问题。您需要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 表格中。OP提到那MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))")行得通。非常合乎逻辑,因为在将读取的工作表上(假设 rng 为A1:A5):

=MAX(LEN(A1:A5))

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

OP 说他想喂一个数组。因此,我们可以颠倒逻辑并思考工作表上的函数会是什么样子:

=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

推荐阅读