【问题标题】:VBA - Search a string for all values in arrayVBA - 在字符串中搜索数组中的所有值
【发布时间】:2016-06-16 14:24:32
【问题描述】:

这里只是一个效率问题。我本质上是循环遍历列中的单元格以查看它们是否包含特定字符串,但是该单元格也需要不包含 14 个不同字符串中的任何一个。我当前的解决方案是找到字符串,然后在单元格上使用 instr 循环遍历数组。但是,当宏运行时,这可能会发生数百次。我很好奇是否有更好的方法。

例如:

NotArr = Array("blah1", "blah2", "blah3", "etc")

For r = 1 to 10
    'Let's assume I've already found the first string
    For i = 1 to 4
        If Not InStr(Cells(r, 1).value, NotArr(i)) > 0 Then
            'Do things
        End If
    Next i
Next r

注意:我知道我可能想多了,或者只是错过了显而易见的事情。我已经在 VBA 中埋葬了大约 6 周 @ 每天 10 小时,我能感觉到我的大脑正在融化。

谢谢大家!

【问题讨论】:

  • 如果您也将范围放入数组中,您可以使其更快,因此您不会多次返回工作表。或者至少将每个单元格的值放在一个变量中并进行测试,它还会减少您在工作表上引用单元格的次数。
  • 与工作表交互(在宏中使用Cells())多次减慢宏。您可以将要搜索的范围保存在一个数组中,然后在宏中使用数组来提高速度。还有一些基本的东西,比如在手动模式下保持计算和关闭屏幕更新。
  • 谢谢大家,这很有帮助。它已经更快了!
  • 我会说没关系。如果您想尝试获得一点点性能,可以尝试将 Cell 的值保存到字符串变量中,这样就不必一遍又一遍地引用该单元格。

标签: arrays excel vba


【解决方案1】:

与其循环遍历单元格,这需要 VBA 与 Excel 范围交互数百次,不如先尝试将数据存储在数组中?这应该会大大加快速度。

Dim arr() as Variant
arr = Range("A1:G10")
For each rng in arr
    For i = 1 to 4
        If Not InStr(rng.value, NotArr(i)) > 0 Then
            'Do things
        End If
    Next i
Next 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2017-04-24
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多