Excel макрос поиск замена если нет поиск

Содержание

  1. VBA Excel. Метод Find объекта Range
  2. Предназначение и синтаксис метода Range.Find
  3. Синтаксис метода Range.Find
  4. Параметры метода Range.Find
  5. Знаки подстановки для поисковой фразы
  6. Простые примеры
  7. Быстрая замена значений по условию в Excel
  8. Быстрая замена значений по условию в Excel
  9. Excel макрос поиск замена если нет поиск
  10. Excel макрос поиск замена если нет поиск
  11. Как создать код макроса для поиска и замены текста в Excel?

VBA Excel. Метод Find объекта Range

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Предназначение и синтаксис метода Range.Find

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes .

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

В примерах используются переменные:

  • myPhrase – переменная для записи поисковой фразы;
  • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

Источник

Быстрая замена значений по условию в Excel

Быстрая замена значений по условию в Excel

Добрый день, уважаемые читатели блога! Сегодня поговорим о быстрой замене значений в таблице Excel. Зачем нам это нужно, когда есть формулы ЕСЛИ и условное форматирование? Ответ прост — для экономии времени. Но ведь можно ещё быстрее. Ниже будет пример с небольшой таблицей, где хочется сразу выделить или поместить нужное значение.

Есть две таблицы, одна оригинал, вторая для изменений. Все ученики кто получил 4 и выше имеют результат «Прошёл», у кого 3 и ниже — «Не прошёл».

Если будем использовать условное форматирование, придётся писать формулу каждый раз и если таблица очень большая и сразу хочется увидеть результат — лучше воспользоваться макросом.

Сразу оговорюсь в макросе будет прописан диапазон для замены, так что если таблица будет больше, нужно просто изменить диапазон.

  • вкладка «Разработчик», блок кнопок «Код»;
  • жмём «Visual Basic»;
  • добавляем новый модуль Insert -> Module.

Вставляем следующий код.

Sub Result()
Dim cell As Range
‘ Проверка каждой ячейки диапазона на прохождение
For Each cell In Range(«I2:L10»).Cells
If cell.Value
cell.Value = «Не прошёл»
ElseIf cell.Value >= 4 Then
cell.Value = «Прошёл»
End If
Next
End Sub

В этом случае используется связка из команд IF и ElseIf, что позволяет нам несколько расширить понимание формулы ЕСЛИ. Напомню, что макрос будет применён только к ячейкам из диапазона I2:L10!

Запускаем выбор макросов с помощью сочетания клавиш Alt+F8 и нажимаем кнопку «Выполнить».

Получаем результат. Во второй таблице я сразу вижу кто из учеников прошёл дальше, а кто нет. Ну и кому что необходимо подтянуть:)

Таким образом решается некая ограниченность формулы ЕСЛИ, ведь условия в макросе можно продолжить и подобрать свои, всего лишь изменив значения.

Источник

Excel макрос поиск замена если нет поиск

Искал похожие темы, но не нашел подходящее решение под свой вопрос.
Если такая тема была — прошу извинить заранее)

Помогите, пожалуйста, в таком вопросе.
Есть исходная книга Эксель, в которой расположено 500 значений в ячейках A1:A500. В той же папке, что и исходная книга, есть множество других книг, в которых есть значения в столбцах от «A» до «D».
Необходимо произвести поиск каждого значения из исходной книги в других книгах, расположеных в папке с исходным файлом и в соседнюю ячейку от исходного значения, добавить имя книги, в которой найдено значение.
Сам в макросах не очень силен, но по по-немногу учусь и кое-что уже понимаю)
Буду очень благодарен за любую помощь в данном вопросе.
Спасибо!

Искал похожие темы, но не нашел подходящее решение под свой вопрос.
Если такая тема была — прошу извинить заранее)

Помогите, пожалуйста, в таком вопросе.
Есть исходная книга Эксель, в которой расположено 500 значений в ячейках A1:A500. В той же папке, что и исходная книга, есть множество других книг, в которых есть значения в столбцах от «A» до «D».
Необходимо произвести поиск каждого значения из исходной книги в других книгах, расположеных в папке с исходным файлом и в соседнюю ячейку от исходного значения, добавить имя книги, в которой найдено значение.
Сам в макросах не очень силен, но по по-немногу учусь и кое-что уже понимаю)
Буду очень благодарен за любую помощь в данном вопросе.
Спасибо! footballplayer

Сообщение Доброго дня!

Искал похожие темы, но не нашел подходящее решение под свой вопрос.
Если такая тема была — прошу извинить заранее)

Помогите, пожалуйста, в таком вопросе.
Есть исходная книга Эксель, в которой расположено 500 значений в ячейках A1:A500. В той же папке, что и исходная книга, есть множество других книг, в которых есть значения в столбцах от «A» до «D».
Необходимо произвести поиск каждого значения из исходной книги в других книгах, расположеных в папке с исходным файлом и в соседнюю ячейку от исходного значения, добавить имя книги, в которой найдено значение.
Сам в макросах не очень силен, но по по-немногу учусь и кое-что уже понимаю)
Буду очень благодарен за любую помощь в данном вопросе.
Спасибо! Автор — footballplayer
Дата добавления — 24.01.2017 в 13:12

footballplayer Дата: Вторник, 24.01.2017, 15:14 | Сообщение № 2
footballplayer Дата: Вторник, 24.01.2017, 16:05 | Сообщение № 3

Набросал пример того, что необходимо в итоге, с приведением файлов.

К примеру, есть исходный файл (файл Исходный.xlsx). В исходном файле в столбце «A» есть значения от ячейки «A1» до ячейки «A10». В той же папке, где лежит исходный файл, есть множество других книг с разными именами ( к примеру, укажу три книги с именами: Данные1.xlsx, Данные2.xlsx, Данные3.xlsx), но во всех книгах только один лист. В книгах, в которых производится поиск, данные расположены в ячейках «A1:D100».

Необходимо, чтобы макрос произвел поиск всех данных ячеек от «A1» до «A500» из книги Исходный.xlsx в других книгах в той же папке и результатом было бы то, что в в ячейке, соседней к искомой вставлося имя той книги, где найдено искомое значение.

В книги Исходный.xlsx укаал финальный вид, который должен быть после поиска в книгах Данные1, Данные2 и Данные3.

Набросал пример того, что необходимо в итоге, с приведением файлов.

