我正在尝试使用VBA进行查找/替换。目标是遍历“Data_Pairs”表,其中包含要查找/替换的所有对,以及在A列中查找/替换仅对中的 工作簿中指定的工作表范围(不包括“Data_Pairs”)。
由于某种原因,每个匹配的值都会被替换,无论它在哪个列中。值也会在索引超出定义范围的工作表中被替换。
非常感谢任何帮助。
我正在使用以下代码:
Sub Replace_Names()
Dim row As Integer
Dim row2 As Integer
Dim sheet As Integer
Dim findThisValue As String
Dim replaceWithThisValue As String
For row = 1 To 10
Worksheets("Data_Pairs").Activate
findThisValue = Cells(row, "A").Value
replaceWithThisValue = Cells(row, "B").Value
For sheet = 2 To 10
Worksheets(sheet).Columns("A").Replace What:= findThisValue, Replacement:=replaceWithThisValue
Next sheet
Next row
End Sub
给出问题的具体示例:如果Data_Pairs A1 = A且Data_Pairs B1 = 1,则整个工作簿中的每个值1都将替换为A.
答案 0 :(得分:5)
我观察到它在Excel 2010中的效果与预期一致,与上面的Greg和偶然评论相呼应。
但是,我还观察到,如果您之前打开了FIND对话框(例如,您正在进行一些手动查找/替换操作)并将范围更改为WORKBOOK,则会出现观察到的差异,如下所述:
http://www.ozgrid.com/forum/showthread.php?t=118754
这可能是一种疏忽,因为它似乎从未被解决过。虽然Replace
对话框允许您指定工作簿与工作表,但没有相应的参数可以传递给Replace
方法(documentation)。
从Ozgrid线程实现hack - 由于某种原因,执行.Find
方法似乎重置了这一点。这似乎有效:
Sub Replace_Names()
Dim row As Integer
Dim row2 As Integer
Dim sheet As Integer
Dim findThisValue As String
Dim replaceWithThisValue As String
Dim rng As Range
For row = 1 To 10
Worksheets("Data_Pairs").Activate
findThisValue = Cells(row, "A").Value
replaceWithThisValue = Cells(row, "B").Value
For sheet = 2 To 3
Set rng = Worksheets(sheet).Range("A:A")
rng.Find ("*") '### HACK
rng.Replace What:=findThisValue, Replacement:=replaceWithThisValue
Next sheet
Next row
End Sub
答案 1 :(得分:1)
Worksheets("Data_Pairs").Activate
循环中有一个For ... Next
。这似乎表明该命令被称为9倍以上。最好不要回复.Activate
以提供Cells
的默认父级。
Sub Replace_Names()
Dim rw As long, ws As long
Dim findThis As String, replaceWith As String
with Worksheets(1)
For rw = 1 To 10
findThis = .Cells(rw , "A").Value
replaceWith = .Cells(rw , "B").Value
For ws = 2 To 10 ' or sheets.count ?
with Worksheets(ws)
.Columns("A").Replace What:= findThis, Replacement:=replaceWith
end with
Next ws
Next rw
end with
End Sub
有关远离Select
和Acticate
的更多信息,请参阅How to avoid using Select in Excel VBA macros。