2015-02-06 5 views
4

Я пытаюсь использовать VBA для поиска/замены. Цель состоит в том, чтобы перебирать лист «Data_Pairs», который содержит все пары, чтобы найти/заменить, и найти/заменить эти пары только в столбце A и только в указанном диапазоне листов в книге (что делает не включают «Data_Pairs»).VBA Replace игнорирует ограничения на столбцы/листы

По какой-либо причине каждое соответствующее значение заменяется независимо от того, в каком столбце оно находится. Значения также заменяются в листах, индекс которых выходит за пределы заданного диапазона.

Любая помощь была бы принята с благодарностью.

Я использую следующий код:

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

Я просто побежал это и только заменить значения в Columna для меня, Excel 2013 – chancea

+2

Этот код правильно работал для меня в Excel 2007. – Greg

+1

Давайте сделаем это 3-на-3: Это код работал правильно для меня в Excel 2010. –

ответ

5

Я наблюдаю это, как ожидалось, в Excel 2010, повторяя комментарии Грега и шансы выше.

ОДНАКО, я также заметить, что если вы ранее открыли диалоговое окно поиска (например, вы делали некоторые ручной поиска/замены операции) и изменил простор УПРАЖНЕНИЯ, то наблюдаемые расхождения будут происходить, как описано здесь:

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

Это может быть надзор, поскольку он, кажется, никогда не обращался. В диалоговом окне Replace вы можете указать Рабочую книгу или Рабочий лист, нет соответствующего аргумента, который вы можете передать методу Replace (documentation).

Внедрение взлома из нити Ozgrid - по какой-то причине выполнение метода .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

Это была именно эта проблема. Я вручную выполнил замену CTRL + H всей книгой как область действия. Спасибо огромное! – LCG

+1

Cheers. Было бы разумно, как предполагает другой ответ, чтобы не полагаться на методы Select/Activate при продолжении работы в VBA. Вот хороший учебник по теме: http: // stackoverflow.com/вопросы/10714251/how-to-avoid-using-select-in-excel-vba-macros –

+1

Хороший пост David. – brettdj

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 

См How to avoid using Select in Excel VBA macros больше на получении от Select и Acticate.

+0

Спасибо, это имеет большой смысл. – LCG

Смежные вопросы