arrays - 使用 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
了下面的代码。这是一个二维数组,我只访问第一个维度。
观察:
这里的字符串稍长,即每个大约 100-200 个字符。
我明白了,不知何故,Join 中缺少开始和结束双引号。
代码是:
MX = Application.Evaluate("MAX(LEN({""" & Join(Application.Transpose(Application.Index(Arr, 0, 1)), """, """) & """}))")
PS:我不想循环数组,因为数组非常小。
解决方案
好问题。您需要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
推荐阅读
- c# - 反序列化文件时不支持文化
- javascript - 如何在具有相同类的多个 HTML div 上使用相同的 javascript 函数
- python-3.x - 如何解决 graphene.Union 中的多个查询集?
- c++ - 用于事件驱动作业的 C++ 多线程或多处理服务器
- excel - VBA正则表达式:使用自定义函数在Excel单元格中的字符串之间提取多个字符串
- java - 消费者无法在主机上运行代理可能不可用
- apache-kafka - 如何打印它正在发送的 Kafka 生产者批量大小?
- java - 使用 Java 解析 Mime 消息
- javascript - 为什么在使用扩展运算符时我的数据不会呈现到我的卡片组件上?
- kubectl - 从 kubectl 使用 kustomize 时如何设置负载限制器?