Excel макрос для поиска совпадений

0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 5

1

Макрос поиска совпадений в тексте

10.12.2015, 10:45. Показов 16009. Ответов 8


Студворк — интернет-сервис помощи студентам

Всем доброго времени суток!
Пишу с просьбой помочь написать макрос для поиска совпадений в ячейках из списка.
Пример во вложении.
Нужно, чтобы макрос проверял ячейку А1 на литсе 1, искал совпадений из списка на листе 2 и в ячейку B1 листа 1 вставлял значения ячейки B1 листа 2.
Есть еще пару нюансов, т.к. файл будет вестись в течении года, возможно ли сделать так, чтобы макрос выполнялся не по нажатию кнопок каких-либо, а постоянно?
Я представляю сколько он в таком случае будет думать, т.к. к к концу года там накапливается порядка 5-6 тысяч строк, в связи с этим возникает еще один вопрос, возможно ли сделать так: после того как мы внесли значение A1 на листе 1, и макрос проставил нужное значение в B1, то в следующий раз при открытии файла, он больше не трогал ячейку А1, и начинал выполняться только когда допустим в A2 мы внесли значение и так далее. Так сказать разовая процедура…
Заранее большое спасибо!



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

10.12.2015, 10:45

8

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

10.12.2015, 11:24

2

данные в столбец А будут вноситься по одному или может быть вставка в несколько ячеек?



0



0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 5

10.12.2015, 11:27

 [ТС]

3

И так и так, то есть сегодня допустим мне надо будет забить 3 строки с ячейками А1, А2, А3, а завтра только одну А4, и так далее.



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

10.12.2015, 11:39

4

Лучший ответ Сообщение было отмечено Makuberu как решение

Решение

в модуль листа, проверяйте.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arr(), i%
Application.EnableEvents = False
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
arr = Sheets("Лист2").Range("A1:B100").Value
For i = 1 To UBound(arr)
 If Target.Value Like "*" & arr(i, 1) & "*" Then Target.Offset(0, 1).Value = arr(i, 2): Exit For
Next
Application.EnableEvents = True
End Sub



1



0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 5

10.12.2015, 12:02

 [ТС]

5

Вроде работает, спасибо большое.
А можете подсказать еще, чтобы поменять столбцы (которые мы проверяем и куда вставляем значение) какие значения поменять нужно? Я просто совсем не бум бум в программировании =)
И еще вопрос, этот макрос чувствителен к регистру?



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,928

10.12.2015, 13:21

6

Лучший ответ Сообщение было отмечено Makuberu как решение

Решение

Цитата
Сообщение от Makuberu
Посмотреть сообщение

макрос чувствителен к регистру?

Да. Добавил в код описание и не чувствительность к регистру.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arr(), i%
Application.EnableEvents = False 'отключает слежение за событиями
If Target.Count > 1 Then Exit Sub 'если изменено больше 1 ячейки то выход из кода
If Target.Column <> 1 Then Exit Sub 'если измененная ячейка в первом столбце то
arr = Sheets("Лист2").Range("A1:B100").Value 'заносим данные из диапазона A1:B100 листа2 в двумерный массив
For i = 1 To UBound(arr) 'цикл от 1 до 100 (100 размерность массива)
' если в тексте содержится текст из итого значения массива то в ячейку правее на 1 от измененной вносит значение
' итого массива второго столбца
 If UCase(Target.Value) Like "*" & UCase(arr(i, 1)) & "*" Then Target.Offset(0, 1).Value = arr(i, 2): Exit For
Next
Application.EnableEvents = True 'включаем слежение за событиями
End Sub



1



0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 5

10.12.2015, 14:08

 [ТС]

7

Спасибо большое! получилось приспособить к своему файлу!!



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

10.12.2015, 14:17

8

