Поиск какого-либо значения в ячейках 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
-
1
Learn the following key concepts of the FIND command:
- The syntax of .Find is:
- expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
- Expression (Required): is any valid range Object. So if we take an example then the range would be Range(“A1:A” & lastRow) where lastRow has been DIMensioned as type long and there is a statement: lastRow = oSht.Range(«A» & Rows.Count).End(xlUp).Row (or something similar) preceding its use in the .Find required expression.
- What (Optional Variant): is the “Search value”
- After (Optional Variant): The cell after which you want the search to begin.
- LookIn (Optional Variant): The type of information. (xlValues or xlFormulas)
- LookAt (Optional Variant): Can be one of the following XlLookAt constants: xlWhole or xlPart.
- SearchOrder (Optional Variant): Can be one of the following #** XlSearchOrder constants: xlByRows or xlByColumns.
- SearchDirection: Can be one of these XlSearchDirection constants. xlNext default xlPrevious
- MatchCase (Optional Variant): True to make the search case sensitive. The default value is False.
- MatchByte (Optional Variant): Used only if you’ve selected or installed double-byte language support. True to have double-byte characters match only double-byte characters. False to have double-byte characters match their single-byte equivalents.
- SearchFormat (Optional Variant): The search format.
- The syntax of .Find is:
-
2
You can adapt the following code to your own uses by copying it (down to where it says #** End Sub) in Advanced Editing and pasting it to a word processor and doing a REPLACE ALL for «#** » (w/o the quotes but with the trailing space please). Then in Excel Preferences, set the Ribbon Developer status to Checked or On so you can work with macros. On the Ribbon, click on Developer, and then the Record icon and just click in cell A1 and then do Stop Recording (of your dummy macro). Click on the Editor icon button and copy your REPLACE(d) ALL text from your word processor from here right over the macro, and save the workbook.
Advertisement
-
3
Open a new Excel workbook. Save the workbook as «Overall Status» and Sheet1 as «Article Views and Other».
-
4
In your browser, go to https://www.wikihow.com/User:Chris-Garthwaite and do (View More) under Articles Started, and select just to the left of the first top one down to just to the right of the bottom one’s Views, and copy it. Make sure you don’t get any excess info, just the articles and number of views. Then paste that data into the «Article Views and Other» worksheet at cell C17. Then, in your browser, go to https://www.wikihow.com/User:Xhohx and copy all 100 expanded (View More) Articles and Views from there too please, and paste those in the cell right below the ones you did before.
-
5
Then. on your toolbar, choose Macros, Macros, and Run the following pasted-in REPLACE(d) ALL macro to test it.
-
- Sub Macro2_FindArticle()
- ‘ Finds an Article String, returns cell address and goes to Article cell
- ‘ Macro2_FindArticle Macro
- Dim oSht As Worksheet
- Dim StrFinder As String
- Dim lastRow As Range
- Dim aCell As Range
- Set oSht = Sheets(«Article Views and Other»)
- Set lastRow = ActiveWorkbook.Sheets(«Article Views and Other»).Range(«C17:C217»)
- Application.ScreenUpdating = True
- Do Until StrFinder <> «»
- StrFinder = Application.InputBox _
- (Prompt:=»Article Name or string to search for: «, _
- Title:=»Article Search», _
- Type:=2)
- Set aCell = lastRow.Find(What:=StrFinder, LookIn:=xlValues, _
- LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
- MatchCase:=False)
- If Not aCell Is Nothing Then
- MsgBox «Value Found in Cell » & aCell.Address
- End If
- aCell.Select
- Application.ScreenUpdating = False
- Exit Sub
- Loop
- End Sub
- You should have a list of articles something like this redacted image, probably without the colored background.
-
-
6
Note that if you were to use Excel’s menu-driven Find command, it would return in the upper left corner (to the left of the formula bar) the cell reference it found, if any, for the string you searched on in the given range of cells, but you would have to hit the right arrow and left arrow (or some such combination) to select the actual cell as the sole ActiveCell I believe. At least, that’s how Excel functions in this author’s experience — not obviously high lighting the cell for me or obviously selecting it, as it used to do in older versions of Excel.
-
7
Note that the underline used at the right end of code lines is to extend the line to the next line down, so the next line is in fact part of the entire sub-procedure or expression.
-
8
You can easily adapt this code by changing the sheet name reference and the cell range reference, and if it’s not an Article you’re searching for, you can certainly change that everywhere as well.
-
9
Here are two more macros that work together to update Related wikiHows:
-
- Sub Macro10()
- ‘ Macro10 Macro
- ‘ Keyboard Shortcut: Option+Cmd+n
- Windows(«OVERALL STATUS.xlsm»).Activate
- Sheets(«Relateds»).Select
- Application.Goto Reference:=»TopRow»
- Application.CutCopyMode = False
- Selection.Delete Shift:=xlUp
- ActiveWorkbook.Names.Add Name:=»TopRow», RefersToR1C1:=»=Relateds!R166″
- Range(«B166»).Select
- Selection.Copy
- Application.Goto Reference:=»Searcher»
- ‘ Searcher is a Defined Name Variable comprised of the Article Names
- ‘ and Views pasted AS TRANSPOSED from rows TO COLUMNS in row 1.
- Macro3_FindRelated
- End Sub
- Sub Macro3_FindRelated()
- ‘ Finds a Related wikiHow String and goes to Article cell,
- ‘ where User then Arrow keys down and inputs a 1,
- ‘ indicating that that Columnar Article is a Related for the Row Article.
- ‘ There are both row totals and columnar totals to keep track of Total Relateds/Article
- ‘ and how many Articles the Columnar Article is a Related for.
- ‘ Uses the Named Variable Range, «Searcher», on the worksheet «Relateds» as a Range Object
- ‘ Macro3_FindRelated Macro
- Dim oSht As Worksheet
- Dim StrFinder As String
- Dim aCell As Range
- Dim rng As Range
- Set oSht = Sheets(«Relateds»)
- Windows(«OVERALL STATUS.xlsm»).Activate
- Sheets(«Relateds»).Select
- Set rng = Worksheets(«Relateds»).Range(«Searcher»)
- Application.ScreenUpdating = True
- Do Until StrFinder <> «»
- StrFinder = Application.InputBox _
- (Prompt:=»Article Name or string to search for: «, _
- Title:=»Article Search», _
- Type:=2)
- Set aCell = rng.Find(What:=StrFinder, LookIn:=xlValues, _
- LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
- MatchCase:=False)
- aCell.Select
- Application.ScreenUpdating = False
- Exit Sub
- Loop
- End Sub
- In cell H1 is xxxxxxxxxxxxxxxxxx and I1 is blank. From J1 to ET1 are the Article Titles and in EU1 is Other — a reconciling account rarely used. From J4 to EW4 are the Article views and their Total. From J6 to ET6 are the Article#s from 141 down to 1 (most recent at far left, oldest at far right). All of that was pasted as Transposed from cell range B10:G153.
- In cell A166 is [xxxxxxxxxxxxxxxxxxx| and that is copied far down below, as it gets deleted with continued usage.
- In cell B166 is the formula =IF(ISERR(MID(A166,D166+2,(E166-D166)-2)),»»,MID(A166,D166+2,(E166-D166)-2)) which returns the value, xxxxxxxxxxxxxxxxxx.
- In cell D166 is the formula =IF(ISERR(FIND(«[«,A166)),»»,FIND(«[«,A166)), which returns the value of 1.
- In cell E166 is the formula =IF(ISERR(FIND(«|»,A166)),»»,FIND(«|»,A166)), which returns 21.
- In cell A9 is the formula =»*[[«&B9&»|How to «&B9&»]]»
- When the formula in A9 is copied to A10, and the Article Name Find the Diagonal of a Square Using Its Area is in B10, A10 returns the value, *[[Find the Diagonal of a Square Using Its Area|How to Find the Diagonal of a Square Using Its Area]]
- Whether copied from the first sheet in the workbook, Article Views and Other, or from this sheet, Relateds, these ready-to-become-Related formatted entries in column A are then pasted, if they’re appropriate How-To’s for the article being updated, to cell B167 and below before the following macro is run and command v pasting is done into the InputBox to locate the Article in the top Searcher area to arrow key down and update the proper row (Article) with a 1 to.
-
Advertisement
Ask a Question
200 characters left
Include your email address to get a message when this question is answered.
Submit
Advertisement
-
The Type:=2 code in the Application.InputBox section means that it is a string. Type 0 is a formula; type 1 is a number; type 4 is a logical value (True or False); type 8 is a cell reference, as a range object; type 16 is an error value, such as #N/A; and type 64 is an array of values.
Thanks for submitting a tip for review!
Advertisement
References
About This Article
Thanks to all authors for creating a page that has been read 51,690 times.
Is this article up to date?
Программы, надстройки и макросы, выполняющие разнообразный поиск в Excel — поиск данных на листе, в книгах, таблицах и т.п.
-
Программа предназначена для сравнения и подстановки значений в таблицах Excel.
Если вам надо сравнить 2 таблицы (по одному столбцу, или по нескольким),
и для совпадающих строк скопировать значения выбранных столбцов из одной таблицы в другую,
надстройка «Lookup» поможет сделать это нажатием одной кнопки.
То же самое можно сделать при помощи формулы =ВПР(), но:формулы…
-
Наверняка, вы сталкивались с ситуацией, когда необходимо производить поиск некоторого значения по всей книге Excel (искать частичное совпадение на всех листах активной книги)
Штатными средствами Excel вывести поле для поиска на панель инструментов не удаётся, а вызывать каждый раз диалоговое окно нажатием комбинации клавиш Ctrl + F не всегда удобно.
На помощь придёт эта… -
Макрос запрашивает строку для поиска, после чего ищет введенный текст в первом столбце листа, и подсвечивает результаты поиска.
При запуске макроса появляется диалоговое окно (InputBox), позволяющее задать текст для поиска.
Макрос подсвечивает красным цветом внутри ячейки текст, совпадающий с искомым
(+ выделяет найденное полужирным начертанием)
Перед началом поиска, цвет всех ячеек… -
В данной статье показаны 2 способа быстрого поиска значений в двумерных массивах.
Поскольку искомое значение может встретиться в нескольких строках обрабатываемого двумерного массива,
оба способа получают на выходе отфильтрованный двумерный массив.Способы формирования отфильтрованных массивов — разные:
первый способ использует функцию ArrAutofilterEx
второй способ — функцию … -
Данный макрос предназначен для поиска адресов электронной почты на листе Excel, с последующим выводом найденных адресов на отдельный лист.
В прикреплённом файле, на первом листе («исходные данные»), ячейки заполнены неструктурированной информацией (смесь фамилий, адресов почты, прочей ненужной информации)
Макрос вычленяет из текста ячеек адреса электронной почты, и выводит все найденные… -
Надстройка SearchText предназначена для поиска заданного текста в книге Excel, с выводом результатов поиска на отдельный лист.
При запуске надстройка формирует панель инструментов, с которой осуществляется запуск всех макросов:В Excel 2007 и 2010 панель инструментов можно найти на вкладке «Надстройки»:
Надстройка SearchText является расширенной версией надстройки для…
-
Программа предназначена для сравнения цен конкурентов из их прайсов с прайс-листом вашей организации.ВНИМАНИЕ: Недавно разработана многофункциональная программа для обработки прайс-листов
Новая программа объединения и обработки прайс-листов доступна на сайте для скачивания и тестирования на различных наборах прайс-листов.
Исходными данными для программы являются:
ваш прайс…
-
База данных «Преподаватели» предназначена для автоматизации работы администрации учебных заведений.Программа обеспечивает выполнение всех необходимых операций по приему документов, поиску и анализу информации, составлению отчетов.
Эта база данных представляюет собой урезанную и немного изменённую версию программы АИСС СПК.
Программа обеспечивает:
Хранение полной…
-
Надстройка SearchExcel предназначена для поиска заданного текста во всех столбцах текущего листа Excel, с выводом результатов поиска на отдельный лист.
При запуске надстройка формирует панель инструментов, с которой осуществляется запуск всех макросов:Надстройка SearchExcel является упрощённой версией надстройки для поиска на всех листах книги Excel
Смотрите также надстройку для… -
Программа АИСС «СПК» предназначена для автоматизации работы приемной комиссии колледжей и техникумов.АИСС обеспечивает выполнение всех необходимых операций по приему документов, поиску и анализу информации, составлению отчетов.
Назначением программы является автоматизация труда работника приёмной комиссии учебного заведения.
Программа обеспечивает:
Хранение полной…
-
Если ваш макрос выдаёт ошибку при использовании метода SpecialCells — возможно, причина в установленной защите листа Excel.
Почему разработчики Microsoft отключили работу этой функции на защищённых листах — не совсем понятно, но мы попробуем обойти это ограничение.
Итак, нам надо получить все заполненные ячейки из некого диапазона листа Excel.
Обычно для этого используется вызов… -
Надстройка предназначена для выполнения множественных замен в выделенном диапазоне ячеек.
После запуска надстройки, появляется панель инструментов из 3 кнопок:
Кнопка «Выполнить все замены» — выполняет замены в выделенном диапазоне ячеек
Кнопка «Изменить список замен» — отображает лист настроек, где в первом столбце находится список заменяемых…
-
Макрос предназначен для поиска текста из выделенных ячеек в поисковой системе Google.Функция поиска доступна из контекстного меню ячеек:
Как вы можете видеть на скриншоте, есть возможность выбора браузера.
На выбор представлены наиболее популярные браузеры: Internet Explorer, Mozilla Firefox, Opera, и Google Chrome.
В макрос намеренно введено ограничение на количество ячеек, текст…
-
Функция производит поиск текстового значения в заданном диапазоне листа,
и возвращает диапазон, содержащий все найденные ячейки
Взято с сайта Чипа Пирсона: cpearson.com/excel/FindAll.aspx
Function FindAll(SearchRange As Range, _
FindWhat As Variant, _
Optional LookIn As XlFindLookIn = xlValues, _
Optional LookAt As XlLookAt = xlWhole, _… -
Система учёта заявок предназначена для автоматизации ввода, редактирования и учёта заданий на заказ запасных частей для автомобилей.Программа позволяет производить поиск по базе данных, и распечатку информации о выбранном заказе.
Эта база данных представляет собой урезанную и немного изменённую версию программы АИСС СПК.
-
Программа предназначена для формирования таблицы Excel для расчёта суммы оплаты за услуги ЖКХ (холодного и горячего водоснабжения)
В качестве исходных данных выступает таблица, в которой занесены показания счётчиков (расход горячей и холодной воды)
Макрос производит поиск клиентов в исходной таблице (по номеру лицевого счёта), и подставляет данные по этому клиенту в итоговую таблицу.
Вы… -
Программа позволяет в процессе ввода новых данных в таблицу Excel отслеживать наличие совпадений с записями из «черного списка», расположенного на отдельном листе.
Особенности данной программы:
поиск частичных совпадений (адреса могут совпадать лишь частично, при сравнении файмилий не учитываются 2 последних буквы, и т.д.)
можно изменить «точность» совпадения — в…
В данном примере написаны исходные коды VBA-макросов для проверки ячеек на наличие выпадающих списков (или любых средств, созданных инструментом «проверка данных»). А также код макроса для проверки и получения доступа к ячейкам, которые содержат условное форматирование.
Макрос поиска ячейки с выпадающим списком
Допустим у нас имеется таблица Excel сформированная в результате экспорта журнала фактур из истории взаиморасчетов с клиентами фирмы, как показано ниже на рисунке:
Нам необходимо найти все выпадающие списки или определить каким ячейкам присвоена проверка вводимых данных, создана инструментом: «ДАННЫЕ»-«Работа с данными»-«Проверка данных».
В программе Excel по умолчанию есть встроенный инструмент для поиска ячеек с проверкой правил вводимых значений. Чтобы его использовать следует выбрать: ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек». В появившемся диалоговом окне следует отметить опцию «проверка данных» и нажать на кнопку ОК.
Но как всегда более гибким решением является написание своего специального макроса. Ведь в такие случаи всегда можно усовершенствовать инструмент и дописать много других полезных функций. А этот код макроса послужит прекрасным началом программы.
Откройте редактор макросов Visual Basic (ALT+F11) и создайте новый модуль выбрав в редакторе инструмент: «Insert»-«Module». В созданный модуль введите VBA код макроса:
Sub ProvDan()
Dim i As Long
Dim diapaz1 As Range
Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
On Error Resume Next
For i = 1 To diapaz1.Count
If IsError(diapaz1(i).Validation.Type) Then
Else
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
On Error GoTo 0
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
diapaz2.Select
MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub
Если нужно выделить все ячейки в таблице, которые содержат проверку вводимых значений включенной инструментом «Проверка данных», тогда выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvDan»-«Выполнить».
В результате выделились 14 ячеек в столбце G, для которых включена проверка данных в стиле выпадающего списка:
В данном коде мы сначала выделяем все ячейки на текущем листе с помощью инструкции:
Cells.Select
После, определяем диапазон ячеек на листе, который использует исходная таблица и с которыми будет работать наш макрос. Чтобы определить диапазон таблицы на рабочем листе Excel, мы могли бы использовать свойство UsedRange при создании экземпляра объекта Range в переменной diapaz1. Данное свойство охватывает только непустые ячейки, а это может быть даже несмежный диапазон. Но таблица может содержать пустые ячейки для, которых присвоена проверка ввода значений. Чтобы наш макрос не игнорировал пустые ячейки внутри таблицы мы определяем смежный (неразрывный) диапазон, который начинается с ячейки A1 и заканчивается последней используемой ячейкой на рабочем листе Excel.
Set diapaz1 = Application.Range(ActiveSheet.Range(«A1»), ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
Последняя ячейка находиться наиболее отдаленно от ячейки A1 (в данном примере – это G15) и была использована на листе (это обязательное условие). При чем использована в прямом смысле, она может даже не содержать значения, но иметь измененный числовой формат, другой цвет фона, другие границы, объединение и т.п. Чтобы найти последнюю используемую ячейку на листе стандартными средствами Excel, выберите инструмент: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».
В появившемся окне следует выбрать опцию «последнюю ячейку». А после просто нажать ОК. Курсор клавиатуры сразу переместиться на последнюю используемую ячейку на рабочем листе Excel.
Можно даже при создании экземпляра объекта Range в переменной diapaz1 использовать диапазон целого листа. Для этого просто замените выше описанную инструкцию на:
Set diapaz1 = Selection
Так на первый взгляд даже проще, но тогда макрос будет проверять все ячейки на листе и потребует больше ресурсов. Особенно если мы при изменении этой инструкции не удалим инструкцию выделения всех ячеек на листе Excel. Таким кодом макроса, можно существенно снизить производительность работы программы Excel при его выполнении. Поэтому так делать не рекомендуется. Проверяйте ячейки только те, которые были использованы на листе. Так вы получите в десятки раз меньший диапазон и выше производительность макроса.
Далее в коде макроса перед циклом прописана инструкция для выключения обработки ошибок, выполняемых в коде.
On Error Resume Next
Но после конца цикла обработка ошибок снова включается.
On Error GoTo 0
Внутри цикла проверяться по отдельности все ячейки на наличие включенной проверки вводимых значений инструментом «Проверка данных». Если ячейка содержит проверку вводимых значений?
If IsError(diapaz1(i).Validation.Type) Then
Тогда она присоединяется к диапазону ячеек, находящихся в переменной diapaz2.
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
В конце кода выделяется несмежный диапазон переменной diapaz2, который включает в себя все выпадающие списки на текущем рабочем листе Excel. И сразу же выводиться сообщение о количестве найденных и выделенных ячеек в этом же диапазоне.
MsgBox «Найдено: » & diapaz2.Count & » ячеек!»
Макрос поиска ячейки с условным форматированием
Некоторые ячейки в исходной таблице содержат условное форматирование, а пользователю Excel необходимо их все найти и выделить. Очень часто нельзя визуально определить присвоено ли ячейке условное форматирование или нет. Чтобы найти и выделить ячейки с условным форматированием в Excel можно воспользоваться встроенным инструментом. Просто необходимо выбрать опцию в меню: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».
В появившемся окне отмечаем опцию «условные форматы» и нажимаем кнопку ОК.
Но если мы хотим получить доступ к каждой выделенной ячейки и проделать с ними какие-либо операции, тогда следует воспользоваться более гибким инструментом. А конкретнее написать макрос. В данном примере мы напишем макрос, который будет автоматически выделять и считать количество ячеек с условным форматированием.
Снова откройте редактор Visual Basic (ALT+F11) и в уже созданный модуль добавьте новый код для нового макроса:
Sub ProvFormat()
Dim i As Long
Dim diapaz1 As Range
Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Count
If diapaz1(i).FormatConditions.Count > 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
diapaz2.Select
MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub
Теперь чтобы проверить, посчитать и выделить все ячейки для которых было применено любое условное форматирование запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvFormat»-«Выполнить».
В результате будут выделены все соответствующие ячейки и отобразиться сообщение с информацией о их количестве:
В этом макросе уже нет необходимости отключать контроль ошибок в процессе выполнения инструкций внутри цикла.
Проверка ячеек на наличие условного форматирования выполняется с помощью свойства Cuont для объекта FormatConditions. Если данное свойство возвращает значение 0, то для текущей ячейки не применялось ни одно условное форматирование.
If diapaz1(i).FormatConditions.Count > 0 Then
Разобравшись и поняв принцип действия этих макросов, пользователь теперь может получать доступ к определенной группе чек и выполнять с ними различные действия. Просто нужно изменить макрос под свои потребности и вместе где прописана инструкция для вывода сообщения о количестве выделенных определенных групп ячеек прописать свои собственные инструкции.
Содержание
- Определение метода Range.Replace
- Синтаксис
- Параметры
- Макрос поиска ячейки с выпадающим списком
- Поиск функцией Find
- Примеры поиска функцией Find
- Поиск даты с помощью Find
- Предназначение и синтаксис метода Range.Find
- Синтаксис метода Range.Find
- Параметры метода Range.Find
- «Найти и заменить» в Excel
- Горячие клавиши
- Процедура «Найти и заменить» не работает
- Подстановочные знаки, или как найти «звездочку»
- Знаки подстановки для поисковой фразы
Определение метода Range.Replace
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.
Макрос поиска ячейки с выпадающим списком
Допустим у нас имеется таблица Excel сформированная в результате экспорта журнала фактур из истории взаиморасчетов с клиентами фирмы, как показано ниже на рисунке:
Нам необходимо найти все выпадающие списки или определить каким ячейкам присвоена проверка вводимых данных, создана инструментом: «ДАННЫЕ»-«Работа с данными»-«Проверка данных».
В программе Excel по умолчанию есть встроенный инструмент для поиска ячеек с проверкой правил вводимых значений. Чтобы его использовать следует выбрать: ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек». В появившемся диалоговом окне следует отметить опцию «проверка данных» и нажать на кнопку ОК. Но как всегда более гибким решением является написание своего специального макроса. Ведь в такие случаи всегда можно усовершенствовать инструмент и дописать много других полезных функций. А этот код макроса послужит прекрасным началом программы.
Откройте редактор макросов Visual Basic (ALT+F11) и создайте новый модуль выбрав в редакторе инструмент: «Insert»-«Module». В созданный модуль введите VBA код макроса:
SubProvDan()
DimiAs Long
Dimdiapaz1AsRange
Dimdiapaz2AsRange
Setdiapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
On Error Resume Next
Fori = 1Todiapaz1.Count
IfIsError(diapaz1(i).Validation.Type)Then
Else
Ifdiapaz2Is Nothing Then
Setdiapaz2 = diapaz1(i)
Else
Setdiapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
On Error GoTo0
Ifdiapaz2Is Nothing Then
MsgBox"Ненайдено ниодной ячейки!"
Else
diapaz2.Select
MsgBox"Найдено: "& diapaz2.Count &" ячеек!"
End If
End Sub
Если нужно выделить все ячейки в таблице, которые содержат проверку вводимых значений включенной инструментом «Проверка данных», тогда выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvDan»-«Выполнить».
В результате выделились 14 ячеек в столбце G, для которых включена проверка данных в стиле выпадающего списка:
В данном коде мы сначала выделяем все ячейки на текущем листе с помощью инструкции:
Cells.Select
После, определяем диапазон ячеек на листе, который использует исходная таблица и с которыми будет работать наш макрос. Чтобы определить диапазон таблицы на рабочем листе Excel, мы могли бы использовать свойство UsedRange при создании экземпляра объекта Range в переменной diapaz1. Данное свойство охватывает только непустые ячейки, а это может быть даже несмежный диапазон. Но таблица может содержать пустые ячейки для, которых присвоена проверка ввода значений. Чтобы наш макрос не игнорировал пустые ячейки внутри таблицы мы определяем смежный (неразрывный) диапазон, который начинается с ячейки A1 и заканчивается последней используемой ячейкой на рабочем листе Excel.
Set diapaz1 = Application.Range(ActiveSheet.Range(“A1”), ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
Последняя ячейка находиться наиболее отдаленно от ячейки A1 (в данном примере – это G15) и была использована на листе (это обязательное условие). При чем использована в прямом смысле, она может даже не содержать значения, но иметь измененный числовой формат, другой цвет фона, другие границы, объединение и т.п. Чтобы найти последнюю используемую ячейку на листе стандартными средствами Excel, выберите инструмент: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».
В появившемся окне следует выбрать опцию «последнюю ячейку». А после просто нажать ОК. Курсор клавиатуры сразу переместиться на последнюю используемую ячейку на рабочем листе Excel.
Можно даже при создании экземпляра объекта Range в переменной diapaz1 использовать диапазон целого листа. Для этого просто замените выше описанную инструкцию на:
Set diapaz1 = Selection
Так на первый взгляд даже проще, но тогда макрос будет проверять все ячейки на листе и потребует больше ресурсов. Особенно если мы при изменении этой инструкции не удалим инструкцию выделения всех ячеек на листе Excel. Таким кодом макроса, можно существенно снизить производительность работы программы Excel при его выполнении. Поэтому так делать не рекомендуется. Проверяйте ячейки только те, которые были использованы на листе. Так вы получите в десятки раз меньший диапазон и выше производительность макроса.
Далее в коде макроса перед циклом прописана инструкция для выключения обработки ошибок, выполняемых в коде.
On Error Resume Next
Но после конца цикла обработка ошибок снова включается.
On Error GoTo 0
Внутри цикла проверяться по отдельности все ячейки на наличие включенной проверки вводимых значений инструментом «Проверка данных». Если ячейка содержит проверку вводимых значений?
If IsError(diapaz1(i).Validation.Type) Then
Тогда она присоединяется к диапазону ячеек, находящихся в переменной diapaz2.
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
В конце кода выделяется несмежный диапазон переменной diapaz2, который включает в себя все выпадающие списки на текущем рабочем листе Excel. И сразу же выводиться сообщение о количестве найденных и выделенных ячеек в этом же диапазоне.
MsgBox “Найдено: ” & diapaz2.Count & ” ячеек!”
Поиск функцией 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 для поиска последней ячейки с заполненными данными. Использованные в Примере 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 по маске (шаблону) можно применять символы:
* – для обозначения любого количества любых символов;
? – для обозначения одного любого символа;
~ – для обозначения символов *, ? и ~. (т.е. чтобы искать в тексте вопросительный знак, нужно написать ~?, чтобы искать именно звездочку (*), нужно написать ~* и наконец, чтобы найти в тексте тильду, необходимо написать ~~)
Поиск даты с помощью 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
Предназначение и синтаксис метода Range.Find
Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.
Синтаксис метода Range.Find
Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) |
Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.
В скобках перечислены параметры метода, среди них только What является обязательным.
Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.
Параметры метода Range.Find
Наименование | Описание |
Обязательный параметр | |
What | Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра – Variant. |
Необязательные параметры | |
After | Ячейка, после которой следует начать поиск. |
LookIn | Уточняет область поиска. Список констант xlFindLookIn:
|
LookAt | Поиск частичного или полного совпадения. Список констант xlLookAt:
|
SearchOrder | Определяет способ поиска. Список констант xlSearchOrder:
|
SearchDirection | Определяет направление поиска. Список констант xlSearchDirection:
|
MatchCase | Определяет учет регистра:
|
MatchByte | Условия поиска при использовании двухбайтовых кодировок:
|
SearchFormat | Формат поиска – используется вместе со свойством Application.FindFormat. |
* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments
и MsgBox xlNotes
.
** Тесты показали неработоспособность метода Range.Find с константой xlFormulas в моей версии VBA Excel.
В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.
Процедура поиска и замены данных — одна из самых востребованных в Excel. Базовая процедура позволяет заменить за один заход только одно значение, но зато множеством способов. Рассмотрим, как эффективно работать с ней.
Горячие клавиши
Сочетания клавиш ниже заметно ускорят работу с инструментом:
- Для запуска диалогового окна поиска — CTRL+F
- Для запуска окна поиска и замены — Ctrl+H
- Для выделения всех найденных ячеек (после нажатия кнопки «найти все» — CTRL+A
- Для очистки всех найденных ячеек — CTRL+Delete
- Для ввода одних и тех же данных во все найденные ячейки — Ввод текста, CTRL+Enter
Смотрите gif-примеры: здесь мы производим поиск ячеек с дальнейшим их редактированием. В отличие от замены, редактирование найденных ячеек позволяет быстро менять их содержимое целиком.
Процедура «Найти и заменить» не работает
Я сам когда-то неоднократно впадал в ступор в подобных ситуациях. Уверен и видишь своими глазами, что искомый паттерн в данных есть, но Excel при выполнении процедуры поиска сообщает:
или при замене:
Так вот, совет нажать кнопку «Параметры» в обоих этих сообщениях действительно полезен. Там наверняка активен чекбокс «Учитывать регистр» или «Ячейка целиком», которые мешают Excel найти искомое. Excel сохраняет конфигурацию последнего поиска.
Подстановочные знаки, или как найти «звездочку»
Сухая официальная справка по Excel сообщает, что можно использовать подстановочные символы «*» и «?». Что они означают несколько символов, включая их отсутствие, и один любой символ. И что их можно использовать для соответствующих процедур поиска.
Чего не говорит справка — это того, что в комбинации с опцией «ячейка целиком» эти символы позволяют, не прибегая к помощи расширенного фильтра и процедуры поиска группы ячеек:
- Находить ячейки, заканчивающиеся на определенный символ, слово или текст
- Аналогично, находить ячейки, начинающиеся с определенного символа, слова или текста
- Находить непустые ячейки
На примере ниже мы находим все двузначные числа, затем числа, заканчивающиеся и начинающиеся на 7, и, наконец, все непустые ячейки. Напомню, выделить все результаты поиска помогает горячее сочетание клавиш Ctrl+A
Так а как найти звездочку?
Действительно, забыл. Чтобы найти «звездочку», нужно в окошке поиска ставить перед ней знак «~» (тильда), находится обычно под клавишей Esc. Это позволяет экранировать «звездочку», как и вопросительный знак, и не воспринимать их как служебные символы.
Знаки подстановки для поисковой фразы
Условные знаки в шаблоне поисковой фразы:
- ? – знак вопроса обозначает любой отдельный символ;
- * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
- ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).
Источники
- https://vremya-ne-zhdet.ru/vba-excel/metod-range-replace/
- https://exceltable.com/vba-macros/makros-poiska-yacheyki
- https://codernotes.ru/articles/vba/poisk-na-liste-excel.html
- https://vremya-ne-zhdet.ru/vba-excel/metod-range-find/
- https://SEMTools.guru/ru/change-replace-tools/bulk-replace/