VBA替换是忽略列/表限制

LCG*_*LCG 5 excel vba replace excel-vba

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

给出问题的具体示例:如果Data_Pairs A1 = A且Data_Pairs B1 = 1,则整个工作簿中的每个值1都将替换为A.

Dav*_*ens 5

我观察到它在Excel 2010中按预期工作,与上面的Greg和chancea的评论相呼应.

但是,我还观察到,如果您之前已打开FIND对话框(例如,您正在进行一些手动查找/替换操作)并将范围更改为WORKBOOK,则会发生观察到的差异,如下所述:

http://www.ozgrid.com/forum/showthread.php?t=118754

这可能是一种疏忽,因为它似乎从未被解决过.虽然该Replace对话框允许您指定工作簿与工作表,但是没有相应的参数可以传递给Replace方法(文档).

从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
Run Code Online (Sandbox Code Playgroud)