Ускоренная обработка нецелевых диапазонов, обработка изменения множества ячеек, константы столбцов.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim arr(), LastRow&, i&, MaxCol&, Ra As Range, C As Range
    Const ColProverki = 1 ' № столбца,  предложения в котором проверяются на Листе1
    Const ColVstavki = 2 ' № столбца статьи, который вставляется после проверки на Листе1
    Const ColObor = 1 ' № столбца оборудования на Листе2
    Const ColSt = 2 ' № столбца статьи на Листе2
    Set Ra = Me.Columns(ColProverki)
    Set Ra = Intersect(Ra, Target)
    If Not (Ra Is Nothing) Then
        Application.EnableEvents = False 'отключает слежение за событиями
        MaxCol = IIf(ColSt > ColObor, ColSt, ColObor)
        With Sheets("Лист2")
            LastRow = .UsedRange.Rows.Count
            arr() = .Range(.Cells(1, 1), .Cells(LastRow, MaxCol)).Value
        End With
        For Each C In Ra.Cells
            C.Offset(0, ColVstavki - ColProverki).ClearContents
            For i = 1 To UBound(arr)
                ' если в тексте содержится текст из итого значения массива то в ячейку правее на 1 от измененной вносит значение
                ' итого массива второго столбца
                If InStr(1, C.Value, arr(i, ColObor), vbTextCompare) > 0 Then
                    C.Offset(0, ColVstavki - ColProverki).Value = arr(i, ColSt)
                    Exit For
                End If
            Next i
        Next C
        Application.EnableEvents = True 'включаем слежение за событиями
    End If
End Sub



1



vbYesNo

2 / 2 / 0

Регистрация: 24.02.2017

Сообщений: 40

09.06.2019, 01:47

9

Добрый день!
А можете подсказать, как переделать этот код, чтобы можно было осуществлять замену полноформатного значения (к примеру «Покупка Voice-информатор») на сокращённое «Voice» из массива на другом листе. При этом у меня столбцы поменялись местами и мне не нужно выводить номер статьи с другого листа, а нужен вывод сокращ. значения… Пробовал в коде поменять значения столбцов:

Visual Basic
1
2
3
4
Const ColProverki = 2 ' № столбца,  предложения в котором проверяются на Листе1
    Const ColVstavki = 1 ' № столбца статьи, который вставляется после проверки на Листе1
    Const ColObor = 2 ' № столбца оборудования на Листе5
    Const ColSt = 2 ' № столбца статьи на Листе5

— не получилось…
Файл с примером и кодом (с моей правкой) прикладываю…
Благодарю за помощь!!

Вложения

Тип файла: rar Пример2.rar (15.0 Кб, 32 просмотров)



0



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

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

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

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

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, если поисковая фраза не найдена.

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

Set myCell = Range(«A1:L30»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

MsgBox «Строка найденной ячейки: « & myCell.Row

MsgBox «Столбец найденной ячейки: « & myCell.Column

MsgBox «Адрес найденной ячейки: « & myCell.Address

Else

MsgBox «Искомая фраза не найдена»

End If

End Sub

В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан". Затем проводим поиск этой фразы в диапазоне "A1:L30" с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.

Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30" есть ячейка со строкой, содержащей подстроку "стакан", и когда такой ячейки нет.

Пример 2

Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

Set myCell = Rows(1).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

Else: MsgBox «Искомая фраза не найдена»

End If

End Sub

Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15, и 129526,15, и 526,15254. То есть, как и в предыдущем примере, поиск идет по подстроке.

Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:

Set myCell = Rows(1).Find(myPhrase, , , xlWhole)

Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.

Пример 3

Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

Set myCell = Range(«A:A»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Номер начальной строки: « & myCell.Row

Else: MsgBox «Даты « & myPhrase & » в таблице нет»

End If

End Sub

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

Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

Sheets("Данные").Select
For y = 1 To Cells.SpecialCells(xlLastCell).Row
    If Cells(y, 1) = "123" Then
        Exit For
    End If
Next y
MsgBox "Нашел в строке: " + CStr(y)

Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

Sheets("Данные").Select
Set fcell = Columns("A:A").Find("123")
If Not fcell Is Nothing Then
    MsgBox "Нашел в строке: " + CStr(fcell.Row)
End If

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист «Данные»;
2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What — Строка с текстом, который ищем или любой другой тип данных Excel

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

LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).

Примеры поиска функцией Find

Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", LookIn:=xlValues)
  Do While Not c Is Nothing
    c.Value = "qwe"
    Set c = .FindNext(c)
  Loop
End With

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

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .Find("asd", After:=c, lookin:=xlValues)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

lLastRow = Cells.SpecialCells(xlLastCell).Row
lLastCol = Cells.SpecialCells(xlLastCell).Column
Application.FindFormat.Font.Italic = True
With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol))
  Set c = .Find("", SearchFormat:=True)
  Do While Not c Is Nothing
    c.Font.Italic = False
    Set c = .Find("", After:=c, SearchFormat:=True)
  Loop
