Поиск какого-либо значения в ячейках 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
Макрос Excel для поиска по всей книге кроме последнего листа |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
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 — 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
- Select and copy the text from within the grey box above.
- Open the Microsoft Excel file in which you would like the Macro to function.
- Press «Alt + F11» — This will open the Visual Basic Editor — Works for all Excel Versions.
Or For other ways to get there, Click Here. - 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.
- If the Macro goes in a Module, Click Here, otherwise continue to Step 8.
- If the Macro goes in the Workbook or ThisWorkbook, Click Here, otherwise continue to Step 8.
- If the Macro goes in the Worksheet Code, Click Here, otherwise continue to Step 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.
- You are now ready to run the macro.
Владимир Пользователь Сообщений: 8196 |
Прошу помочь. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Hugo Пользователь Сообщений: 23249 |
Была похожая тема, Pavel55 код писал, посмотрите http://www.planetaexcel.ru/forum.php?thread_id=15065 В файле присутствует макрос «ПоискВоВсехФайлахИПапках» Данный макрос: |
Владимир Пользователь Сообщений: 8196 |
Hugo, спасибо. Классный поиск. Pavel55, Вам тоже спасибо большое. Молодец. ———- А реально ли доработать так, чтобы сразу все данные вводить для поиска, а не по одному? «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nilem Пользователь Сообщений: 837 |
Владимир, можете показать парочку файлов, в которых нужно искать совпадения? |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=04.07.2011 12:09}{thema=}{post}Hugo, спасибо. Классный поиск. Pavel55, Вам тоже спасибо большое. Молодец. ———- А реально ли доработать так, чтобы сразу все данные вводить для поиска, а не по одному?{/post}{/quote}конечно) |
Владимир Пользователь Сообщений: 8196 |
Реально может быть до 10-15 файлов. Строк от 10000 до 65000. Структура у всех файлов разная. Я Вам примерно накопировал из разных прайсов. Если этого мало, то только по электронке могу. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nilem Пользователь Сообщений: 837 |
Эх, уже нарисовал(«формульный» макрос, без открытия файлов), но раз структура файлов разная, то не пойдет. Видимо, только Find. |
Владимир Пользователь Сообщений: 8196 |
{quote}{login=nilem}{date=04.07.2011 01:04}{thema=}{post}Эх, уже нарисовал(«формульный» макрос, без открытия файлов), но раз структура файлов разная, то не пойдет. Видимо, только Find.{/post}{/quote} Спасибо за участие, nilem. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=04.07.2011 01:29}{thema=Re: }{post}{quote}{login=nilem}{date=04.07.2011 01:04}{thema=}{post}Эх, уже нарисовал(«формульный» макрос, без открытия файлов), но раз структура файлов разная, то не пойдет. Видимо, только Find.{/post}{/quote} Спасибо за участие, nilem.{/post}{/quote}посмотрите работает ли. Времени разбираться нету) Alt+F8 |
Ну, раз уж написал. Этот файл нужно положить в одну папку с файлами-источниками. |
|
Владимир Пользователь Сообщений: 8196 |
nerv, сработало. Долго правда, но отлично сработало, даже ссылки сразу на файлы нарисовал. Спасибо. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
{quote}{login=}{date=04.07.2011 01:54}{thema=}{post}Ну, раз уж написал. Этот файл нужно положить в одну папку с файлами-источниками.{/post}{/quote} Ваш макрос — GetValue200? Положил к исходным файлам, потестил. Долго ждал, ничего не произошло. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
nerv, а этот параметр могу я перед началом работы макроса задать сам — TextToFind = [J2:J22]? Т.к. в файле может быть [J2:J5] и [J2:J35]. Т.е. скажем TextToFind = [(выделенный диапазон)]? «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nilem Пользователь Сообщений: 837 |
«Ваш макрос — GetValue200? Положил к исходным файлам, потестил. Долго ждал, ничего не произошло.» |
Владимир Пользователь Сообщений: 8196 |
Спотыкается на этой строке: Set r = .Sheets(1).UsedRange.Find(What:=x(k, 1), LookIn:=xlValues, LookAt:=xlWhole) «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=04.07.2011 02:18}{thema=}{post}nerv, а этот параметр могу я перед началом работы макроса задать сам — TextToFind = [J2:J22]? Т.к. в файле может быть [J2:J5] и [J2:J35]. Т.е. скажем TextToFind = [(выделенный диапазон)]?{/post}{/quote}конечно ; ) Только не более 1-го диапазона за раз. |
nilem Пользователь Сообщений: 837 |
Последний раз |
Владимир Пользователь Сообщений: 8196 |
…та же картинка — 10 минут в задумчивости, а потом мне надоедает. — «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
{quote}{login=nerv}{date=04.07.2011 03:04}{thema=Re: }{post}{quote}{login=Владимир}{date=04.07.2011 02:18}{thema=}{post}nerv, а этот параметр могу я перед началом работы макроса задать сам — TextToFind = [J2:J22]? Т.к. в файле может быть [J2:J5] и [J2:J35]. Т.е. скажем TextToFind = [(выделенный диапазон)]?{/post}{/quote}конечно ; ) Только не более 1-го диапазона за раз.{/post}{/quote} Ваш макрос сразу бросается искать, он не предлагает ввести значения, как у Pavel55. Поэтому я и спрашиваю, переделать можете на то, чтобы я диапазон для поиска сам указывал? — «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
Макрос не мой) ‘TextToFind = [J2:J22] — за комментируйте эту строку (как сделал я здесь) эту |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
{quote}{login=nerv}{date=04.07.2011 04:06}{thema=to Владимир}{post}Макрос не мой) ‘TextToFind = [J2:J22] — за комментируйте эту строку (как сделал я здесь) эту |
Владимир Пользователь Сообщений: 8196 |
TextToFind = [J2:J22] — а с этим ограничением что сделать? «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=04.07.2011 05:13}{thema=}{post}TextToFind = [J2:J22] — а с этим ограничением что сделать?{/post}{/quote}советую закомментировать (поставить ‘ в начале строки), мало ли в дальнейшим потребуется |
Владимир Пользователь Сообщений: 8196 |
.. всё равно не предлагает выбор диапазона сделать. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=04.07.2011 08:12}{thema=}{post}.. всё равно не предлагает выбор диапазона сделать.{/post}{/quote}Должно) Попробуйте это. Выделяете диапазон, например, мышкой. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Dim TextToFind As Variant можно сразу Range объявлять. |
Владимир Пользователь Сообщений: 8196 |
Сказка.. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
Владимир Пользователь Сообщений: 8196 |
В процессе работы появились маленькие недоделки. 1. Макрос не ищет одну ячейку, выдаёт ошибку. Если указываю более одной, то порядок. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
nerv Пользователь Сообщений: 3071 |
{quote}{login=Владимир}{date=06.07.2011 10:14}{thema=}{post}В процессе работы появились маленькие недоделки. 1. Макрос не ищет одну ячейку, выдаёт ошибку. Если указываю более одной, то порядок. |
nilem Пользователь Сообщений: 837 |
#30 06.07.2011 10:26:36 Имхо, со словарем все же должно быть быстрее и надежнее. Владимир, попробуйте выбрать 2-3 (ну или больше) файла с прайсами, наиболее отличающиеся по расположению данных, форматам и пр. Пришлите сюда: valej5@mail.ru |
- Надстройки Excel
- Поиск в Excel
- Панель инструментов
- Книги Excel
- текстовые строки
- Форма ввода
Наверняка, вы сталкивались с ситуацией, когда необходимо производить поиск некоторого значения по всей книге Excel (искать частичное совпадение на всех листах активной книги)
Штатными средствами Excel вывести поле для поиска на панель инструментов не удаётся, а вызывать каждый раз диалоговое окно нажатием комбинации клавиш Ctrl + F не всегда удобно.
На помощь придёт эта надстройка — она формирует в строке меню Excel 2003 поле для поиска по всем листам:
Достаточно ввести искомый текст, и нажать клавишу Enter, — и перед вами полный список всех подходящих ячеек со всех листов книги.
Для перехода к найденной ячейке достаточно щелкнуть мышью на нужном результате — автоматически будет активирован нужный лист, и выделена искомая ячейка.
Поместите эту надстройку в папку автозагрузки Excel — и это поле будет появляться при каждом запуске программы.
Конечно, функциональность этой надстройки присутствует и в Excel, — если в настройках поиска выбрать опцию «Искать в книге»:
Моя же надстройка чуть упрощает работу — не надо нажимать лишние кнопки для типа Ctrl + F, и не надо выбирать область поиска.
К тому же, при использовании надстройки, вы можете провести мышом (при нажатой левой кнопке) по результатам поиска, — и Excel пролистает (выделит) все найденные ячейки по очереди (во встроенном поиске Excel надо щелкать на каждом результате отдельно)
(добавлено 29.07.2011) Немного подправил код надстройки:
- теперь форма с результатами закрывается по нажатию Esc
- при отсутствии открытой книги не выводится пустая форма
- панель инструментов не сбрасывается к настройкам «по-умолчанию» перед добавлением поля
- 200774 просмотра
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
0 / 0 / 0 Регистрация: 18.11.2019 Сообщений: 5 |
|
1 |
|
Excel Поиск строк в книге по содержимому в ячейке (макрос)27.10.2021, 17:57. Показов 1577. Ответов 7
Здравствуйте! Помогите пожалуйста! Нужен макрос с такой задачей. На Листе1 выделить любую ячейку (всегда разные ячейки и данные в них разные) и по содержимому выделенной ячейки на Листе2 найти и отобразить только те строки (строк может быть несколько), где есть содержимое выделенной ячейки. Например, есть некий массив на Листе1, с набором различных данных. Становимся на любую ячейку на Листе1, запускаем макрос, на Листе2 (там тоже массив данных) отображаются только те строки, в которых есть данные из выбранной ячейки Листа1.
0 |
Burk 1811 / 1134 / 345 Регистрация: 11.07.2014 Сообщений: 3,999 |
||||
27.10.2021, 19:52 |
2 |
|||
Vladimir241267, например, так
0 |
Narimanych 2628 / 1634 / 744 Регистрация: 23.03.2015 Сообщений: 5,135 |
||||
27.10.2021, 20:37 |
3 |
|||
Vladimir241267, Кликните здесь для просмотра всего текста
0 |
Vladimir241267 0 / 0 / 0 Регистрация: 18.11.2019 Сообщений: 5 |
||||
28.10.2021, 08:58 [ТС] |
4 |
|||
Burk, работает. Нужно сделать еще чтобы строка 1 не скрывалась, там заголовок таблицы. Добавлено через 1 минуту Добавлено через 6 минут
0 |
Burk 1811 / 1134 / 345 Регистрация: 11.07.2014 Сообщений: 3,999 |
||||
28.10.2021, 11:01 |
5 |
|||
строка 1 не скрывалась, Vladimir241267, а поставить перед строкой 20
тяжело сообразить?
0 |
297 / 157 / 86 Регистрация: 01.04.2020 Сообщений: 436 |
|
28.10.2021, 14:28 |
6 |
тяжело сообразить? тяжелo даже спасибo сказать
1 |
Burk 1811 / 1134 / 345 Регистрация: 11.07.2014 Сообщений: 3,999 |
||||
28.10.2021, 14:58 |
7 |
|||
Добавлено через 12 минут
2 |
0 / 0 / 0 Регистрация: 18.11.2019 Сообщений: 5 |
|
29.10.2021, 08:48 [ТС] |
8 |
Конечно скажу и говорю Спасибо! Всем! Только что вернулся к этой теме. Еще даже не успел попробовать все Ваши скрипты.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
29.10.2021, 08:48 |
8 |
Как всегда искать по всей книге?
В Excel, когда вы применяете функцию «Найти и заменить», он по умолчанию будет искать на текущем листе, если вы всегда хотите искать на всех листах, вам нужно изменить Простыня в Workbook под Опция в Найти и заменить диалог при включении книги каждый раз. Как можно настроить поиск по всей книге вместо активного листа по умолчанию?
Всегда искать по всей книге с кодом VBA
Всегда выполнять поиск по всей книге с помощью Kutools for Excel
Всегда искать по всей книге с кодом VBA
Фактически, у нас нет прямого способа изменить область поиска на всю книгу по умолчанию в Excel, но вы можете применить следующий код VBA в качестве обходного пути. С помощью этого кода вам не нужно изменять область поиска каждый раз, когда вы обедаете эту книгу.
1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
2. Нажмите Вставить > Модулии вставьте следующий код в Модули Окно.
Код VBA: всегда искать по всей книге:
Sub FindReplace_WB()
'Updateby Extendoffice
Dim ws As Worksheet
Dim xFind As String
Dim xRep As String
Application.ScreenUpdating = False
On Error Resume Next
xFind = Application.InputBox("Find what", "Kutools for Excel", "", , , , , 2)
xRep = Application.InputBox("Replace with", "Kutools for Excel", "", , , , , 2)
If xFind = "" Then
MsgBox "wrong...", vbInformation, "Kutools for Excel"
Exit Sub
End If
For Each ws In ThisWorkbook.Worksheets
ws.UsedRange.Replace What:=xFind, Replacement:=xRep, LookAt:=xlWhole
Next ws
On Error GoTo 0
Application.ScreenUpdating = True
End Sub
3, Затем нажмите F5 нажмите клавишу для запуска этого кода, и в появившихся диалоговых окнах введите текстовые значения в поля «Найти» и «Заменить на» отдельно, см. снимок экрана:
4, Затем нажмите OK, все значения во всей книге, которую вы хотите, были заменены необходимыми значениями.
5. Сохраните книгу как Excel Macro-Enabled Workbook формат, и в следующий раз, когда вы откроете эту книгу, вы всегда сможете применить этот код для поиска во всей книге.
Всегда выполнять поиск по всей книге с помощью Kutools for Excel
Если у вас есть Kutools for Excel, С его Область переходов утилиту, вы всегда можете найти и заменить на листе, всей книге или нескольких открытых книгах по мере необходимости.
После установки Kutools for Excel, пожалуйста, сделайте следующее:
1. Нажмите Кутулс > Навигация, см. снимок экрана:
2. В Навигация панели, нажмите кнопку, чтобы перейти к Параметры навигации, в центре параметров укажите необходимый объем по умолчанию в поле Найти и заменить раздел, в этом случае я выберу Активная рабочая тетрадь, см. снимок экрана:
3. Затем нажмите OK кнопку, закройте и снова откройте книгу, чтобы применить эффект настройки, а теперь перейдите к Навигация панель и щелкните для активации Найти и заменить функция. в Найти и заменить панели, выполните следующие операции:
(1.) Под В вы можете видеть, что область действия по умолчанию была изменена на Активная рабочая тетрадь;
(2.) Под Замените на вкладке введите текст, который хотите найти и заменить отдельно, в поле Найти то, что и Заменить текстовое окно;
(3.) Затем щелкните Заменить все кнопку, чтобы заменить текст в активной книге, которая вам нужна.
Нажмите Скачать бесплатно Kutools for Excel от Yhao сейчас!
4. С этого момента, когда вы открываете любую книгу и применяете это Найти и заменить Утилита Kutools, область поиска по умолчанию является активной книгой.
Более 300 функций могут сделать вашу работу более эффективной, вы можете скачать Kutools for Excel на бесплатную трассу.
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!