Замена подстроки, содержащейся в текстовых значениях ячеек указанного диапазона, другой подстрокой с помощью метода Range.Replace из кода VBA Excel.
Range.Replace – это метод, который находит по шаблону подстроку в содержимом ячеек указанного диапазона, заменяет ее на другую подстроку и возвращает значение типа Boolean.
Метод имеет некоторые особенности, которые заключаются в следующем:
- при присвоении булева значения, возвращаемого методом Range.Replace, переменной, необходимо список параметров (аргументов) метода заключать в круглые скобки;
- если метод используется без присвоения возвращаемого значения переменной, параметры должны быть указаны без заключения их в круглые скобки.
Синтаксис и параметры метода
Синтаксис
Синтаксис при замене подстроки и присвоении переменной возвращаемого значения типа Boolean:
variable = expression.Replace(What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat])
Синтаксис при замене подстроки без присвоения переменной возвращаемого значения:
expression.Replace What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat]
- variable – переменная (тип данных — Boolean);
- expression – выражение, возвращающее объект Range.
Параметры
Параметр | Описание |
---|---|
What | Искомая подстрока или шаблон*, по которому ищется подстрока в диапазоне ячеек. Обязательный параметр. |
Replacement | Подстрока, заменяющая искомую подстроку. Обязательный параметр. |
LookAt | Указывает правило поиска по полному или частичному вхождению искомой подстроки в текст ячейки: 1 (xlWhole) – поиск полного вхождения искомого текста; 2 (xlPart) – поиск частичного вхождения искомого текста. Необязательный параметр. |
SearchOrder | Задает построчный или постолбцовый поиск: 1 (xlByRows) – построчный поиск; 2 (xlByColumns) – постолбцовый поиск. Необязательный параметр. |
MatchCase | Поиск с учетом или без учета регистра: 0 (False) – поиск без учета регистра; 1 (True) – поиск с учетом регистра. Необязательный параметр. |
MatchByte | Способы сравнения двухбайтовых символов: 0 (False) – двухбайтовые символы сопоставляются с однобайтовыми эквивалентами; 1 (True) – двухбайтовые символы сопоставляются только с двухбайтовым символами. Необязательный параметр. |
SearchFormat | Формат поиска. Необязательный параметр. |
ReplaceFormat | Формат замены. Необязательный параметр. |
* Смотрите знаки подстановки для шаблонов, которые можно использовать в параметре What.
Работа метода в VBA Excel
Исходная таблица для всех примеров:
Пример 1
Примеры записи строк кода с методом Range.Replace и поиском по частичному совпадению подстроки с содержимым ячейки:
Sub Primer1() ‘Запись 1: Range(«A1:C6»).Replace «Лиса», «Рысь», 2 ‘Запись 2: Range(«A1:C6»).Replace What:=«Лиса», Replacement:=«Рысь», LookAt:=2 ‘Запись 3: If Range(«A1:C6»).Replace(«Лиса», «Рысь», 2) Then End If ‘Запись 4: Dim a a = Range(«A1:C6»).Replace(«Лиса», «Рысь», 2) End Sub |
Результат выполнения любого из вариантов кода примера 1:
Пример 2
Поиск по шаблону с использованием знаков подстановки и по полному совпадению подстроки с содержимым ячейки:
Sub Primer2() Range(«A1:C6»).Replace «Ли??», «Рысь», 1 End Sub |
Обратите внимание, что слово «Лиса» заменено словом «Рысь» не во всех ячейках. Это произошло из-за того, что мы использовали параметр LookAt:=1 – поиск полного вхождения искомого текста в содержимое ячейки.
Хитрости »
12 Август 2015 83700 просмотров
Массовая замена слов
Предположим, что нам необходимо заменить все «ул.» на листе на «улица «. Или русское слово «дом» на английское «house». Или еще интереснее: все английские буквы на русские. Например, английская «а» должна быть заменена на русскую «a», английская «c» на русскую «с», английская «H» на русскую «Н» и т.д. А такое тоже нередко бывает и доставляет проблемы. Ведь если в одной таблице будут русские буквы, а в другой английские — то применение большинства встроенных функций поиска(та же ВПР) просто не найдут соответствия.
Если подобную замену надо сделать для одного сочетания, то все просто: жмем Ctrl+H и указываем что заменить и на что. Но если таких замен надо сделать 20? Или 120? Это надо будет 120 раз нажать и ввести что заменять и на что. А если это надо сделать еще и не в одном документе — то…Думаю сами справитесь с умножением количества замен на количество файлов, в которых это надо сделать. И вроде бы простая операция превращается в ваш личный ад на работе.
Недавно на форуме участнику потребовалось автоматизировать именно такую штуку. Т.к. код несложный — решил написать и чуть дополнив выложить для всех кому код может потребоваться:
Option Explicit Sub Replace_Mass() Dim s As String Dim lCol As Long Dim avArr, lr As Long Dim lLastR As Long Dim lToFindCol As Long, lToReplaceCol As Long, lLookAt As Long 'запрашиваем направление перевода - с русского на англ. или наоборот lCol = Val(InputBox("Укажите направление перевода:" & vbNewLine & _ " 1 - ru-en" & vbNewLine & _ " 2 - en-ru", "Запрос", 1)) If lCol = 0 Then Exit Sub 'запрашиваем по части ячейки искать или по всему тексту 'по умолчанию - по части lLookAt = Val(InputBox("Искать соответствие по части ячейки или по всему тексту:" & vbNewLine & _ " 1 - по всему тексту" & vbNewLine & _ " 2 - по части ячейки", "Запрос", 2)) If lLookAt = 0 Then Exit Sub Select Case lCol Case 1 lToFindCol = 1 lToReplaceCol = 2 Case 2 lToFindCol = 2 lToReplaceCol = 1 End Select Application.ScreenUpdating = 0 'Получаем с листа Соответствия значения, которые надо заменить в выделенном диапазоне With ThisWorkbook.Sheets("Соответствия") lLastR = .Cells(.Rows.Count, 1).End(xlUp).Row avArr = .Cells(1, 1).Resize(lLastR, 2) End With 'заменяем For lr = 1 To UBound(avArr, 1) s = avArr(lr, lToFindCol) If Len(s) Then 'если значение для замены не пустое Selection.Replace s, avArr(lr, lToReplaceCol), lLookAt End If Next lr Application.ScreenUpdating = 1 End Sub
Как это работает. В книге есть специальный лист с именем «Соответствия». На нем в столбце А записаны слова, которые необходимо заменить, а в столбце В — на что эти слова заменить. Если в столбце А пусто — то замена не будет произведена. Если в столбце В пусто — то значение из столбца А будет просто удалено.
Замены производятся исключительно в выделенных на листе ячейках. Ячейки могут быть несмежными.
Итак, необходимо сделать много замен. Скачиваете файл:
Массовая замена слов (54,5 KiB, 9 783 скачиваний)
Примечание: Я сделал файл как переводчик. Т.е. в первом столбце русские слова, во втором английские. Но в столбцах может быть что угодно — хоть слова, хоть символы, хоть числа.
На лист «Соответствия» записываете в столбец А — что заменять, в столбец В — на что заменять. Переходите на лист книги, в котором необходимо произвести замену. Выделяете ячейки, значения в которых надо найти и заменить. После чего жмете Alt+F8 и выбираете макрос «Tips_Macro_ReplaceMASS.xls!Replace_Mass»(или просто «Replace_Mass», если код в той же книге, что и ячейки для поиска и замены).
Первым появится
окно с запросом направления перевода. По умолчанию 1(ru-en). Т.е. будет браться слово из столбца А и заменяться словом из столбца В. Но если указать 2 — то будет браться слово из столбца В и заменяться словом из столбца А. Т.е. аналог переводчика — с рус. на англ. и наоборот. Либо из А в В, либо из В в А.
Вторым появится
запрос на метод просмотра данных:
- если указать «1 — по всему тексту» — данные из столбца А будут заменять только в том случае, если ячейка в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Соответствия». Например, в любой из выделенных ячеек записано «На столе книга», а на листе «Соответствия» в столбце А есть только слово «книга». Замена не будет произведена, т.к. необходимо, чтобы в столбце А было так же «На столе книга».
- если указать «2 — по части ячейки» — данные из столбца А будут заменять в случае, если ячейка в выделенном для замены диапазоне содержит любое слово из столбца А листа «Соответствия». На том же примере — «На столе книга». Если выбрать 2, то в тексте «На столе книга» слово книга будет заменено на слово из столбца В — «book».
И еще один практический пример чуть модифицированного кода. Предположим, имеется таблица выручки по реализации продукции:
Как видно, здесь присутствую только номера статей, но нет их расшифровки. Зато расшифровка есть в отдельном листе «Справочник»:
Как видно, в справочнике присутствуют нужные номера статей и можно было бы применить ту же ВПР(VLOOKUP) для замен. Если бы не одно но: в таблице по реализации помимо номеров статьей есть еще лишний текст «Статья затрат:». Конечно, можно сначала заменить этот текст, потом в отдельном столбце применить ВПР, заменить формулу значениями и вернуть в исходный столбец. Если при этом надо еще оставить текст «Статья затрат:», то надо будет сделать еще доп.манипуляции либо при составлении формулы, либо после. В любом случае — слишком много лишних телодвижений. А значит бОльшие времязатраты.
Приложенный ниже файл поможет сделать это в разы быстрее:
Скачать файл с примером и кодом:
Массовая замена слов — статьи.xls (91,5 KiB, 2 648 скачиваний)
и в итоге за пару секунд получим следующий результат:
Достаточно выделить столбец со статьями на листе с реализацией и запустить код(либо нажатием кнопки заменить значения, либо нажав Alt+F8 и выбрав из списка макросов макрос
Replace_Mass
).
После нажатия на кнопку будут запрошены следующие параметры:
- указать номер столбца значений в листе «Справочник», в котором искать соответствия номерам статей(в нашем случае это столбец 1(А))
- указать номер столбца, значениями которого заменять найденные в таблице реализации значения(это может быть один из трех столбцов справочника: Группа затрат, Статья затрат, Подстатьи затрат). Логичнее всего указать столбец 4, т.к. он наиболее детализирован и конкретнее указывает расшифровку статьи
- далее будет предложено указать точность поиска:
- если указать «1 — по всему тексту» — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Справочник». Т.е. если бы у нас в таблице реализации был бы записан только номер статьи(1.01), тогда можно было бы указать именно 1
- если указать «2 — по части ячейки» — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне содержит любое значение из столбца А листа «Справочник». Это больше подходит к описанному случаю, т.к. нам необходимо заменить исключительно номер статьей на их расшифровку, оставив при этом текст «Статья затрат: «
Если все указано корректно, то на листе будут произведены все необходимые замены.
Возможные ошибки, которые предусмотрены кодом и о которых будет сообщено соответствующим сообщением(код прервется, замены не будут произведены):
- на листе Справочник нет значений
- в качестве столбца для поиска значений и для замены значений на листе Справочник указано одно и то же число
- в качестве столбца значений для замены указано число, превышающее общее количество столбцов на листе Справочник
Особое внимание хочу уделить случаю, когда выбирается замена по части ячейки. В этом случае лучше список на листе Справочник отсортировать по длине текста по тому столбцу, в котором будут значения для поиска. Зачем это надо: т.к. значение по части ячейки будет заменять не полное соответствие, то есть вероятность неверных замен. Например, есть текст «Статья затрат: 1.011». В то же время на листе Справочник есть статьи «1.01» и «1.011». Т.к. «1.01» идет раньше в большинстве случаев, то текст будет заменен некорректно: «Статья затрат: ТВ1«.
Чтобы получить длину строки текста можно использовать функцию ДЛСТР(LEN):
=ДЛСТР(A2)
=LEN(A2)
В отличие от кода, приведенного в начале статьи, код во втором файле позволяет производить замену не только на основании двух столбцов, но и ориентируясь на таблицу данных, как видно из реализации. Можно выбрать любой столбец Справочника для поиска значений и так же любой для замены, что предоставляет большую гибкость по замене значений.
Так же см.:
Замена значений по списку в PowerQuery
Найти в ячейке любое слово из списка
Замена ссылок в формулах на их значения
Как удалить строки по условию?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
argyman Пользователь Сообщений: 45 |
Добрый день! Прошу Вашей помощи! Нужен макрос, который бы находил и заменял текст в выделенном диапазоне ячеек согласно списку, объем достаточно большой от 2 500 до 10 000 ячеек. Буду очень благодарен за помощь! Спасибо! |
tolstak Пользователь Сообщений: 471 |
#2 24.08.2018 14:22:50 argyman, вот вариант:
Прикрепленные файлы
Изменено: tolstak — 24.08.2018 14:24:14 In GoTo we trust |
||
Nordheim Пользователь Сообщений: 3154 |
#3 24.08.2018 14:39:30 Еще вариант:
«Все гениальное просто, а все простое гениально!!!» |
||
argyman Пользователь Сообщений: 45 |
tolstak, огромное Вам спасибо! |
Nordheim Пользователь Сообщений: 3154 |
#5 24.08.2018 15:08:17 Пример с выбором диапазона:
«Все гениальное просто, а все простое гениально!!!» |
||
argyman Пользователь Сообщений: 45 |
Nordheim, круто! спасибо большое! |
AngSem Пользователь Сообщений: 1 |
А как можно дополнить данный код, чтобы рядом с таблицей значений на замену была таблица со значениями, при встрече которых строка бы удалялась полностью? |
tolstak Пользователь Сообщений: 471 |
#8 10.06.2019 14:08:05 AngSem, можно вот так:
Прикрепленные файлы
In GoTo we trust |
||
Andrey K Пользователь Сообщений: 2 |
Вопрос к tolstak, а как в первом варианте сделать так чтобы значения в ячейках которые проверяются были жестко зафиксированы. при нынешней обработке получается что aakrp и aakr45 преобразовываются в значение которое подставляется по синтаксису aakr с концом от значения в виде P и 45 Изменено: Andrey K — 12.06.2020 18:52:13 |
tolstak Пользователь Сообщений: 471 |
#10 12.06.2020 18:57:53 Andrey K, по идее, вот так:
Прикрепленные файлы
In GoTo we trust |
||
Andrey K Пользователь Сообщений: 2 |
tolstak,Спасибо большое всё помогло! =) дальше уже сам доделал обратное объединение в строку. |
ageres1982 Пользователь Сообщений: 30 |
Вопрос к tolstak, а как в первом варианте делать замену и по условию: т.е если значение ячейки не начинается на Liftinq или на Antistat то замену выполняем , в противном случае оставляем значение ячейки без изменений |
tolstak Пользователь Сообщений: 471 |
#13 22.07.2020 08:42:41 ageres1982, вот так:
Прикрепленные файлы
In GoTo we trust |
||
ageres1982 Пользователь Сообщений: 30 |
tolstak
Спасибо огромное. |
ageres1982 Пользователь Сообщений: 30 |
|
tolstak Пользователь Сообщений: 471 |
#16 22.07.2020 11:00:27 ageres1982, упс, кажется, малеленькая опечатка
вместо
Прикрепленные файлы
In GoTo we trust |
||||
ageres1982 Пользователь Сообщений: 30 |
Спасибо |
tolstak Пользователь Сообщений: 471 |
#18 22.07.2020 13:03:02 ageres1982, кажется, я совсем запутался в своем старом коде, прощу прощения…
Прикрепленные файлы
Изменено: tolstak — 22.07.2020 13:38:15 In GoTo we trust |
||
ageres1982 Пользователь Сообщений: 30 |
Не работает.. |
ageres1982 Пользователь Сообщений: 30 |
Спасибо огромное, теперь всё работает |
Михаил Лебедев Пользователь Сообщений: 2856 |
#21 23.07.2020 10:11:14
Красиво. Я бы только доделал, чтобы срабатывало и в том случае, если есть несколько слов на замену в одной ячейке. Хотя сейчас это ТС, похоже, не требуется Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/ |
||
Марина Александрова Пользователь Сообщений: 2 |
#22 08.10.2021 10:35:23 Подскажите пожалуйста, почему может не работать макрос. Суть в следующем: ячейки с «нет данных» (#Н/Д) заменить на пробел.
|
||
tolstak Пользователь Сообщений: 471 |
#23 08.10.2021 10:56:43 Марина Александрова, возможно у Вас там формула выдает ошибку, а не значение #Н/Д.
Прикрепленные файлы
In GoTo we trust |
||
Михаил Накаряков Пользователь Сообщений: 4 |
#25 18.11.2021 09:15:10
Огромное спасибо, очень сильно помогли упростить рутину Изменено: Михаил Накаряков — 18.11.2021 15:20:29 |
||
Содержание
- VBA Excel. Функция Replace (замена подстроки)
- Определение функции Replace
- Синтаксис и параметры
- Параметр compare
- Примеры кода VBA Excel
- Пример 1
- VBA Excel. Метод Range.Replace (замена текста в ячейках)
- Определение метода Range.Replace
- Синтаксис и параметры метода
- Синтаксис
- Параметры
- Массовая замена слов
VBA Excel. Функция Replace (замена подстроки)
Замена части строкового выражения в VBA Excel по указанному шаблону поиска и замены и возврат преобразованной строки с помощью функции Replace.
Определение функции Replace
Если замену подстроки необходимо осуществить в диапазоне ячеек, функцию Replace следует применить к значению каждой ячейки заданного диапазона. Проще замену в диапазоне ячеек произвести с помощью метода Range.Replace.
Синтаксис и параметры
Replace(expression, find, replace, [start], [count], [compare])
- expression – исходное строковое выражение, содержащее подстроку, которую необходимо заменить;
- find – искомая подстрока, подлежащая замене;
- replace – подстрока, заменяющая искомую подстроку;
- start – порядковый номер символа исходной строки, с которого необходимо начать поиск, часть строки до этого номера обрезается, по умолчанию равен 1 (необязательный параметр);
- count – количество замен подстроки, по умолчанию выполняется замена всех обнаруженных вхождений (необязательный параметр);
- compare – числовое значение, указывающее вид сравнения (необязательный параметр).
Сокращенный синтаксис функции Replace с необязательными параметрами по умолчанию:
Replace(expression, find, replace)
Параметр compare
Константа | Значение | Описание |
---|---|---|
vbUseCompareOption | -1 | используется параметр, заданный оператором Option Compare |
vbBinaryCompare | 0 | выполняется двоичное сравнение |
vbTextCompare | 1 | применяется текстовое сравнение |
По умолчанию используется двоичное (бинарное) сравнение. При таком сравнении буквенные символы в нижнем и верхнем регистрах различаются. Если необходимо провести замену подстроки независимо от регистра букв, используйте значение параметра compare – vbTextCompare (1).
Примеры кода VBA Excel
Пример 1
Замена единственного вхождения искомой подстроки в строковое выражение:
Источник
VBA Excel. Метод Range.Replace (замена текста в ячейках)
Замена подстроки, содержащейся в текстовых значениях ячеек указанного диапазона, другой подстрокой с помощью метода Range.Replace из кода VBA Excel.
Определение метода Range.Replace
Метод имеет некоторые особенности, которые заключаются в следующем:
- при присвоении булева значения, возвращаемого методом Range.Replace, переменной, необходимо список параметров (аргументов) метода заключать в круглые скобки;
- если метод используется без присвоения возвращаемого значения переменной, параметры должны быть указаны без заключения их в круглые скобки.
Синтаксис и параметры метода
Синтаксис
Синтаксис при замене подстроки и присвоении переменной возвращаемого значения типа Boolean:
variable = expression.Replace(What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat])
Синтаксис при замене подстроки без присвоения переменной возвращаемого значения:
expression.Replace What, Replacement, [LookAt], [SearchOrder], [MatchCase], [MatchByte], [SearchFormat], [ReplaceFormat]
- variable – переменная (тип данных — Boolean);
- expression – выражение, возвращающее объект Range.
Параметры
Параметр | Описание |
---|---|
What | Искомая подстрока или шаблон*, по которому ищется подстрока в диапазоне ячеек. Обязательный параметр. |
Replacement | Подстрока, заменяющая искомую подстроку. Обязательный параметр. |
LookAt | Указывает правило поиска по полному или частичному вхождению искомой подстроки в текст ячейки: 1 (xlWhole) – поиск полного вхождения искомого текста; 2 (xlPart) – поиск частичного вхождения искомого текста. Необязательный параметр. |
SearchOrder | Задает построчный или постолбцовый поиск: 1 (xlByRows) – построчный поиск; 2 (xlByColumns) – постолбцовый поиск. Необязательный параметр. |
MatchCase | Поиск с учетом или без учета регистра: 0 (False) – поиск без учета регистра; 1 (True) – поиск с учетом регистра. Необязательный параметр. |
MatchByte | Способы сравнения двухбайтовых символов: 0 (False) – двухбайтовые символы сопоставляются с однобайтовыми эквивалентами; 1 (True) – двухбайтовые символы сопоставляются только с двухбайтовым символами. Необязательный параметр. |
SearchFormat | Формат поиска. Необязательный параметр. |
ReplaceFormat | Формат замены. Необязательный параметр. |
* Смотрите знаки подстановки для шаблонов, которые можно использовать в параметре What.
Источник
Массовая замена слов
Предположим, что нам необходимо заменить все «ул.» на листе на «улица «. Или русское слово «дом» на английское «house». Или еще интереснее: все английские буквы на русские. Например, английская «а» должна быть заменена на русскую «a», английская «c» на русскую «с», английская «H» на русскую «Н» и т.д. А такое тоже нередко бывает и доставляет проблемы. Ведь если в одной таблице будут русские буквы, а в другой английские — то применение большинства встроенных функций поиска(та же ВПР) просто не найдут соответствия.
Если подобную замену надо сделать для одного сочетания, то все просто: жмем Ctrl+H и указываем что заменить и на что. Но если таких замен надо сделать 20? Или 120? Это надо будет 120 раз нажать и ввести что заменять и на что. А если это надо сделать еще и не в одном документе — то. Думаю сами справитесь с умножением количества замен на количество файлов, в которых это надо сделать. И вроде бы простая операция превращается в ваш личный ад на работе.
Недавно на форуме участнику потребовалось автоматизировать именно такую штуку. Т.к. код несложный — решил написать и чуть дополнив выложить для всех кому код может потребоваться:
Option Explicit Sub Replace_Mass() Dim s As String Dim lCol As Long Dim avArr, lr As Long Dim lLastR As Long Dim lToFindCol As Long, lToReplaceCol As Long, lLookAt As Long ‘запрашиваем направление перевода — с русского на англ. или наоборот lCol = Val(InputBox(«Укажите направление перевода:» & vbNewLine & _ » 1 — ru-en» & vbNewLine & _ » 2 — en-ru», «Запрос», 1)) If lCol = 0 Then Exit Sub ‘запрашиваем по части ячейки искать или по всему тексту ‘по умолчанию — по части lLookAt = Val(InputBox(«Искать соответствие по части ячейки или по всему тексту:» & vbNewLine & _ » 1 — по всему тексту» & vbNewLine & _ » 2 — по части ячейки», «Запрос», 2)) If lLookAt = 0 Then Exit Sub Select Case lCol Case 1 lToFindCol = 1 lToReplaceCol = 2 Case 2 lToFindCol = 2 lToReplaceCol = 1 End Select Application.ScreenUpdating = 0 ‘Получаем с листа Соответствия значения, которые надо заменить в выделенном диапазоне With ThisWorkbook.Sheets(«Соответствия») lLastR = .Cells(.Rows.Count, 1).End(xlUp).Row avArr = .Cells(1, 1).Resize(lLastR, 2) End With ‘заменяем For lr = 1 To UBound(avArr, 1) s = avArr(lr, lToFindCol) If Len(s) Then ‘если значение для замены не пустое Selection.Replace s, avArr(lr, lToReplaceCol), lLookAt End If Next lr Application.ScreenUpdating = 1 End Sub
Как это работает. В книге есть специальный лист с именем «Соответствия». На нем в столбце А записаны слова, которые необходимо заменить, а в столбце В — на что эти слова заменить. Если в столбце А пусто — то замена не будет произведена. Если в столбце В пусто — то значение из столбца А будет просто удалено.
Замены производятся исключительно в выделенных на листе ячейках. Ячейки могут быть несмежными.
Итак, необходимо сделать много замен. Скачиваете файл:
Массовая замена слов (54,5 KiB, 9 743 скачиваний)
Примечание: Я сделал файл как переводчик. Т.е. в первом столбце русские слова, во втором английские. Но в столбцах может быть что угодно — хоть слова, хоть символы, хоть числа.
На лист «Соответствия» записываете в столбец А — что заменять, в столбец В — на что заменять. Переходите на лист книги, в котором необходимо произвести замену. Выделяете ячейки, значения в которых надо найти и заменить. После чего жмете Alt+F8 и выбираете макрос «Tips_Macro_ReplaceMASS.xls!Replace_Mass»(или просто «Replace_Mass», если код в той же книге, что и ячейки для поиска и замены).
Первым появится окно с запросом направления перевода. По умолчанию 1(ru-en). Т.е. будет браться слово из столбца А и заменяться словом из столбца В. Но если указать 2 — то будет браться слово из столбца В и заменяться словом из столбца А. Т.е. аналог переводчика — с рус. на англ. и наоборот. Либо из А в В, либо из В в А.
Вторым появится запрос на метод просмотра данных:
- если указать «1 — по всему тексту» — данные из столбца А будут заменять только в том случае, если ячейка в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Соответствия». Например, в любой из выделенных ячеек записано «На столе книга», а на листе «Соответствия» в столбце А есть только слово «книга». Замена не будет произведена, т.к. необходимо, чтобы в столбце А было так же «На столе книга».
- если указать «2 — по части ячейки» — данные из столбца А будут заменять в случае, если ячейка в выделенном для замены диапазоне содержит любое слово из столбца А листа «Соответствия». На том же примере — «На столе книга». Если выбрать 2, то в тексте «На столе книга» слово книга будет заменено на слово из столбца В — «book».
И еще один практический пример чуть модифицированного кода. Предположим, имеется таблица выручки по реализации продукции:
Как видно, здесь присутствую только номера статей, но нет их расшифровки. Зато расшифровка есть в отдельном листе «Справочник»:
Как видно, в справочнике присутствуют нужные номера статей и можно было бы применить ту же ВПР(VLOOKUP) для замен. Если бы не одно но: в таблице по реализации помимо номеров статьей есть еще лишний текст «Статья затрат:». Конечно, можно сначала заменить этот текст, потом в отдельном столбце применить ВПР, заменить формулу значениями и вернуть в исходный столбец. Если при этом надо еще оставить текст «Статья затрат:», то надо будет сделать еще доп.манипуляции либо при составлении формулы, либо после. В любом случае — слишком много лишних телодвижений. А значит бОльшие времязатраты.
Приложенный ниже файл поможет сделать это в разы быстрее:
Скачать файл с примером и кодом:
Массовая замена слов — статьи.xls (91,5 KiB, 2 626 скачиваний)
и в итоге за пару секунд получим следующий результат:
Достаточно выделить столбец со статьями на листе с реализацией и запустить код(либо нажатием кнопки заменить значения, либо нажав Alt+F8 и выбрав из списка макросов макрос Replace_Mass ).
После нажатия на кнопку будут запрошены следующие параметры:
- указать номер столбца значений в листе «Справочник», в котором искать соответствия номерам статей(в нашем случае это столбец 1(А))
- указать номер столбца, значениями которого заменять найденные в таблице реализации значения(это может быть один из трех столбцов справочника: Группа затрат, Статья затрат, Подстатьи затрат). Логичнее всего указать столбец 4, т.к. он наиболее детализирован и конкретнее указывает расшифровку статьи
- далее будет предложено указать точность поиска:
- если указать » 1 — по всему тексту » — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа «Справочник». Т.е. если бы у нас в таблице реализации был бы записан только номер статьи(1.01), тогда можно было бы указать именно 1
- если указать » 2 — по части ячейки » — данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне содержит любое значение из столбца А листа «Справочник». Это больше подходит к описанному случаю, т.к. нам необходимо заменить исключительно номер статьей на их расшифровку, оставив при этом текст «Статья затрат: «
Если все указано корректно, то на листе будут произведены все необходимые замены.
Возможные ошибки, которые предусмотрены кодом и о которых будет сообщено соответствующим сообщением(код прервется, замены не будут произведены):
- на листе Справочник нет значений
- в качестве столбца для поиска значений и для замены значений на листе Справочник указано одно и то же число
- в качестве столбца значений для замены указано число, превышающее общее количество столбцов на листе Справочник
Особое внимание хочу уделить случаю, когда выбирается замена по части ячейки. В этом случае лучше список на листе Справочник отсортировать по длине текста по тому столбцу, в котором будут значения для поиска. Зачем это надо: т.к. значение по части ячейки будет заменять не полное соответствие, то есть вероятность неверных замен. Например, есть текст «Статья затрат: 1.011» . В то же время на листе Справочник есть статьи «1.01» и «1.011» . Т.к. «1.01» идет раньше в большинстве случаев, то текст будет заменен некорректно: «Статья затрат: ТВ 1 » .
Чтобы получить длину строки текста можно использовать функцию ДЛСТР(LEN):
=ДЛСТР( A2 )
=LEN(A2)
В отличие от кода, приведенного в начале статьи, код во втором файле позволяет производить замену не только на основании двух столбцов, но и ориентируясь на таблицу данных, как видно из реализации. Можно выбрать любой столбец Справочника для поиска значений и так же любой для замены, что предоставляет большую гибкость по замене значений.
Статья помогла? Поделись ссылкой с друзьями!
Источник
While working with MS Excel , sometimes you may need to delete values in strings or change them. You can automate that by using the powerful Replace() which is available in Excel VBA (Visual Basic for Applications). Today, we walk you through the series of steps to understand and master the Replace() function. The prerequisites for this intermediate course are the basic knowledge of Excel (here’s a course that can give you an introduction to Excel 2o13), strings and preliminary understanding of Excel VBA. If not, we recommend that you go through this beginner’s course on Excel VBA and macros. For a quick refresher, you can do a quick read through of our VBA tutorial.
Excel VBA Replace() is a simple yet very useful string function. As the name suggests, Replace() is used to replace a set of characters in a string with a new set of characters. The basic syntax of a VBA Replace function looks like this:
Replace(Source_string, Old_string, Replacement_string, [start, [count, [compare]]] )
Let’s go through each parameter to understand them better.
- Source_string: This is the complete source string, of which you want some characters to be replaced.
- Old_string: It’s the string which is to be replaced, ie the subset of source_string that you want to replace
- Replacement_string: Is the string or a set of characters with which you want “Old_string” is to be replaced.
- Start: Stands for the numerical position in the “Source_string” from which the search should start. This is an optional parameter. If this parameter is omitted, then by default the search begins at position 1.
- Count: This parameter stands for the frequency of occurrences of Old_string to be replaced. Like “start”, it’s an optional parameter. If this argument is omitted, then each occurrence of “Old_string” in the “Source_string” will be replaced.
- Compare: This is also an optional parameter. It represents the type of comparison algorithm to be used while the Replace Function searches for the occurrences of “Old_string” in the “Source_string.” Here are your options:
- vbBinaryCompare is the parameter value for binary comparison.
- vbTextCompare is the argument for textual comparison.
- Finally, the parameter value vbDatabaseCompare does a comparison based on information in your database.
Now that we’re familiar with the syntax of Replace function, lets move on to a few simple practical examples.
Examples
Replace (“Thank You", "You", "Everybody")
This example will return, “Thank Everybody”.
Replace ("Software Program", "Unique","code")
Guess what this will return? The code will return “Software Program.” The reason is we have asked the Replace function to replace “Unique.” However, you can see that “Unique” text string is not present inside the source string. So, Replace will leave the source string unchanged.
Replace ("Animal", "a", "f",2)
This code will return, “Animfl.” The reason is in the Replace function code, the search for character “a” starts from the second position. Wherever, “a” is found, it is replaced with “f”.
Replace ("Animal", "a", "f",1,1)
Here the Replace() will return “fnimal”. The reason being we have instructed the VBA Replace statement to replace only one occurrence of “a” with “f”.
We suggest you work out these examples and learn a bit more about VBA macros (you can use this VBA course) before moving on to more complex programs using Replace function. Here on, we will use the Visual Basic Editor to write the code. We assume that you know how to save, compile and run programs on this editor. You can always look up our course on Excel VBA and Macros here.
How to Remove Space from a String
Sub removeSpace() Dim stringSpace As String stringSpace = " this string contains spaces " stringSpace = Replace(stringSpace, " ", "") End Sub
Here we have declared stringSpace to be a variable of type string. It is initialized to a string which contains spaces. Replace() has the ‘stringSpace’ to the be source string. Every occurrence of space in the source string is removed using VBA Replace statement. Finally, stringSpace contains “thisstringcontainsspaces” which is the end result.
How to Replace a String within Inverted Comma
Sub replaceQuotedString() Dim y, longString, resultString1 As String y = Chr(34) & "abc" & Chr(34) longString = "Let's replace this string: " &y resultString1 = Replace(longString, y, "abc") End Sub
Here we declare y, longString, resultString1 as variables of data type string. Chr() converts the numerical values to string data type. In other words, it introduces the quotation marks to the numerical values. And(&) operator concatenates strings. Value of “y” is “34abc34.” The “longString” value is “Let’s replace this string: 34abc34″. In the Replace() value of source string is the “longString.” That is “34abc34” is replaced by “abc”. The resultstring1 now stores the value “Let’s replace this string: abc”
How to Remove Square Brackets from a String using Excel VBA
Sub removeSquareBrackets1() Dim trialStr As String trialStr = "[brackets have to be removed]" trialStr = Replace(trialStr, "[", "") trialStr = Replace(trialStr, "]", "") MsgBox (trialStr) End Sub
In this program, we’ve declared trialStr as a variable of type string. It’s assigned the value”[brackets have to be removed].” The first occurrence of the replace function removes the left square bracket from trialStr. The variable now contains “brackets have to be removed].” In the second occurrence of the Replace function, the right square bracket is removed. Finally the value of trialStr is “brackets have to be removed.” Note that there are no square brackets in trialStr now. And the MsgBox() displays the result.
How to Edit a Url Using Replace()
Enter this formula into any cell in your current Excel sheet.
=HYPERLINK("http://www.microsoft.com", "Microsoft Headquarters")
This creates a hyperlinked URL in the active cell of your worksheet. In the VBA editor, write the following code
Sub editURL1() Dim URL1, NewURL URL1 = ActiveCell.Formula NewURL = Replace(URL1, "Microsoft Headquarters", "World Office") ActiveCell.Formula = NewURL End Sub
In this program, we’ve declared URL1 and NewURL as variables. URL1 is initialized to the value in the selected cell. Replace () searches for occurrence of “Microsoft Headquarters” in the URL and replaces it with “World Office.” The selected cell is assigned the value of NewURL.
Programming using Excel VBA is interesting and gives you exposure to powerful functionality and features. Mastering it is important to efficiently and effectively use Excel. Once you’ve tried these examples for yourself, do share your learning and experience with us. Once you’re ready to take the next step, hop over to this Ultimate VBA course, to check out some advanced VBA concepts.