End With

Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

With Application.FindFormat.Font 
  .Name = "Arial" 
  .FontStyle = "Regular" 
  .Size = 10 
End With

Поиск последней заполненной ячейки с помощью Find

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

Пример 5: Найти последнюю колонку и столбец, заполненные данными

Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious)
If Not c Is Nothing Then
  lLastRow = c.Row: lLastCol = c.Column 
Else
  lLastRow = 1: lLastCol = 1
End If
MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol

В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

Поиск по шаблону (маске)

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

Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

With Worksheets(1).Cells
  Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Color = RGB(255, 0, 0)
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

Для поиска функцией Find по маске (шаблону) можно применять символы:
* — для обозначения любого количества любых символов;
? — для обозначения одного любого символа;
~ — для обозначения символов *, ? и ~. (т.е. чтобы искать в тексте вопросительный знак, нужно написать ~?, чтобы искать именно звездочку (*), нужно написать ~* и наконец, чтобы найти в тексте тильду, необходимо написать ~~)

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

  • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
  • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

d = Date
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

Пример 8: Найти 1 марта 2018 г.

d = #3/1/2018#
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

d = #3/1/1900#
Set c = Cells.Find(Format(d, "m/d/"), LookIn:=xlFormulas, LookAt:=xlPart)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

This is the ultimate Lookup Macro for Excel. It will search every worksheet in the workbook and return all of the matching results to a single worksheet. You do not have to specify a specific lookup_table and the data can be located anywhere on the worksheets and it will still be found and returned with this macro.

Sub Return_Results_Entire_Workbook()

'This does not search the worksheet that will contain the results of the search

' ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' ||||||||||||||||||| ------------ TeachExcel.com -------------- |||||||||||||||||||||||||
' ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'Number for the worksheet that contains the value for which to search
searchValueSheet = "Sheet1"

'Get the value for which we need to search into the macro
searchValue = Sheets(searchValueSheet).Range("A2").Value

'how many columns to the right of any "found" value that you want to use to return the data
returnValueOffset = 1

'The sheet where the results should be placed
outputValueSheet = "Sheet1"

'The column in the sheet where the results should be placed
outputValueCol = 2

'The row in the sheet where the results should be placed
'everything from this row down must be empty!
outputValueRow = 2

'clear the results display area
Sheets(outputValueSheet).Range(Cells(outputValueRow, outputValueCol), Cells(Rows.Count, outputValueCol)).Clear


'count the worksheets in the workbook
wsCount = ActiveWorkbook.Worksheets.Count

'loop through the worksheets in the workbook
For i = 1 To wsCount
    
    'Don't search the sheet with the lookup value or returned values - assumes source data will be on other tabs.
    If i <> Sheets(searchValueSheet).Index And i <> Sheets(outputValueSheet).Index Then
    
        'Perform the search, which is a two-step process below
        Set Rng = Worksheets(i).Cells.Find(What:=searchValue, _
                LookIn:=xlValues, _
                LookAt:=xlWhole, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlNext, _
                MatchCase:=False)
                
        If Not Rng Is Nothing Then
        
            rangeLoopAddress = Rng.Address
            
            Do
                Set Rng = Sheets(i).Cells.FindNext(Rng)
                Sheets(outputValueSheet).Cells(Cells(Rows.Count, outputValueCol).End(xlUp).Row + 1, outputValueCol).Value = Sheets(i).Range(Rng.Address).Offset(0, returnValueOffset).Value
            Loop While Not Rng Is Nothing And Rng.Address <> rangeLoopAddress
            
        End If
    
    End If

Next i


End Sub 

The code above may seem confusing but you really only have to change a few things to get it to work with your data.

You will have to tell the macro which worksheet contains the value you are searching for, where that search value is located, on which worksheet you want to return the data once it is found and where within that worksheet you want to display the data.

First, change the searchValueSheet to the name of the worksheet that contains the value for which you want to search, the searchValue.

The searchValue is the cell reference of the cell that is used to locate the data to return. Change A2 to the reference of the cell that contains the value you are searching for or the cell where you will input that value. Remember, this cell should be located on the searchValueSheet mentioned above.

