Olga H. Пользователь Сообщений: 383 |
Подскажите пожалуйста, как сделать, чтобы в ячейке A1 возможен был быстрый поиск элемента по первым буквам без использования ActiveX? Чтобы вводя Пе… в ячейке A1, появилось бы Петров из выпадающего списка. При введении Ив… в ячейке A1, появилось бы Иванов из выпадающего списка. |
ikki Пользователь Сообщений: 9709 |
никак фрилансер Excel, VBA — контакты в профиле |
Catboyun Пользователь Сообщений: 1631 |
Если после ввода нескольких букв нажать энтер, то еще как-то (разными способами) можмо, |
Olga H. Пользователь Сообщений: 383 |
А возможен ли макрос для этого? |
Hugo Пользователь Сообщений: 23253 |
Возможен. Но немного другой, вот например по такому принципу были разные варианты — но с ActiveX (кто категорически против — не смотрите). Изменено: Hugo — 08.08.2015 20:40:45 |
Olga H. Пользователь Сообщений: 383 |
Hugo, этот макрос работает, даёт варианты по первым введённым буквам. Хочу его подредактировать под себя и запустить, подскажите пожалуйста, что означают некоторые элементы этого макроса: .Top = Target.Top — 20: .Left = Target.Left + 172: .Clear ListBox1.List = Split(Mid(s, 2), «~») x = Sheets(«База данных»).Columns(1).SpecialCells(2).Value If InStr(x(i, 1), txt) Then s = s & «~» & x(i, 1) |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Вот совсем недавно делал похожее |
Hugo Пользователь Сообщений: 23253 |
.Top = Target.Top — 20: .Left = Target.Left + 172: .Clear ListBox1.List = Split(Mid(s, 2), «~») x = Sheets(«База данных»).Columns(1).SpecialCells(2).Value http://msdn.microsoft.com/en-us/library/aa213567(v=office.11).aspx SpecialCells Method [Excel 2003 VBA Language Reference] If InStr(x(i, 1), txt) Then s = s & «~» & x(i, 1) |
magrifa Пользователь Сообщений: 108 |
Вып.список без макросов по первой букве, как просили. Хотя с макросами можно сделать лучше, потому что много лишних движений. |
Olga H. Пользователь Сообщений: 383 |
Hugo
,помогите пожалуйста причесать ваш макрос под мой пример мой Пример. Пробовала сама-ничего не получилось. |
Hugo Пользователь Сообщений: 23253 |
А что там причёсывать? Копируете своих ивановых-петровых на лист баз и используете на первом. |
Olga H. Пользователь Сообщений: 383 |
Hugo, подскажите пожалуйста, что необходимо поменять в вашем макросе, чтобы на «рабочий лист» с «базы данных» переносилось только значение из столбца A1, а из столбца B («номера») не переносилось. |
Hugo Пользователь Сообщений: 23253 |
Стереть/удалитиь формулы из второго столбца Изменено: Hugo — 09.08.2015 15:08:45 |
Olga H. Пользователь Сообщений: 383 |
Hugo, вставила в Пример1 ваш макрос, изменила имена листов и получила Пример2, в котором макрос не работает. Пишу в ячейке A1 Ив…, но Иванов не предлагается. Просьба, посмотрите пожалуйста, что в Примере2 не так, почему не работает. |
Hugo Пользователь Сообщений: 23253 |
#15 09.08.2015 16:33:58
кстати попробовал их скопировать — выделил, Ctrl+C, перешёл в Ваш файл, Ctrl+V — и заработало! Изменено: Hugo — 09.08.2015 16:37:03 |
||
Olga H. Пользователь Сообщений: 383 |
Hugo, у вас получилось, возьмите пожалуйста мой Пример2 и вставьте. У меня тоже самое почему то не получилось, приложите пожалуйста мой Пример2 с вашим вложением. |
Hugo Пользователь Сообщений: 23253 |
Ну и получим тот же файл, что в первом вложении, только с двумя фамилиями. Смысл? Изменено: Hugo — 09.08.2015 18:17:51 |
Olga H. Пользователь Сообщений: 383 |
Про режим дизайнера не слышала, расскажите пожалуйста. |
Hugo Пользователь Сообщений: 23253 |
Ищите в верхнем меню раздел «Разработчик», в нём кнопу «Дизайнер», жмёте — видите эти скрытые элементы, копируете их в свой файл сразу оба (через контрол) или по одному. |
Olga H. Пользователь Сообщений: 383 |
Hugo, получилось перенести в Пример3 горизонтальное (голубое) и вертикальное (жёлтое ) поля. Выходят варианты по первым набранным в ячейке A1 буквам. Как и хотелось. Но после выбора варианта, например, «иванов», его никак потом из этой ячейки не удалить. Посмотрите пожалуйста приложенный Пример3. |
Hugo Пользователь Сообщений: 23253 |
Есть несколько вариантов — например можно удалить данные в строке формул, или выделив сразу несколько ячеек строки. |
Olga H. Пользователь Сообщений: 383 |
#22 12.08.2015 19:47:52 Hugo, спасибо, ваш макрос работает. Вставила на свой лист ваш макрос, поменяла названия листов на свои названия, добавила через Конструктор два указанных в вашем примере поля (горизонтальное и вертикальное)- и заработало. Удалять данные получилось через выделение сразу нескольких ячеек, через удаление в строке формул- не получилось. magrifa , ваш вариант с формулой и без макроса тоже работает, но варианты по первым введённым буквам он не даёт. И вы об этом предупреждали. |
Поиск значений в базе данных по первым буквам при вводе на листе (как в 1С)
21.09.2013, 16:40 | |
[ Файл-пример (191.3 Kb) ] | |
Предположим, на листе есть большая база данных. Поиск по базе можно организовать с помощью поля (текстбокс) для ввода интересующего значения и обновляющегося по мере ввода списка (листбокс) подходящих значений: Option Compare Text Private Sub TextBox1_Change() Dim x, i As Long, txt As String, lt As Long, s As String txt = TextBox1.Text: lt = Len(TextBox1.Text) If lt = 0 Then Exit Sub x = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value For i = 1 To UBound(x, 1) ' поиск по первым буквам If txt = Mid(x(i, 1), 1, lt) Then s = s & "~" & x(i, 1) Next i 'For i = 1 To UBound(x, 1) 'поиск по любому вхождению ' If InStr(x(i, 1), txt) Then s = s & "~" & x(i, 1) 'Next i ListBox1.List = Split(Mid(s, 2), "~") End Sub Private Sub ListBox1_Click() If ListBox1.ListIndex = -1 Then Exit Sub Columns(1).Find(ListBox1, lookat:=xlWhole).Select End Sub Можно также использовать форму (см. файл-пример) |
|
Добавил: nilem | |
|
Просмотров: 42206
| Рейтинг: 5.0/7 |
Всего комментариев: 31 | 1 2 » |
Порядок вывода комментариев: Sashagerych, набросайте какой-нибудь примерчик для поиска по книге. На форуме попробуем порешать, и, если получится что-то стоящее, положим сюда.
Так и сделаю Отличная вещь. А можно сделать так чтобы после того как курсор мыши убирался, поиск удалял содержимое из окошка ? Спасибо +1
Я и макрос то запустить не могу. Выдает object required на строке If ListBox1.ListIndex это название листа или обьект некий ? может где есть описание как применить данный макрос к книге ? 0
разобрался. спасибо ) Теперь надо с событием MouseMoe разобраться 0
На работе всем сотрудникам его внедрил, теперь они пищат от восторга
Заменил файл-пример: на 3-м листе есть разновидность поиска с встроенными полем и списком. Ок, давайте хотелки :), и… где будем общаться?
Доброго времени суток.
Здрасьте. По п.1 вместо А в Sub ListBox1_Click() вместо По п.2 не очень понятно. Наверное, лучше задать вопрос на форуме. Здесь ведь только «приемчики», а реализация м.б. какой угодно. Добрый день! Гуру не подскажут как сделать так, чтобы поиск был не по первым буквам, а по любым в строке. Например есть ячейка с текстом 0,75ВИНО ВАЛЛЕФЬОРИ РОСС КР СХ, и мне надо ее найти по слову вино или слову валл
Здравствуйте! Доброго времени суток. Подскажите пожалуйста, каким образом можно производить поиск по нескольким столбцам массива и выводить результат тоже из нескольких столбцов, а не с одного?
Привет, Станислав Private Sub ListBox1_Click()
Спасибо nilem! А макрос у меня сейчас работает так: Private Sub TextBox1_Change() Работает довольно быстро (Вы как-то давали пример данного поиска). Но просто для эксперимента пытался сделать быстрее взял из этой статьи пример nerv и сделал поиск: Private Sub TextBox1_Change() Arr = ADO.ToArray() Работает, но все же стандартными функции VBA работают быстрее Лучше бы, конечно, на форуме это обсудить, чтобы не загромождать «приемчик» Доброго времени суток. Подскажите пожалуйста как изменить код в листе ENTRY для ввода данных с другого листа. Спасибо.
Добрый день, может кто помочь где я что не так делаю Private Sub Worksheet_SelectionChange(ByVal Target As Range) Private Sub TextBox1_Change() Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Private Sub ListBox1_Click() Application.EnableEvents = True ‘Sub tt() никак не могу заставить работать Спасибо, разобрался, только как данные с другого листа брать пока не понимаю.
Присоединяюсь к вопросу — нужно что бы данные брались с другого листа (способ ENTRY). Как сделать? |
|
1-30 31-31 | |
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация
|
Вход
]
Помогите подправить рабочий макрос поиска из списка по первым буквам
Автор Mailo, 27.09.2011, 00:03
« назад — далее »
Нашел на forum.msexcel.ru хороший макрос по поиску совпадений из списка по первым введенным буквам.Макрос хороший,но что то не могу заточить его под свою книгу)))).Если не сложно,подправьте плиз код формы и макрос с учетом следующих поправок:
1)Нужно что бы результат поиска вставлялся не в ячейку А5,как в исходном файле,а в любую ячейку где стоит курсор(активную ячейку)листа «Журнал_рег»
2)Список всех организаций будет находиться не в G2:G11, как в исходном файле,а на другом листе, под название реквезиты!N3:N250. Этому массиву присвоено имя»плательщик»
3)Функцию «Добавить в список»можно удалить
Спасибо
А где Ваш файл к которому нужно привязать.
Ой, забыл.Интегрировать макрос в этот файл.На странице Журнал рег написал красным шрифтом :где искать и куда вставлять.Остальное-в предыдущем посте.Спасибо
- Профессиональные приемы работы в Microsoft Excel
-
►
Обмен опытом -
►
Microsoft Excel -
►
Помогите подправить рабочий макрос поиска из списка по первым буквам
Содержание
- Определение метода 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/
Надстройка для облегчения ввода значений в ячейку Excel
Автор: nerv
Last Update: 27/03/2012
Вам часто приходится заниматься заполнением электронных таблиц, долго и муторно выбирать варианты из выпадающих списков?
А, может, иметь дело с одними теми же, но не структурированными данными?
Раз так, то данная надстройка призвана облегчить Вам жизнь: сократить время, потраченное на нудную, однообразную работу, а вместе с тем повысить ее качество и эффективность.
Как это работает:
По нажатию Ctrl+Enter рядом с выделенной ячейкой появляется список, который позволяет не только выбирать, но и производить поиск по интересующим Вас данным.
Посмотрим, что он умеет:
- Не содержит повторов (уникальный). Легко выявить однотипные данные;
- Отсортирован по возрастанию. Возможность быстро найти то, что нужно;
- После вызова сразу готов к поиску/выбору из списка. Лишние движения ни к чему;
- Позволяет искать с использованием специальных подстановочных символов (*,?,~ и т.п.);
- Осуществлять быстрый поиск по «шаблону». Если ячейка, из которой был вызван список, содержит информацию, поиск будет произведен по ней;
- Появляется рядом с текущей/активной ячейкой и не «убегает» за пределы экрана;
- Навигация привычными стандартными клавишами: Up [Вверх], Down [Вниз], Page Up [На страницу Вверх ], Page Down [На страницу вниз];
- Корректная работа со всеми типами данных: строки, даты, числа;
- Обработка ошибок формул листа. Никаких пустых строк в списке;
- Обработка защиты ячеек листа. В защищенные ячейки ввод запрещен;
- Информация об общем количестве списка и найденных по запросу элементах;
- Быстрый вызов по нажатию Ctrl+Enter;
- Быстрое закрытие: клавиша Esc;
- Быстрый ввод клавишей Enter
Помимо всего вышеперечисленного, позволяет сэкономить на размере файла за счет формирования списка «на лету», который создается в разы быстрее, если данные упорядочены или частично упорядочены по возрастанию.
Отличия версии 1.6 от 1.5:
- новая, более мощная/быстрая процедура сортировки;
- переход после ввода на следующую ячейку (в зависимости от установок Excel);
Добавлены настройки:
- использования и формирования списка (подробнее во вложении «how to use»);
- поиска с учетом регистра и без него;
- маски поиска;
- заголовков.
- 160184 просмотра
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.