【问题标题】:Evaluate the Maximum Length amongst variable length strings in an one-dimensional Array using Excel VBA使用 Excel VBA 评估一维数组中可变长度字符串的最大长度
【发布时间】:2019-11-20 11:43:20
【问题描述】:

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

我知道对于声明为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:我不想循环数组,因为数组非常小。

【问题讨论】:

  • 如果数组非常小,循环肯定会非常快。
  • 你的意思是数组很大吗?
  • 检查我的答案。要评估的总字符串不能超过 255 个字符。可能使这不是您解决此问题的方式=)

标签: arrays excel vba max evaluate


【解决方案1】:

好问题。你需要将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

One catch,就像在很多情况下一样,您的字符串不能超过 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

【讨论】:

  • 想知道为什么会这样。 Join 不只是产生一个字符串吗?
  • @Zac,这可能会令人困惑,但 Evaluate 需要“输入”一个字符串来评估。因此这是有效的。注意:MX_LEN = EVALUATE("MAX(LEN(" & Rng.Address & "))") 为 OP 工作,因为rng.Address 返回了一个要在Evaluate 中连接的字符串。
  • @SJR,如果你觉得这些东西很有趣,你也可以对thisthis 感兴趣。其实你那边已经回复了:)
  • 如果没有固定大小,我想你必须使用循环。否则会有另一种方式。现在循环是你最好的选择(正如@Rory 提到的那样应该非常快)
  • @Sifar,这确实是罪魁祸首。整个字符串:=MAX(LEN({"Hello", "World", "Wide", "Web"})) 不得超过 255 个字符。我仍在尝试寻找另一种方法,但我想循环是你最好的选择 =)
猜你喜欢
  • 2015-11-12
  • 2011-08-26
  • 1970-01-01
  • 2012-07-09
  • 2013-07-05
  • 2012-09-27
  • 2012-05-28
  • 2020-01-10
相关资源
最近更新 更多