Excel – 查找和replace多个单词

我只是想做一个简单的查找和replace多个string。 例如,我需要用“system”replace所有的“A1”,“A2”,“A3”,用“ACC”replace所有的“B1”,“B2”等等…

有谁知道一个好的路线? 我只是不知道如何开始。 谢谢您的帮助!

更新底部的地址迈克尔的评论是一个更好的方法来替代许多模式

如果您使用Excel菜单中的“手动Replace选项来录制简单的macros,您将获得可以清理的代码

  1. 第一个选项将更新ActiveSheet的单元格,而不是将"I am A1"更改为"I am System" – 部分string匹配
  2. 第二个选项只会更新ActiveSheet中仅包含"A1""Sytem"单元格 – 即全部单元格string匹配

 Sub UpdatePartial() With ActiveSheet.UsedRange .Replace "A1", "System", xlPart .Replace "A2", "System", xlPart .Replace "A3", "System", xlPart .Replace "B1", "ACC", xlPart .Replace "B2", "ACC", xlPart End With End Sub Sub UpdateWhole() With ActiveSheet.UsedRange .Replace "A1", "System", xlWhole .Replace "A2", "System", xlWhole .Replace "A3", "System", xlWhole .Replace "B1", "ACC", xlWhole .Replace "B2", "ACC", xlWhole End With End Sub 

更新

下面的代码

  1. 使用一个基本的Timer来比较从A1-A99B1-B99replace所有部分string
  2. 这两种方法是
    • 上面的Replace方法在循环中调用了198次(即2 * 99)
    • RegExp \ variant数组组合

在我的testing中,第二种方法在1,000,000个单元格范围内的198个replace更快。

更换更less将提高更换的相对速度。 更多的RegExp更多的细胞也将提高相对速度的Replace 。 较less的RegExp

我没有继续尝试Find方法,稍后parsingstring。 作为一个混合types的解决scheme( find然后parsing ut不会竞争到一个单一的replaceparsing

计时器

 Sub MainCaller() Dim dbTime As Double Dim lngCnt As Long dbTime = Timer() For lngCnt = 1 To 99 Call UpdatePartial("A" & lngCnt, "System") Call UpdatePartial("B" & lngCnt, "System") Next lngCnt Debug.Print Timer() - dbTime dbTime = Timer() Call RegexReplace("(A|B)[1-99]", "System") Debug.Print Timer() - dbTime End Sub 

1)replaceSub

 Sub UpdatePartial(StrIn As String, StrOut As String) ActiveSheet.UsedRange.Replace StrIn, StrOut, xlPart End Sub 

2)Regexp – Variant Array Sub

 Sub RegexReplace(StrIn As String, StrOut As String) Dim rng1 As Range Dim rngArea As Range Dim lngRow As Long Dim lngCol As Long Dim lngCalc As Long Dim objReg As Object Dim X() 'On Error Resume Next 'Set rng1 = Application.InputBox("Select range for the replacement of leading zeros", "User select", Selection.Address, , , , , 8) 'If rng1 Is Nothing Then Exit Sub 'On Error GoTo 0 ActiveSheet.UsedRange Set rng1 = ActiveSheet.UsedRange 'See Patrick Matthews excellent article on using Regular Expressions with VBA Set objReg = CreateObject("vbscript.regexp") With objReg .Pattern = StrIn .ignorecase = False .Global = True End With 'Speed up the code by turning off screenupdating and setting calculation to manual 'Disable any code events that may occur when writing to cells With Application lngCalc = .Calculation .ScreenUpdating = False .Calculation = xlCalculationManual .EnableEvents = False End With 'Test each area in the user selected range 'Non contiguous range areas are common when using SpecialCells to define specific cell types to work on For Each rngArea In rng1.Areas 'The most common outcome is used for the True outcome to optimise code speed If rngArea.Cells.Count > 1 Then 'If there is more than once cell then set the variant array to the dimensions of the range area 'Using Value2 provides a useful speed improvement over Value. On my testing it was 2% on blank cells, up to 10% on non-blanks X = rngArea.Value2 For lngRow = 1 To rngArea.Rows.Count For lngCol = 1 To rngArea.Columns.Count 'replace the leading zeroes X(lngRow, lngCol) = objReg.Replace(X(lngRow, lngCol), StrOut) Next lngCol Next lngRow 'Dump the updated array back over the initial range rngArea.Value2 = X Else 'caters for a single cell range area. No variant array required rngArea.Value = objReg.Replace(rngArea.Value, StrOut) End If Next rngArea 'cleanup the Application settings With Application .ScreenUpdating = True .Calculation = lngCalc .EnableEvents = True End With Set objReg = Nothing End Sub