К примеру, есть исходный файл (файл Исходный.xlsx). В исходном файле в столбце «A» есть значения от ячейки «A1» до ячейки «A10». В той же папке, где лежит исходный файл, есть множество других книг с разными именами ( к примеру, укажу три книги с именами: Данные1.xlsx, Данные2.xlsx, Данные3.xlsx), но во всех книгах только один лист. В книгах, в которых производится поиск, данные расположены в ячейках «A1:D100».

Необходимо, чтобы макрос произвел поиск всех данных ячеек от «A1» до «A500» из книги Исходный.xlsx в других книгах в той же папке и результатом было бы то, что в в ячейке, соседней к искомой вставлося имя той книги, где найдено искомое значение.

В книги Исходный.xlsx укаал финальный вид, который должен быть после поиска в книгах Данные1, Данные2 и Данные3. footballplayer

Сообщение Набросал пример того, что необходимо в итоге, с приведением файлов.

К примеру, есть исходный файл (файл Исходный.xlsx). В исходном файле в столбце «A» есть значения от ячейки «A1» до ячейки «A10». В той же папке, где лежит исходный файл, есть множество других книг с разными именами ( к примеру, укажу три книги с именами: Данные1.xlsx, Данные2.xlsx, Данные3.xlsx), но во всех книгах только один лист. В книгах, в которых производится поиск, данные расположены в ячейках «A1:D100».

Необходимо, чтобы макрос произвел поиск всех данных ячеек от «A1» до «A500» из книги Исходный.xlsx в других книгах в той же папке и результатом было бы то, что в в ячейке, соседней к искомой вставлося имя той книги, где найдено искомое значение.

В книги Исходный.xlsx укаал финальный вид, который должен быть после поиска в книгах Данные1, Данные2 и Данные3. Автор — footballplayer
Дата добавления — 24.01.2017 в 16:05

Источник

Excel макрос поиск замена если нет поиск

Как создать код макроса для поиска и замены текста в Excel?

Обычно мы используем встроенную функцию «Найти и заменить» для поиска и замены значений в Excel. Фактически, вы можете найти и заменить текст в Excel прямо с помощью кода макроса. В этой статье вы узнаете, как создать код макроса для поиска и замены текста в Excel.

Удивительный! Использование эффективных вкладок в Excel, таких как Chrome, Firefox и Safari!
Экономьте 50% своего времени и сокращайте тысячи щелчков мышью каждый день!

Чтобы создать код макроса для поиска и замены текста в Excel, сделайте следующее.

1. нажмите другой + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. в Microsoft Visual Basic для приложений окна, нажмите Вставить > Модули. Затем скопируйте ниже код VBA в окно кода.

Код VBA: создание кода макроса для поиска и замены текста в Excel

3. нажмите F5 ключ для запуска кода.

4. В первом Kutools for Excel диалоговом окне введите текст или значение, которое вы будете искать, а затем щелкните OK кнопка. Смотрите скриншот:

5. В секунду Kutools for Excel диалоговом окне введите текст или значение, которое вы замените, и щелкните значок OK кнопку.

Затем все указанные тексты немедленно заменяются желаемым текстом.

Внимание: Этот код применяется к активному листу.

Источник

Adblock
detector

 

argyman

Пользователь

Сообщений: 45
Регистрация: 20.04.2015

Добрый день!

Прошу Вашей помощи!
В примере есть лист 1 — Specification, в первом столбце(его положение может меняться, поэтому лучше использовать выделенный диапазон) слова с ошибками, в них нужно исправить ошибки с помощью замены, из листа 2 — ReplaceList, в нём два столбца, в первом слова с ошибками, во втором правильный, он будет постоянно дополняться.

Нужен макрос, который бы находил и заменял текст в выделенном диапазоне ячеек согласно списку, объем достаточно большой от 2 500 до 10 000 ячеек.

Буду очень благодарен за помощь!

Спасибо!

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#2

24.08.2018 14:22:50

argyman, вот вариант:

Код
Sub replaceByList()
    Dim replaceRn As Range, inputRn As Range, replacementsRn As Range
    ' Определяем диапазон со значениями для замен
    With ThisWorkbook.Sheets("ReplaceList")
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
    End With
    With ThisWorkbook.Sheets("Specification")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error goto 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
    Next rrow
    
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub

Прикрепленные файлы

  • ReplaceMacros.xlsm (18.35 КБ)

Изменено: tolstak24.08.2018 14:24:14

In GoTo we trust

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#3

24.08.2018 14:39:30

Еще вариант:

Код
Option Explicit

Sub test()
    Dim dic As Object, txt$
    Dim i&, arr()
    Set dic = CreateObject("Scripting.Dictionary")
    arr = Worksheets("ReplaceList").UsedRange.Value
    For i = 1 To UBound(arr)
        txt = arr(i, 1)
        dic.Item(txt) = arr(i, 2)
    Next i
    arr = Worksheets("Specification").UsedRange.Value
    For i = 1 To UBound(arr)
        txt = arr(i, 1)
        If dic.exists(txt) Then arr(i, 1) = dic.Item(txt)
    Next i
    Worksheets("Specification").[a1].Resize(UBound(arr), UBound(arr, 2)).Value = arr
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

argyman

Пользователь

Сообщений: 45
Регистрация: 20.04.2015

tolstak, огромное Вам спасибо!
Отличное решение!
Именно то, что я и хотел!

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#5

24.08.2018 15:08:17

Пример с выбором диапазона:

Код
Sub test()
'   ---------------------------------------------
    Dim dic As Object, i&, txt$
    Dim allrange As Range, rng As Range
'   ---------------------------------------------
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    Set allrange = Application.InputBox("Выберите диапазон", Type:=8)
    arr = Worksheets("ReplaceList").UsedRange.Value
    For i = 1 To UBound(arr)
        txt = arr(i, 1)
        dic.Item(txt) = arr(i, 2)
    Next i
    For Each rng In allrange
        txt = rng.Value
        If dic.exists(txt) Then rng.Value = dic.Item(txt)
    Next rng
    Application.ScreenUpdating = True
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

argyman

Пользователь

Сообщений: 45
Регистрация: 20.04.2015

Nordheim, круто! спасибо большое!

 

AngSem

Пользователь

Сообщений: 1
Регистрация: 03.06.2019

