一个正则expression式replace可以运行在一个范围,而不是循环在Excel中的单元格?
我需要做一些正则expression式replace(目前〜100,但列表将增长)在一定范围的单元格(可变,但最多4或5位数的单元格数)。
目前,我的工作草案是循环遍历每个模式的所有单元格,但显然这是很多循环。
理想情况下,我会打电话(伪代码):
Sheet.Range("A1:G1000").RegexReplace(pattern, replacement)
然而,最接近的是Range.Replace
,它只提到“你想要Microsoft Excelsearch的string” 。
Regex.Replace
超载列表没有提及与单元格或范围有关的任何内容。
因此,由于Range.RegexReplace
似乎已经不存在了, 是否有更有效的方法来replace许多单元格中的许多模式,而不是遍历每个模式,行和列?
不要迭代单元格。 无论你是在编写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
调用 – 尽可能地caching和重用Regex
对象,所以你不会重新创build相同的对象一遍又一遍地重复着成千上万的值。
一旦遍历整个数组,将其转储到工作表中(根据需要resize和转置),然后通过单个操作即时重写数以千计的单元格。