The returnValueOffset is a very important value. This tells the macro how far to the right to go to find the data that you want to return once a match for the searchValue has been found. Note that the returned data must come from the same row as the data that matches the searchValue.

The outputValueSheet is the name of the worksheet where you want to return the data. Change the name from Sheet1 to whatever you need. This can be the same as the searchValueSheet or different, it doesn’t matter.

The outputValueCol is the column where you want to display the results within the outputValueSheet

The outputValueRow is the first row in which the returned results should be displayed in the outputValueCol on the outputValueSheet.

Anothing important thing to note is that this macro will NOT search through the worksheets that are referenced by the searchValueSheet or the outputValueSheet. This should not usually matter but, if it does, the easiest solution is to create a specific «Search» tab and set the macro to return everything there.

It may seem like a lot to change, but at least I made it easy for you! ;) And, once you set this macro up to work the way you want, it will save you TONS of time.

I hope this helps! :)


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Vlookup Macro to Return All Matching Results from a Sheet in Excel

Macro: This Excel Macro works like a better Vlookup function because it returns ALL of the matchi…

Vlookup to Return All Matching Results

Tutorial:
Here is an Excel formula that will act like a Vlookup that returns every matching result …

Vlookup Macro to Return All Matching Results and Stack them with Previous Results

Macro: This is very similar to the other Vlookup type Macro in that it returns all of the results…

Excel 365 Wildcard Vlookup to Return All Partial Matches

Tutorial: This post is related to the following video:

TeachExcel explained how to perform a Vlooku…

Print Preview Screen Display for The Entire Workbook in Excel

Macro: This free Excel macro allows you to quickly and easily display the print preview windo…

Complete Guide to Printing in Excel Macros — PrintOut Method in Excel

Macro: This free Excel macro illustrates all of the possible parameters and arguments that yo…

How to Install the Macro

  1. Select and copy the text from within the grey box above.
  2. Open the Microsoft Excel file in which you would like the Macro to function.
  3. Press «Alt + F11» — This will open the Visual Basic Editor — Works for all Excel Versions.
     Or For other ways to get there, Click Here.
  4. On the new window that opens up, go to the left side where the vertical pane is located. Locate your Excel file; it will be called VBAProject (YOUR FILE’S NAME HERE) and click this.
  5. If the Macro goes in a Module, Click Here, otherwise continue to Step 8.
  6. If the Macro goes in the Workbook or ThisWorkbook, Click Here, otherwise continue to Step 8.
  7. If the Macro goes in the Worksheet Code, Click Here, otherwise continue to Step 8.
  8. Close the Microsoft Visual Basic Editor window and save the Excel file. When you close the Visual Basic Editor window, the regular Excel window will not close.
  9. You are now ready to run the macro.

Поиск совпадений по списку и вывод сообщения msgbox

Piston

Дата: Вторник, 17.01.2017, 09:21 |
Сообщение № 1

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

Добрый день. Прошу помочь в решении задачи приведенной ниже: Имеется вкладка со списком ФИО «Черный список», а также вкладка с Клиентами юр.лицами у которых есть представители (ген. дир, глав бух и проч. лица) При поиске представителей и совпадении по черному списку необходимо вывести сообщение (любое информационное). Т.к. база достаточна велика то условное форматирование визуально помогает, но не достаточно, поэтому при совпадении дополнительно должно выводиться сообщение. Используя функ с IfEmpty не работает, т.к забита формула (ВПР – поиск совпадений по ФИО). Идеально было бы «своять» макрос чтобы в сообщении указывалось наименование Клиента (+ФИО представителя). По всем совпадениям. Файл во вложении.

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

5300718.xlsm
(12.3 Kb)


Piston

 

Ответить

sboy

Дата: Вторник, 17.01.2017, 12:34 |
Сообщение № 2

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

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

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


Excel 2010

Добрый день.

Используя функ с IfEmpty не работает

попробуйте проверять по значению
[vba]

Код

If cells().Value <>»» then MsgBox

[/vba]


Яндекс: 410016850021169

 

Ответить

Piston

Дата: Вторник, 17.01.2017, 13:12 |
Сообщение № 3

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

я не очень силен в макросах, и попробовал использовать if cells — ругается и не работает.
файл приложил с макросом, посмотрите пжлста

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