А как можно дополнить данный код, чтобы рядом с таблицей значений на замену была таблица со значениями, при встрече которых строка бы удалялась полностью?

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#8

10.06.2019 14:08:05

AngSem, можно вот так:

Код
Sub replaceByList()
    Dim replaceRn As Range, inputRn As Range, replacementsRn As Range
    Dim deletionRn As Range, delRn As Range
    
    ' Определяем диапазон со значениями для удаления и замен
    With ThisWorkbook.Sheets("ReplaceList")
        ' Значения для удаления
        Set deletionRn = Range(.Cells(2, 5), .Cells(.Rows.Count, 5).End(xlUp).Offset(0, 1))
        
        ' Значения для замены
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
    End With
    
    With ThisWorkbook.Sheets("Specification")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error GoTo 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
' Поиск строк для УДАЛЕНИЯ
' Если удаление не требуется, кусок можно закомментировать
    ' Для каждой строки в анализируемых данных
    For Each ccell In inputRn.Cells
        ' Если ВПР(текущее значение;список_на_удаление;1;0) находит что-то, то
        If Not IsError(Application.VLookup(ccell.Cells(1).Value, deletionRn, 1, 0)) Then
            ' Добавим текущую строку к диапазону на удаление
            If delRn Is Nothing Then
                Set delRn = ccell.EntireRow
            ' Если в диапазоне на удаление уже что-то есть - допишем в него текущую строку
            Else
                Set delRn = Union(delRn, ccell.EntireRow)
            End If
        End If
    Next ccell
    ' Удалим диапазон, если он не пустой
    If Not delRn Is Nothing Then delRn.Delete
''
    
    
' Поиск строк для ЗАМЕНЫ
' Если удаление не требуется, кусок можно закомментировать
    
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
    Next rrow
''
    
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub


Прикрепленные файлы

  • ReplaceMacros.xlsm (21.07 КБ)

In GoTo we trust

 

Andrey K

Пользователь

Сообщений: 2
Регистрация: 12.06.2020

Вопрос к tolstak,  а как в первом варианте сделать так чтобы значения в ячейках которые проверяются были жестко зафиксированы.
то есть в файле спецификации есть и aakrp и aakr  и aakr45

при нынешней обработке получается что  aakrp и  aakr45 преобразовываются в значение которое подставляется по синтаксису aakr  с концом от значения в виде P и 45
как залочить значения? что если в ячейке aakr45 то оно и будет менятся на то чему равно в спецификации.

Изменено: Andrey K12.06.2020 18:52:13

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#10

12.06.2020 18:57:53

Andrey K, по идее, вот так:

Код
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value, LookAt:=xlWhole
    Next rrow
    

Прикрепленные файлы

  • ReplaceMacros.xlsm (18.85 КБ)

In GoTo we trust

 

Andrey K

Пользователь

Сообщений: 2
Регистрация: 12.06.2020

tolstak,Спасибо большое всё помогло! =) дальше уже сам доделал обратное объединение в строку.

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

Вопрос к tolstak,  а как в первом варианте делать замену и по условию: т.е если значение ячейки не начинается на Liftinq или на Antistat то замену выполняем , в противном случае оставляем значение ячейки без изменений  

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#13

22.07.2020 08:42:41

ageres1982, вот так:

Код
Sub replaceByList()
    Dim replaceRn As Range, inputRn As Range, replacementsRn As Range
    ' Определяем диапазон со значениями для замен
    With ThisWorkbook.Sheets("ReplaceList")
        ' Фразы для замены
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
        ' Если ячейка начинается на эти слова - не делаем замену
        Set startingWordsToIgnoreRn = Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp))
    End With
    
    With ThisWorkbook.Sheets("Specification")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error GoTo 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        ' По умолчанию - обрабытываем ячейку
        proceed = True
        ' Проверяем наличие слов из списка
        For Each wordRn In startingWordsToIgnoreRn
            word = wordRn.Value
            If Left(rrow.Cells(1, 1).Value, Len(word)) = word Then
                proceed = False
                Exit For
            End If
        Next wordRn
        
        ' Если нет слов из списка - начинаем замену.
        If proceed Then
            replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
        End If
    Next rrow
    
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub

Прикрепленные файлы

  • ReplaceMacros (1).xlsm (20.91 КБ)

In GoTo we trust

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

tolstak

Спасибо огромное.
Вижу в Вашем примере отрабатывает,  переношу в свой — не работает и не понимаю почему.
Может быть дело в _ в исключениях?
Подскажите пжста чтоне так?

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#16

22.07.2020 11:00:27

ageres1982, упс, кажется, малеленькая опечатка  :)
Должно быть

Код
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replaceRn.Rows
        ' По умолчанию - обрабытываем ячейку
        proceed = True

вместо

Код
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        ' По умолчанию - обрабытываем ячейку
        proceed = True

Прикрепленные файлы

  • Проверка.xlsm (67.55 КБ)

In GoTo we trust

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

Спасибо :)
Исключения теперь обходит, а когда нужно сделать замену выдаёт 13 ошибку.
Добавил пример.
 

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#18

22.07.2020 13:03:02

ageres1982, кажется, я совсем запутался в своем старом коде, прощу прощения… :-)

Код
Option Explicit
Option Compare Text

Sub XXXX()
...
Dim replaceRn As Range, inputRn As Range, replacementsRn As Range, startingWordsToIgnoreRn As Range, rrow As Range, proceed As String, wordRn As Range, word As String, where_to_replace_cell As Range
    ' Определяем диапазон со значениями для замен
    With ThisWorkbook.Sheets("Замена")
        ' Фразы для замены
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
        ' Если ячейка начинается на эти слова - не делаем замену
        Set startingWordsToIgnoreRn = Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp))
    End With
    
    With ThisWorkbook.Sheets("Поиск")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error GoTo 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
    For Each where_to_replace_cell In replaceRn.Cells
    ' По умолчанию - обрабытываем ячейку
        proceed = True
        ' Проверяем наличие слов из списка
        For Each wordRn In startingWordsToIgnoreRn
            word = wordRn.Value
            If Left(where_to_replace_cell.Cells(1, 1).Value, Len(word)) = word Then
                proceed = False
                Exit For
            End If
        Next wordRn
        ' Если нет слов из списка - начинаем замену.
        If proceed Then
            ' Для каждой пары заменяемых значений сделаем замену
            For Each rrow In replacementsRn.Rows
                where_to_replace_cell.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
            Next rrow
        End If
    
    Next where_to_replace_cell
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub

Прикрепленные файлы

  • Проверка (2).xlsm (65.42 КБ)

Изменено: tolstak22.07.2020 13:38:15
(В очередной раз поправил формулу :-) )

In GoTo we trust

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

Не работает..
Z_BW_AUTH_AO_YPLANT_3305 — должно остаться без изменения т.к есть в списке исклюения (тут не ок),
а для ZEAD_FI_03_02_D910 должен убраться хвостик _D910 (тут всё ок)

 

ageres1982

Пользователь

Сообщений: 30
Регистрация: 15.10.2019

Спасибо огромное, теперь всё работает  :)  

 

Михаил Лебедев

Пользователь

Сообщений: 2855
Регистрация: 17.01.2013

#21

23.07.2020 10:11:14

Цитата
Nordheim написал:
Еще вариант:

Красиво. Я бы только доделал, чтобы срабатывало и в том случае, если есть несколько слов на замену в одной ячейке. Хотя сейчас это ТС, похоже, не требуется :)

Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

 

Марина Александрова

Пользователь

Сообщений: 2
Регистрация: 18.08.2020

#22

08.10.2021 10:35:23

Подскажите пожалуйста, почему может не работать макрос. Суть в следующем: ячейки с «нет данных» (#Н/Д) заменить на пробел.

Код
Sub Макрос1()[
    Cells.Replace What:="#Н/Д", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#23

08.10.2021 10:56:43

Марина Александрова, возможно у Вас там формула выдает ошибку, а не значение #Н/Д.
В теории, можно написать такой макрос:

Код
    Dim errRn As Range
    ' Selection = Текущие выделенные ячейки
    For Each ccell In Selection
        If IsError(ccell) Then
            If errRn Is Nothing Then
                Set errRn = ccell
            Else
                Set errRn = Union(errRn, ccell)
            End If
        End If
    Next ccell
    If Not errRn Is Nothing Then
        'Значение для замены
        errRn.Value = " "
    End If
End Sub

Прикрепленные файлы

  • ErrClear.xlsm (17.19 КБ)

In GoTo we trust

 
 

Михаил Накаряков

Пользователь

Сообщений: 4
Регистрация: 02.04.2021

#25

18.11.2021 09:15:10

Цитата
написал:
tolstak

Огромное спасибо, очень сильно помогли упростить рутину
Один момент только когда пытаюсь  применить его в своем файле выдает ошибку на
Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
подскажите что с этим делать

Изменено: Михаил Накаряков18.11.2021 15:20:29

Возможно, вас интересует: функция ЗАМЕНИТЬ в Excel.

  • «Найти и заменить» в Excel
    • Горячие клавиши
    • Процедура «Найти и заменить» не работает
    • Подстановочные знаки, или как найти “звёздочку”
  • Замена нескольких значений на несколько
    • Массовая замена с помощью функции “ПОДСТАВИТЬ”
    • Файл-шаблон с формулой множественной замены
  • Заменить несколько значений на одно
    • С помощью функции «ПОДСТАВИТЬ»
    • С помощью регулярных выражений
  • Массовая замена в !SEMTools
    • Пример: замена символов по вхождению
    • Пример: замена списка слов на другой список слов

Процедура поиска и замены данных — одна из самых востребованных в Excel. Базовая процедура позволяет заменить за один заход только одно значение, но зато множеством способов. Рассмотрим, как эффективно работать с ней.

Горячие клавиши

Сочетания клавиш ниже заметно ускорят работу с инструментом:

  • Для запуска диалогового окна поиска — Ctrl + F.
  • Для запуска окна поиска и замены — Ctrl + H.
  • Для выделения всех найденных ячеек (после нажатия кнопки «найти всё») — Ctrl + A.
  • Для очистки всех найденных ячеек — Ctrl + Delete.
  • Для ввода одних и тех же данных во все найденные ячейки — Ввод текста, Ctrl + Enter.

Смотрите gif-пример: здесь я произвожу поиск ячеек с дальнейшим их редактированием. В отличие от замены, редактирование найденных ячеек позволяет быстро менять их содержимое целиком.

Находим все пустые ячейки в диапазоне и заполняем их нулями или одним значением с помощью горячих клавиш

Процедура «Найти и заменить» не работает

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

Не удалось ничего найти по вашему запросу

или при замене:

Мы не нашли ничего, что нужно было заменить

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

Статус опций “Учитывать регистр” и “Ячейка целиком” виден после нажатия кнопки “Параметры”.

Подстановочные знаки, или как найти “звёздочку”

Сухая официальная справка по Excel сообщает:

— что можно использовать подстановочные символы “*” и “?”;
— что “*” и “?” означают несколько символов, включая их отсутствие, и один любой символ;
— что их можно использовать для соответствующих процедур поиска.

Чего не говорит справка, так это того, что в комбинации с опцией “ячейка целиком” эти символы позволяют, не прибегая к помощи расширенного фильтра и процедуры поиска группы ячеек:

  • находить ячейки, заканчивающиеся на определенный символ, слово или текст,
  • находить ячейки, начинающиеся с определенного символа, слова или текста,
  • находить непустые ячейки.

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

В примере ниже мы находим все двузначные числа, затем числа, заканчивающиеся и начинающиеся на 7, и, наконец, все непустые ячейки. Напомню, выделить все результаты поиска помогает горячее сочетание клавиш Ctrl + A.

Так а как найти звёздочку?

Действительно, забыл. Чтобы найти «звёздочку», нужно в окошке поиска ставить перед ней знак ~ (тильда), он находится обычно под клавишей Esc. Это позволяет экранировать “звездочку”, как и вопросительный знак, и не воспринимать их как служебные символы.

Замена нескольких значений на несколько

Массовая замена в Excel — довольно частая потребность. Очень часто нужно массово и при этом быстро заменить несколько символов, слов и т.д. на другие. При этом на текущий момент простого инструмента в стандартном функционале Excel нет.

Тем не менее, если очень нужно, любую задачу можно решить. В зависимости от того, на что вы хотите заменить, могут помочь комбинации функций, регулярные выражения, а в самых сложных случаях — надстройка !SEMTools.

Эта задача более сложная, чем замена на одно значение. Как ни странно, функция «ЗАМЕНИТЬ» здесь не подходит — она требует явного указания позиции заменяемого текста. Зато может помочь функция «ПОДСТАВИТЬ».

Массовая замена с помощью функции “ПОДСТАВИТЬ”

Используя несколько условий в сложной формуле, можно производить одновременную замену нескольких значений. Excel позволяет использовать до 64 уровней вложенности — свобода действий высока. Например, вот так можно перевести кириллицу в латиницу:

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

Но у решения есть и свои недостатки:

  • Функция ПОДСТАВИТЬ регистрозависимая, что заставляет при замене одного символа использовать два его варианта — в верхнем и нижнем регистрах. Хотя в некоторых случаях, как, например, на картинке выше, это и преимущество.
  • Максимум 64 замены — хоть и много, но все же ограничение.
  • Формально процедура замены таким способом будет происходить массово и моментально, однако длительность написания таких формул сводит на нет это преимущество. За исключением случаев, когда они будут использоваться многократно.

Файл-шаблон с формулой множественной замены

Вместо явного прописывания заменяемых паттернов в формуле существует вариант использовать внутри нее ссылки на ячейки, значения в которых можно прописывать на свое усмотрение. Это сократит время, так как не требует редактирования сложной формулы.

Файл доступен по ссылке, но можно и не скачивать его, а просто скопировать текст формулы ниже и вставить ее в любую ячейку, кроме диапазона A1:B64. Формула заменяет в ячейке C1 значения в столбце A стоящими напротив в столбце B.

функция для замены нескольких букв
Формула в файле-шаблоне для множественной замены на примере транслитерации

А вот и она сама (тройной клик по любой части текста = выделить всю формулу): обращается к ячейке D1, делая 64 замены по правилам, указанным в ячейках A1-B64. При этом в столбцах можно удалять значения — это не нарушит её работу.

=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(D1;$A$1;$B$1);$A$2;$B$2);$A$3;$B$3);$A$4;$B$4);$A$5;$B$5);$A$6;$B$6);$A$7;$B$7);$A$8;$B$8);$A$9;$B$9);$A$10;$B$10);$A$11;$B$11);$A$12;$B$12);$A$13;$B$13);$A$14;$B$14);$A$15;$B$15);$A$16;$B$16);$A$17;$B$17);$A$18;$B$18);$A$19;$B$19);$A$20;$B$20);$A$21;$B$21);$A$22;$B$22);$A$23;$B$23);$A$24;$B$24);$A$25;$B$25);$A$26;$B$26);$A$27;$B$27);$A$28;$B$28);$A$29;$B$29);$A$30;$B$30);$A$31;$B$31);$A$32;$B$32);$A$33;$B$33);$A$34;$B$34);$A$35;$B$35);$A$36;$B$36);$A$37;$B$37);$A$38;$B$38);$A$39;$B$39);$A$40;$B$40);$A$41;$B$41);$A$42;$B$42);$A$43;$B$43);$A$44;$B$44);$A$45;$B$45);$A$46;$B$46);$A$47;$B$47);$A$48;$B$48);$A$49;$B$49);$A$50;$B$50);$A$51;$B$51);$A$52;$B$52);$A$53;$B$53);$A$54;$B$54);$A$55;$B$55);$A$56;$B$56);$A$57;$B$57);$A$58;$B$58);$A$59;$B$59);$A$60;$B$60);$A$61;$B$61);$A$62;$B$62);$A$63;$B$63);$A$64;$B$64)

