替换全细胞内容
所以我替换整个单元格内容的想法是:
- 将替换读入字典
- 将数据读入数组
- 在数组中替换
- 将数组写回单元格
我选择数组是因为使用数组比使用单元格要快得多。所以我们只有一个慢速单元读取和一个慢速单元写入,并且使用数组很快。
Option Explicit
Public Sub MultiReplaceWholeCells()
Const xTitleId As String = "KutoolsforExcel"
Dim InputRange As Range
Set InputRange = Range("A2:F10") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
Dim ReplaceRange As Range
Set ReplaceRange = Range("A12:B14") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
Dim Replacements As Object
Set Replacements = CreateObject("Scripting.Dictionary")
'read replacements into an array
Dim ReplaceValues As Variant
ReplaceValues = ReplaceRange.Value
'read replacements into a dictionary
Dim iRow As Long
For iRow = 1 To ReplaceRange.Rows.Count
Replacements.Add ReplaceValues(iRow, 1), ReplaceValues(iRow, 2)
Next iRow
'read values into an array
Dim Data As Variant
Data = InputRange.Value
'loop through array data and replace whole data
Dim r As Long, c As Long
For r = 1 To InputRange.Rows.Count
For c = 1 To InputRange.Columns.Count
If Replacements.Exists(Data(r, c)) Then
Data(r, c) = Replacements(Data(r, c))
End If
Next c
Next r
'write data from array back to range
InputRange.Value = Data
End Sub
替换部分单元格内容
要替换单元格的一部分,这会更慢:
Option Explicit
Public Sub MultiReplaceWholeCells()
Const xTitleId As String = "KutoolsforExcel"
Dim InputRange As Range
Set InputRange = Range("A2:F10") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
Dim ReplaceRange As Range
Set ReplaceRange = Range("A12:B14") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
'read replacements into an array
Dim ReplaceValues As Variant
ReplaceValues = ReplaceRange.Value
'read values into an array
Dim Data As Variant
Data = InputRange.Value
'loop through array data and replace PARTS of data
Dim r As Long, c As Long
For r = 1 To InputRange.Rows.Count
For c = 1 To InputRange.Columns.Count
Dim iRow As Long
For iRow = 1 To ReplaceRange.Rows.Count
Data(r, c) = Replace(Data(r, c), ReplaceValues(iRow, 1), ReplaceValues(iRow, 2))
Next iRow
Next c
Next r
'write data from array back to range
InputRange.Value = Data
End Sub
如果您只需要替换整个单元格内容,请使用第一个应该更快。
两种替换类型的过程
或者如果您需要两者都编写一个程序,以便您可以选择是否需要替换xlWhole 或xlPart。甚至不同的输出范围也是可能的。
Option Explicit
Public Sub TestReplace()
Const xTitleId As String = "KutoolsforExcel"
Dim InputRange As Range
Set InputRange = Range("A2:F10") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
Dim ReplaceRange As Range
Set ReplaceRange = Range("A12:B14") 'Application.InputBox("Original Range ", xTitleId, InputRng.Address, Type:=8)
MultiReplaceInCells InputRange, ReplaceRange, xlWhole, Range("A20") 'replace whole to output range
MultiReplaceInCells InputRange, ReplaceRange, xlPart, Range("A30") 'replace parts to output range
MultiReplaceInCells InputRange, ReplaceRange, xlWhole 'replace whole in place
End Sub
Public Sub MultiReplaceInCells(InputRange As Range, ReplaceRange As Range, Optional LookAt As XlLookAt = xlWhole, Optional OutputRange As Range)
'read replacements into an array
Dim ReplaceValues As Variant
ReplaceValues = ReplaceRange.Value
'read values into an array
Dim Data As Variant
Data = InputRange.Value
Dim r As Long, c As Long, iRow As Long
If LookAt = xlPart Then
'loop through array data and replace PARTS of data
For r = 1 To InputRange.Rows.Count
For c = 1 To InputRange.Columns.Count
For iRow = 1 To ReplaceRange.Rows.Count
Data(r, c) = Replace(Data(r, c), ReplaceValues(iRow, 1), ReplaceValues(iRow, 2))
Next iRow
Next c
Next r
Else
'read replacements into a dictionary
Dim Replacements As Object
Set Replacements = CreateObject("Scripting.Dictionary")
For iRow = 1 To ReplaceRange.Rows.Count
Replacements.Add ReplaceValues(iRow, 1), ReplaceValues(iRow, 2)
Next iRow
'loop through array data and replace WHOLE data
For r = 1 To InputRange.Rows.Count
For c = 1 To InputRange.Columns.Count
If Replacements.Exists(Data(r, c)) Then
Data(r, c) = Replacements(Data(r, c))
End If
Next c
Next r
End If
'write data from array back to range
If OutputRange Is Nothing Then
InputRange.Value = Data
Else
OutputRange.Resize(InputRange.Rows.Count, InputRange.Columns.Count).Value = Data
End If
End Sub