Поиск совпадений в двух списках
Тема сравнения двух списков поднималась уже неоднократно и с разных сторон, но остается одной из самых актуальных везде и всегда. Давайте рассмотрим один из ее аспектов — подсчет количества и вывод совпадающих значений в двух списках. Предположим, что у нас есть два диапазона данных, которые мы хотим сравнить:
Для удобства, можно дать им имена, чтобы потом использовать их в формулах и ссылках. Для этого нужно выделить ячейки с элементами списка и на вкладке Формулы нажать кнопку Менеджер Имен — Создать (Formulas — Name Manager — Create). Также можно превратить таблицы в «умные» с помощью сочетания клавиш Ctrl+T или кнопки Форматировать как таблицу на вкладке Главная (Home — Format as Table).
Подсчет количества совпадений
Для подсчета количества совпадений в двух списках можно использовать следующую элегантную формулу:
В английской версии это будет =SUMPRODUCT(COUNTIF(Список1;Список2))
Давайте разберем ее поподробнее, ибо в ней скрыто пару неочевидных фишек.
Во-первых, функция СЧЁТЕСЛИ (COUNTIF). Обычно она подсчитывает количество искомых значений в диапазоне ячеек и используется в следующей конфигурации:
=СЧЁТЕСЛИ(Где_искать; Что_искать)
Обычно первый аргумент — это диапазон, а второй — ячейка, значение или условие (одно!), совпадения с которым мы ищем в диапазоне. В нашей же формуле второй аргумент — тоже диапазон. На практике это означает, что мы заставляем Excel перебирать по очереди все ячейки из второго списка и подсчитывать количество вхождений каждого из них в первый список. По сути, это равносильно целому столбцу дополнительных вычислений, свернутому в одну формулу:
Во-вторых, функция СУММПРОИЗВ (SUMPRODUCT) здесь выполняет две функции — суммирует вычисленные СЧЁТЕСЛИ совпадения и заодно превращает нашу формулу в формулу массива без необходимости нажимать сочетание клавиш Ctrl+Shift+Enter. Формула массива необходима, чтобы функция СЧЁТЕСЛИ в режиме с двумя аргументами-диапазонами корректно отработала свою задачу.
Вывод списка совпадений формулой массива
Если нужно не просто подсчитать количество совпадений, но и вывести совпадающие элементы отдельным списком, то потребуется не самая простая формула массива:
В английской версии это будет, соответственно:
=INDEX(Список1;MATCH(1;COUNTIF(Список2;Список1)*NOT(COUNTIF($E$1:E1;Список1));0))
Логика работы этой формулы следующая:
- фрагмент СЧЁТЕСЛИ(Список2;Список1), как и в примере до этого, ищет совпадения элементов из первого списка во втором
- фрагмент НЕ(СЧЁТЕСЛИ($E$1:E1;Список1)) проверяет, не найдено ли уже текущее совпадение выше
- и, наконец, связка функций ИНДЕКС и ПОИСКПОЗ извлекает совпадающий элемент
Не забудьте в конце ввода этой формулы нажать сочетание клавиш Ctrl+Shift+Enter, т.к. она должна быть введена как формула массива.
Возникающие на избыточных ячейках ошибки #Н/Д можно дополнительно перехватить и заменить на пробелы или пустые строки «» с помощью функции ЕСЛИОШИБКА (IFERROR).
Вывод списка совпадений с помощью слияния запросов Power Query
На больших таблицах формула массива из предыдущего способа может весьма ощутимо тормозить, поэтому гораздо удобнее будет использовать Power Query. Это бесплатная надстройка от Microsoft, способная загружать в Excel 2010-2013 и трансформировать практически любые данные. Мощь и возможности Power Query так велики, что Microsoft включила все ее функции по умолчанию в Excel начиная с 2016 версии.
Для начала, нам необходимо загрузить наши таблицы в Power Query. Для этого выделим первый список и на вкладке Данные (в Excel 2016) или на вкладке Power Query (если она была установлена как отдельная надстройка в Excel 2010-2013) жмем кнопку Из таблицы/диапазона (From Table):
Excel превратит нашу таблицу в «умную» и даст ей типовое имя Таблица1. После чего данные попадут в редактор запросов Power Query. Никаких преобразований с таблицей нам делать не нужно, поэтому можно смело жать в левом верхнем углу кнопку Закрыть и загрузить — Закрыть и загрузить в… (Close & Load To…) и выбрать в появившемся окне Только создать подключение (Create only connection):
Затем повторяем то же самое со вторым диапазоном.
И, наконец, переходим с выявлению совпадений. Для этого на вкладке Данные или на вкладке Power Query находим команду Получить данные — Объединить запросы — Объединить (Get Data — Merge Queries — Merge):
В открывшемся окне делаем три вещи:
- выбираем наши таблицы из выпадающих списков
- выделяем столбцы, по которым идет сравнение
- выбираем Тип соединения = Внутреннее (Inner Join)
После нажатия на ОК на экране останутся только совпадающие строки:
Ненужный столбец Таблица2 можно правой кнопкой мыши удалить, а заголовок первого столбца переименовать во что-то более понятное (например Совпадения). А затем выгрузить полученную таблицу на лист, используя всё ту же команду Закрыть и загрузить (Close & Load):
Если значения в исходных таблицах в будущем будут изменяться, то необходимо не забыть обновить результирующий список совпадений правой кнопкой мыши или сочетанием клавиш Ctrl+Alt+F5.
Макрос для вывода списка совпадений
Само-собой, для решения задачи поиска совпадений можно воспользоваться и макросом. Для этого нажмите кнопку Visual Basic на вкладке Разработчик (Developer). Если ее не видно, то отобразить ее можно через Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon).
В окне редактора Visual Basic нужно добавить новый пустой модуль через меню Insert — Module и затем скопировать туда код нашего макроса:
Sub Find_Matches_In_Two_Lists() Dim coll As New Collection Dim rng1 As Range, rng2 As Range, rngOut As Range Dim i As Long, j As Long, k As Long Set rng1 = Selection.Areas(1) Set rng2 = Selection.Areas(2) Set rngOut = Application.InputBox(Prompt:="Выделите ячейку, начиная с которой нужно вывести совпадения", Type:=8) 'загружаем первый диапазон в коллекцию For i = 1 To rng1.Cells.Count coll.Add rng1.Cells(i), CStr(rng1.Cells(i)) Next i 'проверяем вхождение элементов второго диапазона в коллекцию k = 0 On Error Resume Next For j = 1 To rng2.Cells.Count Err.Clear elem = coll.Item(CStr(rng2.Cells(j))) If CLng(Err.Number) = 0 Then 'если найдено совпадение, то выводим со сдвигом вниз rngOut.Offset(k, 0) = rng2.Cells(j) k = k + 1 End If Next j End Sub
Воспользоваться добавленным макросом очень просто. Выделите, удерживая клавишу Ctrl, оба диапазона и запустите макрос кнопкой Макросы на вкладке Разработчик (Developer) или сочетанием клавиш Alt+F8. Макрос попросит указать ячейку, начиная с которой нужно вывести список совпадений и после нажатия на ОК сделает всю работу:
Более совершенный макрос подобного типа есть, кстати, в моей надстройке PLEX для Microsoft Excel.
Ссылки по теме
- Поиск различий в двух списках Excel
- Слияние двух списков без дубликатов (3 способа)
- Что такое макросы, как их использовать, куда копировать код макросов на Visual Basic
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Office для бизнеса Excel 2010 Excel 2007 Еще…Меньше
Чтобы сравнить данные в двух столбцах Microsoft Excel и найти повторяющиеся записи, воспользуйтесь следующими способами.
Способ 1. Использование формулы на этом этапе
-
Начните Excel.
-
На новом примере введите следующие данные (оставьте столбец B пустым):
A
B
C
1
1
3
2
2
5
3
3
8
4
4
2
5
5
0
-
Введите в ячейку B1 следующую
формулу:=IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),»»,A1)
-
Выберем ячейку С1 по B5.
-
В Excel 2007 и более поздних версиях Excel выберите Заполнить в группе Редактирование, а затем выберите Вниз.
Повторяющиеся числа отображаются в столбце B, как в следующем примере:
A
B
C
1
1
3
2
2
2
5
3
3
3
8
4
4
2
5
5
5
0
Способ 2. Использование макроса Visual Basic макроса
Предупреждение: Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации без гарантии, выраженной или подразумеваемой. Это относится и не только к подразумеваемой гарантии пригодности и пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который демонстрируется, и средствами, используемыми для создания и от debug procedures. Инженеры службы поддержки Майкрософт могут объяснить функциональные возможности конкретной процедуры. Однако они не будут изменять эти примеры, чтобы обеспечить дополнительные функциональные возможности или процедуры по построению в необходимом порядке.
Чтобы использовать макрос Visual Basic для сравнения данных в двух столбцах, с помощью следующих действий:
-
Запустите Excel.
-
Нажмите ALT+F11, чтобы запустить Visual Basic редактора.
-
В меню Вставка выберите Модуль.
-
Введите следующий код на листе модуля:
Sub Find_Matches() Dim CompareRange As Variant, x As Variant, y As Variant ' Set CompareRange equal to the range to which you will ' compare the selection. Set CompareRange = Range("C1:C5") ' NOTE: If the compare range is located on another workbook ' or worksheet, use the following syntax. ' Set CompareRange = Workbooks("Book2"). _ ' Worksheets("Sheet2").Range("C1:C5") ' ' Loop through each cell in the selection and compare it to ' each cell in CompareRange. For Each x In Selection For Each y In CompareRange If x = y Then x.Offset(0, 1) = x Next y Next x End Sub
-
Нажмите ALT+F11, чтобы вернуться к Excel.
-
Введите в качестве примера следующие данные (оставьте столбец B пустым):
A
B
C
1
1
3
2
2
5
3
3
8
4
4
2
5
5
0
-
-
Выберем ячейку от A1 до A5.
-
В Excel 2007 и более поздних версиях Excel выберите вкладку Разработчик, а затем в группе Код выберите макрос.
Примечание: Если вкладка Разработчик не отключается, возможно, ее нужно включить. Для этого выберите Файл > параметры > настроитьленту , а затем выберите вкладку Разработчик в поле настройки справа.
-
Щелкните Find_Matches, а затем нажмите кнопку Выполнить.
Повторяющиеся числа отображаются в столбце B. Совпадающие числа будут поместиться рядом с первым столбцом, как показано ниже.
A
B
C
1
1
3
2
2
2
5
3
3
3
8
4
4
2
5
5
5
0
Нужна дополнительная помощь?
Silvester 1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
||||||
1 |
||||||
Excel Макрос: Поиск совпадений, перенос совпавшей ячейки и рядом с ней стоящей ячейки21.11.2019, 08:10. Показов 9702. Ответов 17 Метки нет (Все метки)
Доброго времени суток ! Прошу помощи с написанием макроса, очень очень очень выручите! я уже нашел примерно подходящий макрос в интернете но его нужно допилить до конца но я к сожалению не владею такими знаниями.
Файл прилагаю с книгой для работы. Заранее огромное спасибо!!! Вложения
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
21.11.2019, 08:10 |
Ответы с готовыми решениями: Откорректировать макрос так, чтобы поиск осуществлялся не с ячейки А1, а с ячейки C21 Sub… Макрос для копирования ячейки и перенос ее по условию Макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В Я написал макрос, который увеличивает значение ячейки А на 1 при изменении ячейки… Редактирование ячейки и перенос значения ячейки через форму 17 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
21.11.2019, 10:44 |
2 |
Silvester, Это ваш финальный файл?
0 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
21.11.2019, 11:04 [ТС] |
3 |
Добрый день! Над финальным файлом я еще работаю! он будет делаться долго и поэтому я щас набросал как примерно все будет, В книге, в листе «Совпавшие» расположение данных могут меняться, тоесть 3 столбца с названиями «ячейка слева,ячейка справа совпавшие» будут не измены но вот их расположение будет меняться( тоесть сейчас они стоят на 2й строке B,C,D , а могут стоять в 5строке E,F,G) В книге, в листе «Совпавшие» расположение данных меняться не будет! все будет так как есть, только со временем я буду добавлять в список новые значения! и еще вопрос но если и так можно сделать то это будет просто ЧУДО! Те данные которые попадут в лист Совпавшие в столбец совпавшие к ним можно будет скопировать примечание с листа База? Извиняюсь если что то непонятно заранее ! могу разьяснить более подробно если возникнут вопросы.. Заранее спасибо большое!!!!
0 |
Narimanych 2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
||||
21.11.2019, 11:12 |
4 |
|||
Silvester, Кликните здесь для просмотра всего текста
2 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
21.11.2019, 13:25 [ТС] |
5 |
Работает!!)))) Спасибо большое, только одно пару вопросов Спасибо огромное, очень выручаете и если это возможно то рассмотрите возможность воплощения и этого «и еще вопрос но если и так можно сделать то это будет просто ЧУДО! Те данные которые попадут в лист Совпавшие в столбец совпавшие к ним можно будет скопировать примечание с листа База? Заранее спасибо! Добавлено через 3 минуты Добавлено через 3 минуты Добавлено через 1 час 2 минуты Необходимо чтобы он с листа БАЗА, столбца БАЗА1 сравнивал с листом временный и если есть совпадения то копировал в лист совпавшие в столбцы совпавшие1(также 3 ячейки) и точно также для каждого столбца в листе база и отмечал найденные совпадения в листе временный каким нибудь цветом и с листа база примечания совпавших ячеек Еще раз извиняюсь за свой косяк! больше изменений не будет
0 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
21.11.2019, 13:26 [ТС] |
6 |
Сам файл
0 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
21.11.2019, 14:06 |
7 |
Silvester, Silvester, В файле поменял только названия листов на A, B,& C . Нажимаете на кнопку на листе А и ждете…
1 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
21.11.2019, 14:18 |
8 |
Silvester,
и с листа база примечания совпавших ячеек Для больших объемов будет медленней работать.
1 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
21.11.2019, 17:03 [ТС] |
9 |
Спасибо большое! Все прекрасно работает ! ВЫ просто гений!!!!!!! Напишите пожалуйста что мне нужно добавить в макрос если в листе С появится еще один столбец и по нему надо будет делать сверку ? И напишите пожалуйста примерно где что примерно значит, в крации(меня больше интересует как выбирать чтобы он начал вставлять не с 3й строчи а с пятой например) ЕЩЕ РАЗ СПАСИБО ВАМ ОГРОМНОЕ,ВЫ МЕНЯ ОЧЕНЬ СИЛЬНО ВЫРУЧИЛИ!!!!!
0 |
Narimanych 2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
||||||||
21.11.2019, 17:57 |
10 |
|||||||
Silvester,
Напишите пожалуйста что мне нужно добавить в макрос если в листе С появится еще один столбец и по нему надо будет делать сверку ? Замените ваш код на этот .. Кликните здесь для просмотра всего текста
При добавке столбца в лист С необходимо 2) Задать какую- нибудь переменную «U» и присвоить ей значение по аналогии : 3) добавить в код еще oдин блок:
0 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
22.11.2019, 15:13 [ТС] |
11 |
Доброго времени суток! не работает формула хотя все проставил как нужно! вылазит ошибка «Next without For»
0 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
22.11.2019, 17:01 |
12 |
Доброго времени суток! не работает формула хотя все проставил как нужно! вылазит ошибка «Next without For» После 10й строки End if
0 |
Silvester 1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
||||
22.11.2019, 17:29 [ТС] |
13 |
|||
Вставил! все заработало без ошибок но все равно не ищет ! см файл во вложении
1 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
22.11.2019, 17:32 [ТС] |
14 |
см файл
0 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
22.11.2019, 18:06 |
15 |
Silvester,
0 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
23.11.2019, 10:04 [ТС] |
16 |
Доброе утро! почему то не выходит у меня добавить еще один столбец (6 например и потом надо будет еще много добавлять) и выделяет желтым то что не нужно! По итогу я допилил конечный файл так как он будет выглядить в жизни(см во вложении) Принцип тот же: И если можно то также сделать кнопку в листе СHECK
0 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
23.11.2019, 13:48 |
17 |
Silvester, Исходя из посланного материала , считаю, что вы сами можете доделать. СМ. детали разъяснения в пункте 2… Удачи.
0 |
1 / 1 / 0 Регистрация: 25.03.2015 Сообщений: 10 |
|
23.11.2019, 14:42 [ТС] |
18 |
Да знаю что сам могу сделать но почему макрос неправильно выделяет желтым цветом даже в том крайне высланом вами файле?
0 |
Based on Ahmed’s answer, after some cleaning up and generalization, including the other «Find» parameters, so we can use this function in any situation:
'Uses Range.Find to get a range of all find results within a worksheet
' Same as Find All from search dialog box
'
Function FindAll(rng As Range, What As Variant, Optional LookIn As XlFindLookIn = xlValues, Optional LookAt As XlLookAt = xlWhole, Optional SearchOrder As XlSearchOrder = xlByColumns, Optional SearchDirection As XlSearchDirection = xlNext, Optional MatchCase As Boolean = False, Optional MatchByte As Boolean = False, Optional SearchFormat As Boolean = False) As Range
Dim SearchResult As Range
Dim firstMatch As String
With rng
Set SearchResult = .Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
If Not SearchResult Is Nothing Then
firstMatch = SearchResult.Address
Do
If FindAll Is Nothing Then
Set FindAll = SearchResult
Else
Set FindAll = Union(FindAll, SearchResult)
End If
Set SearchResult = .FindNext(SearchResult)
Loop While Not SearchResult Is Nothing And SearchResult.Address <> firstMatch
End If
End With
End Function
Usage is the same as native .Find, but here is a usage example as requested:
Sub test()
Dim SearchRange As Range, SearchResults As Range, rng As Range
Set SearchRange = MyWorksheet.UsedRange
Set SearchResults = FindAll(SearchRange, "Search this")
If SearchResults Is Nothing Then
'No match found
Else
For Each rng In SearchResults
'Loop for each match
Next
End If
End Sub
Метод 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:
|
LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
MatchCase | Определяет учет регистра:
|
MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments
и MsgBox xlNotes
.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Простые примеры
При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:
- Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
- Если поисковая фраза в заданном диапазоне найдена не будет, метод 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 |
Несмотря на то, что в ячейке дата отображается в виде текста, ее значение хранится в ячейке в виде числа. Поэтому текстовый формат необходимо перед поиском преобразовать в формат даты.