Заменить несколько значений на одно

С помощью функции «ПОДСТАВИТЬ»

При замене нескольких значений на одно и то же механика работы формул на основе нескольких уровней вложенности не будет отличаться от замены нескольких на несколько. Просто третий аргумент (на что заменить) на всех уровнях вложенности будет один и тот же. Кстати, если оставить его пустым (кавычки без символов между ними), то это позволит удалить определенные символы. Пример: удалить цифры из ячейки путем замены на пустоту:

=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"1";"");"2";"");"3";"");"4";"");"5";"");"6";"");"7";"");"8";"");"9";"");"0";"")

С помощью регулярных выражений

Важно: регулярные выражения не поставляются в Excel “из коробки”, но формулы ниже доступны бесплатно, если установить надстройку !SEMTools.

Регулярные выражения (RegEx, регулярки) — наиболее удобное решение, когда нужно заменить несколько символов на один. Все эти несколько символов обычным способом безо всяких разделителей нужно перечислить внутри квадратных скобок. Примеры формул:

=regexreplace(A1;"d";"#")
=regexreplace(A1;"w";"#")
=regexreplace(A1;"а-яА-Я";"#")
=regexreplace(A1;"s";"_")

Первая заменяет на символ “#” все цифры, вторая — все английские буквы, а третья — все кириллические символы в верхнем и нижнем регистре. Четвёртая заменяет любые пробелы, в том числе табуляцию и переносы строк, на нижнее подчеркивание.

замена регулярными выражениями
Массовая замена символов регулярными выражениями при установленной надстройке !SEMTools

Если же нужно заменять не символы, а несколько значений, состоящих в свою очередь из нескольких букв, цифр или знаков, синтаксис предполагает уже использование круглых скобок и вертикальной черты “|” в качестве разделителя.

Массовая замена в !SEMTools

Надстройка для Excel !SEMTools позволяет в пару кликов производить замены на всех уровнях:

  • символов и их сочетаний,
  • паттернов регулярных выражений,
  • слов,
  • целых ячеек (в некоторой степени аналог ВПР).
Массовая замена в Excel с !SEMTools
Меню инструментов массовой замены в !SEMTools

При этом процедуры изменяют исходный диапазон, что экономит время. Все что нужно —предварительно выделить его, определиться с задачей, вызвать нужную процедуру и выделить два столбца сопоставления заменяемых и замещающих значений (предполагается, что если вы знаете, что на что менять, то и такие списки есть).

Пример: замена символов по вхождению

Аналог обычной процедуры замены без учета регистра заменяемых символов, по вхождению. С одним отличием: здесь замена массовая и можно выбрать сколько угодно строк с парами «заменяемое-заменяющее» значение.

Ниже пример с единичными символами, но паттерны могут быть какими угодно в зависимости от вашей задачи.

Массовая замена символов по вхождению на примере Leet Language (некоторые английские буквы заменяются на похожие цифры)

Пример: замена списка слов на другой список слов