3522911.xlsm
(17.7 Kb)


Piston

 

Ответить

Manyasha

Дата: Вторник, 17.01.2017, 13:33 |
Сообщение № 4

Группа: Модераторы

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

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

Piston, опишите задачу более подробно. Когда должен срабатывать макрос, при изменении ячейки? Или по кнопке выводить список тех, кто есть в ЧС?

прочитайте, как правильно состовлять If-Else


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Wasilich

Дата: Вторник, 17.01.2017, 13:35 |
Сообщение № 5

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

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

Сообщений: 1232


Репутация:

326

±

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


2003

Как то все сыро. Что значит:

При поиске представителей

Как и где Вы собираетесь их искать? Не понятны ваши действия.

при совпадении дополнительно должно выводиться сообщение

В какой момент происходит совпадение?

 

Ответить

sboy

Дата: Вторник, 17.01.2017, 13:42 |
Сообщение № 6

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

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

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


Excel 2010

Ваш макрос правильно вот так записать
[vba]

Код

Sub Макрос1()
If Range(«E3»).Value <> «» Then
MsgBox «См. ЧерныйСписок», 48, «ВНИМАНИЕ!!!» ‘Выводим другое сообщение.
End If
End Sub

[/vba]


Яндекс: 410016850021169

 

Ответить

sboy

Дата: Вторник, 17.01.2017, 13:53 |
Сообщение № 7

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

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

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


Excel 2010

Как я понял задачу (вдруг угадал)
Кнопка «Проверка»
[vba]

Код

Sub Макрос1()
txt = «См. ЧерныйСписок» & vbCrLf
ilr = Cells(Rows.Count, 1).End(xlUp).Row
For ic = 3 To 7 Step 2
    For ir = 1 To ilr
        If Cells(ir, ic).Value <> «» Then
        txt = txt & Cells(ir, 1).Value & » » & Cells(ir, ic).Value & vbCrLf
        End If
    Next ir
Next ic
MsgBox txt, 48, «ВНИМАНИЕ!!!»
End Sub

[/vba]

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

3357984.xlsm
(19.8 Kb)


Яндекс: 410016850021169

 

Ответить

anvg

Дата: Вторник, 17.01.2017, 13:59 |
Сообщение № 8

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

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

Сообщений: 581


Репутация:

271

±

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


2016, 365

Доброе время суток.
Параллельное обсуждение. — вдруг помогающие там найдут нечто полезное для понимания ТС :)

 

Ответить

Piston

Дата: Вторник, 17.01.2017, 14:25 |
Сообщение № 9

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

Феерично!!! Все отработало на 5+.
Огромное спасибо.

P.S. Параллельное обсуждение: конечно прошу прощения, но на «Планете» игнор 2дня…


Piston

 

Ответить

Piston

Дата: Вторник, 17.01.2017, 14:29 |
Сообщение № 10

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

Большое и доброе спасибо «sboy»


Piston

 

Ответить

Piston

Дата: Вторник, 17.01.2017, 14:47 |
Сообщение № 11

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

ммм, чуть поторопился.
Если совпадений НЕ найдено, то как вывести сообщение что все ОК, например фразу «Проверка завершена успешно, совпадений не найдено»


Piston

 

Ответить

sboy

Дата: Вторник, 17.01.2017, 15:02 |
Сообщение № 12

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

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

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


Excel 2010

Добавьте доп проверку
[vba]

Код

Sub Макрос1()
check = False
txt = «См. ЧерныйСписок» & vbCrLf
ilr = Cells(Rows.Count, 1).End(xlUp).Row
For ic = 3 To 7 Step 2
    For ir = 1 To ilr
        If Cells(ir, ic).Value <> «» Then
        check = True
        txt = txt & Cells(ir, 1).Value & » » & Cells(ir, ic).Value & vbCrLf
        End If
    Next ir
Next ic
If check Then
MsgBox txt, 48, «ВНИМАНИЕ!!!»
Else
MsgBox «Все ОК»
End If
End Sub

[/vba]


Яндекс: 410016850021169

 

Ответить

Piston

Дата: Вторник, 17.01.2017, 15:14 |
Сообщение № 13

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Excel 2007

Большое спасибо.
Безгранично благодарен.


Piston

 

Ответить

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