我需要在一系列单元格(各不相同,但最多 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/