На этом примере — замена списка слов на другой список, в данном случае на одно и то же слово. Здесь решается задача типизации разнородных фраз путем замены слов, содержащих латиницу и цифры, на одно слово. Далее после этой операции можно будет посчитать уникальные значения в столбце, чтобы выявить наиболее популярные сочетания.

замена списка слов на одно и то же слово
Замена списка слов на другой список в !SEMTools

С версии !SEMTools 9.18.18 появилась опция: при замене списка слов не учитывать пунктуацию в исходных предложениях, а регистр слов теперь сохраняется.

замена списка слов на другой список в Excel

Инструменты находятся в группе макросов «ИЗМЕНИТЬ» в отдельном меню и для удобства продублированы в меню «Изменить символы», «Изменить слова» и «Изменить ячейки».

Скачивайте надстройку !SEMTools и делайте массовую замену символов, слов или целых списков в Excel!


Смотрите также по теме поиска и замены данных в Excel:

  • Найти заглавные/строчные буквы в ячейке;
  • Найти латиницу или кириллицу в тексте;
  • Найти числа в текстовых ячейках;
  • Обнаружить текстовые символы;
  • Функция НАЙТИ в Excel;
  • Функция ПОИСК в Excel;
  • Функция ЗАМЕНИТЬ в Excel;
  • Найти определенные символы в ячейках Excel.

Замена подстроки, содержащейся в текстовых значениях ячеек указанного диапазона, другой подстрокой с помощью метода 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 – поиск полного вхождения искомого текста в содержимое ячейки.

Макрос на Поиск опред.текста и замену на опред.текст

misharin

Дата: Пятница, 07.04.2017, 07:21 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Здравствуйте!

Просьба помочь с макросом для Word на поиск определенных текстов и заменой их на определенный текст. Чтобы в одном макросе забить все неообходимые поиски и замены.

 

Ответить

Pelena

Дата: Пятница, 07.04.2017, 09:07 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
С помощью макрорекодера получилось так. Первый массив «что менять», второй массив «на что менять»
[vba]

Код

Sub Макрос1()
    Dim i&, fnd(), rpl()
    fnd = Array(«первый», «второй», «третий»)
    rpl = Array(«четвертый», «пятый», «шестой»)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    For i = 0 To UBound(fnd)
        With Selection.Find
            .Text = fnd(i)
            .Replacement.Text = rpl(i)
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Next i
End Sub

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 07.04.2017, 09:37 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Спасибо! все вроде работает!

А можно написать отдельными строками что на что менять:

fnd = Array(«первый»)
rpl = Array(«четвертый»)
fnd = Array(«второй»)
rpl = Array(«пятый»)
fnd = Array(«третий»)
rpl = Array(«шестой»)

т.е. поиск слова «первый»
замена на «четверты»
поиск слова «второй»
замена на «пятый»

Будет работать? а то много поисков и замен и одной строкой трудновато писать и контролировать.

Сообщение отредактировал misharinПятница, 07.04.2017, 10:42

 

Ответить

Pelena

Дата: Пятница, 07.04.2017, 11:45 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Не, именно так, как Вы написали, не будет.
Можно записать слова в один массив, чередуя «что меняем» и «на что меняем»
[vba]

Код

Sub Макрос1()
    Dim i&, fnd()
    fnd = Array(«первый», «четвертый», _
                «второй», «пятый», _
                «третий», «шестой»)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    For i = 0 To UBound(fnd) Step 2
        With Selection.Find
            .Text = fnd(i)
            .Replacement.Text = fnd(i + 1)
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Next i
End Sub

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 07.04.2017, 11:58 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Все супер! Спасибо! Работает. Буду пробовать на конкретном документе.

Еще вопрос эти черточки в конце строк _ обязательны получаются? какова их функция если не секрет?

 

Ответить

Pelena

Дата: Пятница, 07.04.2017, 12:03 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Можно записать всё одной строкой, как в первом примере.
[vba]

Код

fnd = Array(«первый», «четвертый», «второй», «пятый», «третий», «шестой»)

[/vba]
Эти черточки ставятся, если хотим сделать перенос строки (для удобства восприятия)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 07.04.2017, 12:05 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Все понятно. Благодарю!

 

Ответить

misharin

Дата: Вторник, 31.10.2017, 16:14 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый день!
Работаю с макросом

[vba]

Код

Sub Макрос1()
Dim i&, fnd()
fnd = Array(«первый», «четвертый», _
«второй», «пятый», _
«третий», «шестой»)

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
For i = 0 To UBound(fnd) Step 2
With Selection.Find
.Text = fnd(i)
.Replacement.Text = fnd(i + 1)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next i
End Sub

[/vba]

И вот после набора определенного количества строк начало выдавать «too many line continuations». Что это значит?
Количество строк получается ограничено что-ли?

Сообщение отредактировал misharinВторник, 31.10.2017, 16:23

 

Ответить

misharin

Дата: Среда, 01.11.2017, 11:57 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Если быть точнее: строки вставляются, но уже ту самую черточку (как объясняли, которая ставится для переноса строки (для удобства восприятия)) не дает ставить. выводит окошко с надписью «too many line continuations» жмем Ок и черточка пропадает. Пожалуйста, как быть?

 

Ответить

Gustav

Дата: Среда, 01.11.2017, 13:52 |
Сообщение № 10

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

«too many line continuations»

Существует ограничение на кол-во строк продолжения оператора VBA, т.е. на кол-во этих самых «черточек». По памяти, вроде не более 25 строк может занимать такой оператор, соответственно, черточек будет не более 24.

Наберите это «too many line continuations» в Google и он Вам всё расскажет лучше меня.

Ну, как быть… Больше в одной строке размещайте, в строке вроде до 1023 символов можно разместить.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavСреда, 01.11.2017, 14:00

 

Ответить

Gustav

Дата: Среда, 01.11.2017, 14:21 |
Сообщение № 11

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

Наконец, можно код по-другому оформить — не с переносами строк, а с конкатенацией текстовых переменных, после чего итоговую длинную строку с разделителем пропустить через функцию Split:
[vba]

Код

Sub test()
    Dim fnd
    Dim str As String

                    str = str & «первый,второй,третий,четвертый,»
    str = str & «пятый,шестой,седьмой,восьмой»

            fnd = Split(str, «,») ‘= то же самое, что Array(«первый»,»второй»,»третий»,»четвертый»,»пятый»,»шестой»,»седьмой»,»восьмой»)
