使用 Excel VBA 评估一维数组中可变长度字符串的最大长度
Evaluate the Maximum Length amongst variable length strings in an one-dimensional Array using Excel VBA
我有一个包含可变长度字符串的一维数组。我想使用 EVALUATE
、MAX
和 LEN
函数的组合在这些字符串中找到最大长度。
我知道对于声明为 Rng
的工作表范围,以下代码有效:
MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))")
但是我无法用一维数组实现类似的东西Arr
。
MX_LEN = EVALUATE("MAX(LEN(" & Arr & "))")
编辑:
我使用以下代码得到 Runtime error 13: Type Mismatch
。这是一个二维数组,我只访问其中的第一维。
观察:
这里的字符串有点长,每个字符串大约有 100-200 个字符。
我明白了,Join 中缺少开始和结束双引号。
密码是:
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
我有一个包含可变长度字符串的一维数组。我想使用 EVALUATE
、MAX
和 LEN
函数的组合在这些字符串中找到最大长度。
我知道对于声明为 Rng
的工作表范围,以下代码有效:
MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))")
但是我无法用一维数组实现类似的东西Arr
。
MX_LEN = EVALUATE("MAX(LEN(" & Arr & "))")
编辑:
我使用以下代码得到 Runtime error 13: Type Mismatch
。这是一个二维数组,我只访问其中的第一维。
观察:
这里的字符串有点长,每个字符串大约有 100-200 个字符。
我明白了,Join 中缺少开始和结束双引号。
密码是:
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