VBA替换是忽略列/表限制

时间:2015-02-06 21:01:30

标签: excel vba excel-vba replace

我正在尝试使用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.

2 个答案:

答案 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

有关远离SelectActicate的更多信息,请参阅How to avoid using Select in Excel VBA macros