End Sub

[/vba]


МОИ: Ник, Tip box: 41001663842605

 

Ответить

Pelena

Дата: Среда, 01.11.2017, 14:32 |
Сообщение № 12

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Можно ещё слова в отдельном файле записать по принципу чередования: что заменить — на что заменить. Файл Список слов должен лежать в той же папке, что и файл с макросом

К сообщению приложен файл:

Word.rar
(67.6 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 03.11.2017, 10:53 |
Сообщение № 13

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Pelena, А как сделать, чтобы текст можно было заменять на других документах (по горячей клавише например) при открытом документе с макросом? Ну чтобы не копировать макросы в каждый документ где требуется замена, а взял перекинул документ с макросом и списком в папку с файлами, открыл документ с макросом затем открыл документ где требуется заменять нажал горячие клавиши и готово.

 

Ответить

Pelena

Дата: Пятница, 03.11.2017, 11:08 |
Сообщение № 14

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Сохраните макрос в шаблон Normal.dotm, тогда он будет доступен в любых документах


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 03.11.2017, 11:13 |
Сообщение № 15

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Т.е. через файл не получится? Чтобы даже на другой комп перекинул два файла и можно работать. Просто как то здесь на форуме помогли было с макросом для exel, который работает на любом компе, главное файл макросом открытый был.

 

Ответить

Pelena

Дата: Пятница, 03.11.2017, 11:19 |
Сообщение № 16

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Почему не получится? Получится, только макрос надо дописать :)

Проверяйте

К сообщению приложен файл:

0470246.docm
(62.2 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 03.11.2017, 11:42 |
Сообщение № 17

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Что то не получается на другом документе применить((( ни через горячие клавиши, через макросы вручную тоже не получается запустить, почему то не видит этот файл с макросами

Сообщение отредактировал misharinПятница, 03.11.2017, 12:04

 

Ответить

Pelena

Дата: Пятница, 03.11.2017, 12:16 |
Сообщение № 18

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Открываете файл с макросом из предыдущего сообщения, запускаете макрос, в диалоговом окне выбираете файл для замены слов, проверяете результат


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

misharin

Дата: Пятница, 03.11.2017, 12:52 |
Сообщение № 19

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Все работает)) Спасибо! Осталось только с пробелами чуть поработать. Немного своеобразно идет замена пробелов.

 

Ответить

Мурад

Дата: Пятница, 09.02.2018, 10:24 |
Сообщение № 20

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Добрый день!
Вопрос глупый, но все же) При вставке слов, склонения необходимо самому учитывать?)
Найти-Заменить: «первый», «четвертый», «первого», «четвертого», «первому», «четвертому», «первого», «четвертого», «первым», «четвертым», «первом», «четвертом»
Просто задача усложняется в 6 раз, если нет автоматического способа подбора склонений….

 

Ответить

В ст В так сказать основной признак для сортировки данных за месяц в других столбцах
Предполагается что он будет таким на протяжении всего месяца
Но вдруг какое-то событие — и на определенной неделе признак меняется и становится как в ст D

Прошел месяц

Начался новый

Старый файл сохраняется в архив как есть

На новым период копированием создается новый

И тут надо вернуть значения ст D в соответствие со ст В Т.е. снова предположить что признак от недели к неделе не будет меняться

Добавлено через 1 минуту
Столбцы сопоставлять по строкам
B1 — D1

Добавлено через 4 минуты
Причем предполагается что периодов в месяце 5
Основное значение задается перед первым периодом и в каждом периоде может меняться
Т е приводить в соответствие нужно 4 стобца

Добавлено через 8 минут
Т.е. хотелось бы выбирать столбцы в которых производить замену
Да еще и для каждого листа книги разные столбцы могут быть
(по высоте в том числе)

Добавлено через 12 минут
И еще!!! Изначально во всех «неглавных» столбцах первоначально стоит формула простой прямой ссылки на главный
И с идеале эту же формулу ссылки вернуть нужно после выполнения макроса

Функция найти и заменить, различные результаты с макросом.

Автор interseptor, 02.11.2013, 21:06

« назад — далее »

Пример прикреплен (с макросом))).
Весь лист имеет формат текст (т.к. надо копировать с инета, но не в этом суть)
Необходимо в столбце А заменить точку на запятую. Если это сделать вручную функцией «найти и заменить», то всё работает. А вот если макросом, то нет — нет ни точки, ни запятой.
Почему так? И как изменить макрос, чтобы такого не было???

Кстати, если после точки (котор. заменят на запятую) всего два знака, то макрос работает… ничё не понимаю… памагите  :-


Однако так надо.  ;D

Sub Макрос1()
    Columns("A:A").Select
    Selection.Replace What:=".", Replacement:="."
End Sub

Это все VBA шалит.


Спасибо!!!  sm_clap

никогда бы не догадался, решение работает, хотя ХЗ почему… мож када прозрею  sm_alik
Эксель наука сложная, до конца не изученная  ;D


Для ускорения прозрения.
В VBA из файла попадает ТЕКСТ с точкой.
В VBA десятичный разделитель — точка.
Строка

Selection.Replace What:=".", Replacement:="."
превращает текст в число.
VBA передает это число в Excel, а уже Excel, в соответствии с региональными настройками, заменяет десятичный разделитель точку на запятую.
Как-то так.   :)


Ясно, спасибо за разъяснения, учту.  sm_beer


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Функция найти и заменить, различные результаты с макросом.

  • Excel VBA Найти и заменить

Excel VBA Найти и заменить

Вы когда-нибудь задумывались об автоматизации функции поиска и замены в Excel. В VBA мы можем создать макрос, который можно использовать для поиска и замены всего, что мы обычно делаем в Excel, путем нажатия сочетаний клавиш Ctrl + H. С помощью VBA Find and Replace мы можем автоматизировать поиск любого слова и заменить его другим замещением. Это помогает, когда нам нужно выполнить одно и то же действие несколько раз.

Как найти и заменить слова в Excel VBA?

Ниже приведены различные примеры, чтобы найти и заменить слова в Excel, используя код VBA.

Вы можете скачать этот шаблон VBA для поиска и замены Excel здесь — VBA для поиска и замены шаблона Excel

VBA Find and Replace — пример № 1

