Поиск и замена в именованных диапазонах — VBA для Excel

У меня есть электронная таблица Excel с сотней именованных диапазонов. Я хотел бы запустить скрипт, чтобы найти определенные строки в этих именованных диапазонах и заменить их другой строкой. Проблема заключается в изменении имен именованных диапазонов при сохранении базовых ссылок на ячейки.

Стандартная функция поиска и замены Excel не работает с именованными диапазонами.

Например: Именованный диапазон = "Оборот_Магазина_АВС_2018", и я хочу заменить текст "Магазин_АВС" на "Магазин_XYZ". Есть несколько строк, которые мне нужно найти и заменить, но макрос не должен быть сложным: я не возражаю запускать скрипт и вручную обновлять строки поиска каждый раз.

Любая помощь очень ценится!


person BobsYourUncle    schedule 18.04.2018    source источник


Ответы (2)


Это должно быть так же просто, как перебирать список имен для изменения и делать это:

ActiveWorkbook.Names("SomeName").Name = "SomeOtherName"

Вот процедура, которая сделает это за вас:

Option Explicit
Option Compare Text

Sub ReplaceNamePart(vMapping As Variant)
Dim nm  As Name
Dim sOld As String
Dim sNew As String
Dim i As Long


For i = 1 To UBound(vMapping)
    sOld = vMapping(i, 1)
    sNew = vMapping(i, 2)
    For Each nm In ActiveWorkbook.Names
        If InStr(nm.Name, sOld) > 1 Then nm.Name = Replace(nm.Name, sOld, sNew)
    Next nm
Next i

End Sub

...и вот как бы вы это назвали:

Sub ReplaceNamePart_Caller()
Dim v As Variant

v = Range("NameChange").ListObject.DataBodyRange
ReplaceNamePart v
End Sub

Эта подпрограмма вызывающего абонента требует, чтобы вы поместили сопоставление изменения имени в таблицу Excel следующим образом:

введите здесь описание изображения

... и назвать эту таблицу NameChange:

введите здесь описание изображения

Вот пример того, как все выглядит перед запуском кода:

введите здесь описание изображения

...и вот результат:

введите здесь описание изображения

person jeffreyweir    schedule 18.04.2018
comment
Спасибо, но я не думаю, что это сделает то, что я хочу. Мне нужно найти и заменить строку в различных именованных диапазонах, а не все имя. - person BobsYourUncle; 18.04.2018
comment
@BobsYourUncle Это помогло тебе? - person jeffreyweir; 19.04.2018
comment
Да! Это сработало отлично! Большое спасибо. Это сэкономило мне часы утомительной работы @jeffreyweir - person BobsYourUncle; 20.04.2018

Вы можете попробовать что-то подобное с полями ввода, чтобы ввести строки для поиска и замены:

    Sub search_replace__string()

Dim nm

For Each nm In ActiveWorkbook.Names
On Error Resume Next

If nm.RefersToRange.Parent.Name <> ActiveSheet.Name Then GoTo thenextnamedrange

MsgBox nm.Name

With ThisWorkbook.ActiveSheet.Range(nm.Name)

Dim i, j, FirstRow, FirstCol, LastRow, LastCol As Long
Dim SelText, RepText, myStr As String

FirstRow = .Row
FirstCol = .Column
LastRow = .End(xlDown).Row
LastCol = .End(xlToRight).Column

 SelText = InputBox("Enter String", "Search for...")
 RepText = InputBox("Enter String", "Replace with...")
 If SelText = "" Then
 MsgBox "String not found"
 Exit Sub
 End If
 For j = FirstCol To LastCol
 For i = FirstRow To LastRow
 If InStr(Cells(i, j), SelText) Then

    myStr = Cells(i, j).Value
    Cells(i, j).Value = Replace(myStr, SelText, RepText)

 End If
 Next
 Next

End With

thenextnamedrange:
Next nm

End Sub
person Community    schedule 18.04.2018