regex - 可以在范围内运行 Regex-Replace 而不是循环遍历 Excel 中的单元格吗?

标签 regex vba performance excel

我需要在一系列单元格(各不相同,但最多 4 或 5 位单元格计数)上进行许多正则表达式替换(目前约 100 个,但列表会增长)。
目前,我的工作草案是为每个模式重复循环遍历所有单元格,但显然这是很多循环。

理想情况下,我会称之为(伪代码):

Sheet.Range("A1:G1000").RegexReplace(pattern, replacement)

然而,最接近的是 Range.Replace 仅提及“您希望 Microsoft Excel 搜索的字符串”。

list of Regex.Replace overloads没有提及与单元格或范围相关的任何内容。

所以,由于 Range.RegexReplace好像没了 - 有没有比循环遍历每个模式、行和列更有效的方法来替换许多单元格中的许多模式?

最佳答案

不要迭代单元格。无论您是在编写 VBA、C# 还是 VB.NET,如果您使用的是 Range嵌套循环中的对象,您正在做的事情是您可以用 Excel 对象模型做的最慢的事情。

改为使用数组 - 你 需要在您的工具箱中有这样的功能:

Public Function ToArray(ByVal target As Range) As Variant
    Select Case True
        Case target.Count = 1
            'singe cell
            ToArray = Array(target.Value)
        Case target.Rows.Count = 1
            'horizontal 1D range
            ToArray = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(target.Value))
        Case target.columns.Count = 1
            'vertical 1D range
            ToArray = Application.WorksheetFunction.Transpose(target.Value)
        Case Else
            '2D array: let Excel to the conversion itself
            ToArray = target.Value
    End Select
End Function

现在您迭代一个内存中的值数组(使用 For 循环),并为每个值迭代多个 Regex.Replace调用 - 缓存和重用 Regex尽可能多的对象,因此您不会为成千上万个值一遍又一遍地重新创建相同的对象。

遍历整个数组后,将其转储到工作表中(根据需要调整大小和转置),然后瞧——您已经在一次操作中立即重写了数千个单元格。

关于regex - 可以在范围内运行 Regex-Replace 而不是循环遍历 Excel 中的单元格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43852107/

相关文章:

javascript - 正则表达式: convert to positive

excel - 为什么我在 Excel Vba 中的这个函数的 for 循环中得到了额外的选择?

vba - 在 Access 中循环表行,使用或不使用 Private Const

sql - 如何使用参数/变量并一起解释

regex - 如何删除以特定单词开头的句子?

jquery - 修复 RegEx 中的 JSLint 擒纵机构不良警告

regex - R regex - 匹配直到从末尾开始的第一个字母-空格-数字组合

VBA - 自动过滤器 - 总是隐藏确切的值

c++ - 性能崩溃 C++(std vector bad_allocation)

java - 如何在没有双 for 循环的情况下使用 HashMap 填充二维数组