В очень простом примере у нас есть набор данных, который состоит из некоторого имени. И некоторые имена повторяются, как показано ниже.

Теперь мы создадим код, по которому мы найдем любое повторяющееся имя и заменим его чем-то другим. Для этого выполните следующие шаги.

Шаг 1: Перейдите в меню « Вставка» в VBA и выберите « Модуль», как показано ниже.

Шаг 2: Как только мы это сделаем, мы откроем новый модуль. В этом модуле напишите подкатегорию от имени VBA Find and Replace, или вы можете выбрать любое имя этой подкатегории.

Код:

 Sub Find_Replace1 () End Sub 

Шаг 3: Поскольку у нас есть данные в столбце B от ячейки B2 до B10, мы сначала выберем этот диапазон из B2: B10.

Код:

 Sub Find_Replace1 () Range ("B2: B10"). Replace End Sub 

Шаг 4: Теперь, чтобы заменить что-то, нам нужно искать это слово. Здесь также мы сначала выберем функцию Replace, чтобы посмотреть, что нам нужно заменить.

Код:

 Sub Find_Replace1 () Range ("B2: B10"). Replace End Sub 

Согласно синтаксису функции Replace, мы найдем то, что нам нужно заменить.

Шаг 5: Давайте выберем имя из списка « Бен » как то, что нам нужно заменить.

Код:

 Sub Find_Replace1 () Range ("B2: B10"). Replace What: = "Ben" End Sub 

Шаг 6: Теперь выберите слово для замены, которым мы должны заменить выбранное слово. Здесь мы решили заменить имя Бен на Сэма, который упоминается как Замена, как показано ниже.

Код:

 Sub Find_Replace1 () Range ("B2: B10"). Replace What: = "Ben", Replacement: = "Sam" End Sub 

Шаг 7: Теперь скомпилируйте код и запустите его, нажав на кнопку Play или нажав клавишу F5, как показано ниже.

Мы увидим, что все ячейки, содержащие имя Бена, теперь заменены именем Сэм . И это также выделено желтым цветом.

VBA Find and Replace — пример № 2

Мы все, возможно, столкнулись с ситуацией, когда мы пытались найти и заменить некоторые слова буквами с учетом регистра. Предположим, в списке, если мы хотим заменить только то слово, которое имеет несколько строчных или прописных букв. И если мы используем процесс, который мы видели в примере 1, то мы в конечном итоге заменим все подобные слова в этом списке вместе с требуемым. Этот процесс не может быть выполнен с помощью функции поиска и замены (Ctrl + H) в Excel. Для этого у нас есть положение в VBA.

Давайте рассмотрим ниже данные для этого. Как мы видим, мы специально добавили слово BEN в верхнем регистре в ячейку B2.

Выполните следующие шаги, чтобы найти и заменить слово BEN.

Шаг 1: Запустите подкатегорию VBA Find and Replace там, как показано ниже.

Код:

 Sub Find_Replace2 () End Sub 

Шаг 2: Выберите список как Диапазон от B2 до B10.

Код:

 Sub Find_Replace2 () Range ("B2: B10") End Sub 

Шаг 3: Теперь выберите точное слово, которое мы хотим заменить. Здесь мы выбрали BEN, который находится в ячейке B2.

Код:

 Sub Find_Replace2 () Range ("B2: B10"). Replace What: = "BEN" End Sub 

Шаг 4: Опять же, мы выбрали то же слово, которое мы видели в примере 1, в качестве замены BEN, чем Сэм .

Код:

 Sub Find_Replace2 () Range ("B2: B10"). Replace What: = "BEN", Replacement: = "Sam" End Sub 

Шаг 5: Теперь для замены точного слова BEN нам нужно использовать MatchCase, если оно становится TRUE, как показано ниже.

Код:

 Sub Find_Replace2 () Range ("B2: B10"). Replace What: = "BEN", Replacement: = "Sam", MatchCase: = True End Sub 

MatchCase поможет нам определить то слово, которое мы хотим заменить точным соответствием. Здесь слово, которое мы выбрали, это BEN в верхнем регистре, а в списке есть и другие подобные слова, но в правильном.

Шаг 6: Теперь запустите код, нажав на кнопку Play или нажав клавишу F5.

Мы увидим, что слово BEN, которое было в ячейке B2, теперь заменено словом « Sam », выделенным желтым цветом. И подобные слова Бен, которые расположены в ячейках B5 и B8 соответственно, все еще остаются неизменными.

Вот как работает точное совпадение.

Шаг 7: Теперь мы удалим добавленный MatchCase из приведенного выше кода и посмотрим, как это будет работать.

Код:

 Sub Find_Replace2 () Range ("B2: B10"). Replace What: = "BEN", Replacement: = "Sam", MatchCase: = True End Sub 

Шаг 8: Снова скомпилируйте и запустите код.

Мы увидим, что код заменил все ячейки, содержащие слово Ben, как показано выше. Это означает, что после удаления MatchCase код будет работать, как мы видели в примере 1.

Плюсы Excel VBA Найти и заменить

  • Основное обучение заключается в том, что мы можем заменить регистрозависимые слова и содержимое ячеек с помощью VBA Find and Replace, как показано в примере-2.
  • Если действие повторяется вручную и несколько раз, то автоматизация будет преимуществом в экономии времени и усилий.
  • Даже если у нас есть огромный набор данных, в котором мы хотим заменить определенные слова, это можно сделать, не нарушая Excel в громоздких файлах.

То, что нужно запомнить

  • Мы можем создать макрос функции Find and Replace с помощью опции Record Macro на вкладке Developer. Это самый простой способ создать макрос, если вы новичок в кодировании.
  • Сохранение файла в формате Macro Enable Excel позволит в будущем использовать код.
  • Мы можем заменить любой вид текста, слова, числа или символа VBA Find and Replace.

Рекомендуемые статьи

Это руководство по VBA Find and Replace. Здесь мы обсудим, как найти и заменить слова в Excel с помощью VBA, а также с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. VBA Break для Loop
  2. ЗАМЕНА Формулы в Excel
  3. Полное руководство VBA Find
  4. НАЙТИ функцию в Excel

Понравилась статья? Поделить с друзьями:
  • Excel макрос поиск в диапазоне
  • Excel макрос подстановка значений
  • Excel макрос по событию
  • Excel макрос по рассылке писем
  • Excel макрос по расписанию