Макрос поиска в excel по первым буквам

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Подскажите пожалуйста, как сделать, чтобы в ячейке A1 возможен был быстрый поиск элемента по первым буквам без использования ActiveX? Чтобы вводя Пе… в ячейке A1, появилось бы Петров из выпадающего списка. При введении Ив… в ячейке A1, появилось бы Иванов из выпадающего списка.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

никак

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Catboyun

Пользователь

Сообщений: 1631
Регистрация: 09.05.2015

Если после ввода нескольких букв нажать энтер, то еще как-то (разными способами) можмо,
а так ни как (наверное)

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

А возможен ли макрос для этого?

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Возможен. Но немного другой, вот например по такому принципу были разные варианты — но с ActiveX (кто категорически против — не смотрите).

Изменено: Hugo08.08.2015 20:40:45

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo, этот макрос работает, даёт варианты по первым введённым буквам. Хочу его подредактировать под себя и запустить, подскажите пожалуйста, что означают некоторые элементы этого макроса:

.Top = Target.Top — 20: .Left = Target.Left + 172: .Clear
Что означает «-20» ?
Что означает  «+ 172» ?

ListBox1.List = Split(Mid(s, 2), «~»)
Что означает «s» ?
Что означает «2» ?

x = Sheets(«База данных»).Columns(1).SpecialCells(2).Value
Что означает «1» ?
Что означает «2» ?

If InStr(x(i, 1), txt) Then s = s & «~» & x(i, 1)
Что означает «i» ?
Что означает «1» ?

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

Вот совсем недавно делал

похожее

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

.Top = Target.Top — 20: .Left = Target.Left + 172: .Clear
Что означает «-20» ? 20 пунктов вверх (почём пункт — не вникал, если очень интересно — можно посчитать, мне не интересно)
Что означает «+ 172» ? 172 пункта левее

ListBox1.List = Split(Mid(s, 2), «~»)
Что означает «s» ? собранная строка значений
Что означает «2» ? позиция, второй символ

x = Sheets(«База данных»).Columns(1).SpecialCells(2).Value
Что означает «1» ? первый
Что означает «2» ? см.ниже

http://msdn.microsoft.com/en-us/library/aa213567(v=office.11).aspx

SpecialCells Method [Excel 2003 VBA Language Reference]
xlCellTypeConstants. Cells containing constants 2

If InStr(x(i, 1), txt) Then s = s & «~» & x(i, 1)
Что означает «i» ? строка массива в цикле
Что означает «1» ? первый столбец массива

 

magrifa

Пользователь

Сообщений: 108
Регистрация: 01.01.1970

Вып.список без макросов по первой букве, как просили. Хотя с макросами можно сделать лучше, потому что много лишних движений.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo

,помогите пожалуйста причесать ваш макрос под мой пример мой Пример. Пробовала сама-ничего не получилось.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

А что там причёсывать? Копируете своих ивановых-петровых на лист баз и используете на первом.
А если хотите перенести функционал в свой рабочий файл — то и показывать нужно его. Если кончно можно.
Там нужно скопировать код как в примере, и создать на листе листбокс и текстбокс как в примере (ну или можно их тоже скопировать), но смотрите чтоб в коде были использованы их имена.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo, подскажите пожалуйста, что необходимо поменять в вашем макросе, чтобы на «рабочий лист» с «базы данных» переносилось только значение из столбца A1, а из столбца B («номера») не переносилось.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Стереть/удалитиь формулы из второго столбца :)
И вообще это не мой макрос, просто у меня этот пример был сохранён.
Я бы вероятно не собирал эти фамилии в строку, а использовал бы коллекцию или словарь. Если фамилий очень много — может быть медленно собирать/разбивать строку, а если в них вдруг попадутся эти использованные разделители — то вообще будет брак.

Изменено: Hugo09.08.2015 15:08:45

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo, вставила в Пример1 ваш макрос, изменила имена листов и получила Пример2, в котором макрос не работает. Пишу в ячейке A1 Ив…, но Иванов не предлагается. Просьба, посмотрите пожалуйста, что в Примере2 не так, почему не работает.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

#15

09.08.2015 16:33:58

Цитата
Hugo написал:
и создать на листе листбокс и текстбокс как в примере (ну или можно их тоже скопировать)

кстати попробовал их скопировать — выделил, Ctrl+C, перешёл в Ваш файл, Ctrl+V — и заработало!

Изменено: Hugo09.08.2015 16:37:03

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo,  у вас получилось, возьмите пожалуйста мой Пример2 и вставьте. У меня тоже самое почему то не получилось, приложите пожалуйста мой Пример2 с вашим вложением.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

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

Изменено: Hugo09.08.2015 18:17:51

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Про режим дизайнера не слышала, расскажите пожалуйста.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Ищите в верхнем меню раздел «Разработчик», в нём кнопу «Дизайнер», жмёте — видите эти скрытые элементы, копируете их в свой файл сразу оба (через контрол) или по одному.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

Hugo, получилось перенести в Пример3 горизонтальное (голубое) и вертикальное (жёлтое ) поля. Выходят варианты по первым набранным в ячейке A1 буквам. Как и хотелось. Но после выбора варианта, например, «иванов», его никак потом из этой ячейки не удалить. Посмотрите пожалуйста приложенный Пример3.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Есть несколько вариантов — например можно удалить данные в строке формул, или выделив сразу несколько ячеек строки.
Ну или нужно смотреть/менять код.

 

Olga H.

Пользователь

Сообщений: 383
Регистрация: 18.12.2013

#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

Можно также использовать форму (см. файл-пример)

  • 1
  • 2
  • 3
  • 4
  • 5

Добавил: nilem |

Просмотров: 42206

| Рейтинг: 5.0/7

Всего комментариев: 31 1 2 »

Порядок вывода комментариев:

   Sashagerych, набросайте какой-нибудь примерчик для поиска по книге. На форуме попробуем порешать, и, если получится что-то стоящее, положим сюда. :)

   Так и сделаю :)
Правда сам я в VBA только на пальцах считать умею, так что могу сделать примитивный примерчик с пояснениями как я это вижу :)

   Отличная вещь. А можно сделать так чтобы после того как курсор мыши убирался, поиск удалял содержимое из окошка ? Спасибо

+1
 


   Можно
Например используйте событие MouseMove

   Я и макрос то запустить не могу. Выдает object required на строке If ListBox1.ListIndex

   это название листа или обьект некий ? может где есть описание как применить данный макрос к книге ?

0
 


   А файл скачать Вы не пробовали? это же ГОТОВОЕ РЕШЕНИЕ!

   разобрался. спасибо ) Теперь надо с событием MouseMoe разобраться

0
 


   Николай, отличное решение, спасибо!

На работе всем сотрудникам его внедрил, теперь они пищат от восторга :)

   Заменил файл-пример: на 3-м листе есть разновидность поиска с встроенными полем и списком.
Кстати, если есть желание, давайте попробуем сделать красивую надстройку? (понадобятся пожелания/хотелки и время для тестирования)

   Ок, давайте хотелки :), и… где будем общаться?

   Доброго времени суток.
действительно хорошая вещь. Для своей работы мне пригодиться Sheet1 и ENTRY
Есть вопросы, на которые очень прошу ответить.
1. Для Sheet1 где поменять номер столбца? Например у меня необходимо брать данные из столбца 5 или Е.
2.Для ENTRY мне не нужно заполнять массив, а просто в ячейке ввести первые буквы, поиск должен выдать варианты.
С ёкселем чуть-чуть дружу, а вот с макросами, ни как не получается.
Если необходимо, могу скинуть свой файл.
Заранее благодарен.

   Здрасьте. По п.1 вместо
x = Range(«A1», Cells(Rows.Count, 1).End(xlUp)).Value
напишите
x = Range(«E1», Cells(Rows.Count, 5).End(xlUp)).Value

А в Sub ListBox1_Click() вместо
Columns(1).Find(ListBox1, lookat:=xlWhole).Select
нужно будет
Columns(5).Find(ListBox1, lookat:=xlWhole).Select

По п.2 не очень понятно. Наверное, лучше задать вопрос на форуме. Здесь ведь только «приемчики», а реализация м.б. какой угодно.

   Добрый день! Гуру не подскажут как сделать так, чтобы поиск был не по первым буквам, а по любым в строке. Например есть ячейка с текстом 0,75ВИНО ВАЛЛЕФЬОРИ РОСС КР СХ, и мне надо ее найти по слову вино или слову валл

   Здравствуйте!
Очень интересный код,
интересует как можно его переделать так, чтобы можно было сделать следующее:
Есть база данных (предположим на диапазоне ячеек А2:B7)
Я хочу производить поиск по диапазону А2:А7, но при выборе выводить значения из диапазона В2:В7
Так же поисковую форму я хочу, например, поставить на ячейки в диапазоне F2:F4 и G8:G10, а выводить значения в диапазон ячеек K2:K4 и K8:K10 соответственно
Я знаю, что можно эту задачу решить используя элементы ActiveX, но хотелось бы это сделать с помощью данного кода, самому опыта не хватает переделать ваш код, такое можно сделать?
Заранее спасибо

   Доброго времени суток. Подскажите пожалуйста, каким образом можно производить поиск по нескольким столбцам массива и выводить результат тоже из нескольких столбцов, а не с одного?

   Привет, Станислав
попробуйте так
Private Sub TextBox1_Change()
Dim x, v, txt As String, lt As Long, s As String
txt = TextBox1.Text: lt = Len(TextBox1.Text)
If lt = 0 Then Exit Sub
‘ будем искать в столбцах A:D
x = Range(«A1:D» & Cells(Rows.Count, 1).End(xlUp).Row).Value
For Each v In x ‘ поиск по первым буквам
If txt = Mid(v, 1, lt) Then s = s & «~» & v
Next i
‘For Each v In x ‘поиск по любому вхождению
‘ If InStr(v, txt) Then s = s & «~» & v
‘Next i
ListBox1.List = Split(Mid(s, 2), «~»)
End Sub

Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Range(«A:D»).Find(ListBox1, lookat:=xlWhole).Select
End Sub

   Спасибо nilem!
Но не совсем получается. ListBox находиться в UserForm, и данные я вывожу на несколько колонок
ListBox1.ColumnCount = 11
ListBox1.ColumnWidths = «50;40;140;140;140;140;40;40;40;40;40»

А макрос у меня сейчас работает так:

Private Sub TextBox1_Change()
Dim txt$, i&, j&, ii&, n&, xx
txt = TextBox1.Text
ii = 1
With ListBox1
.Clear
If Len(txt) = 0 Then .List = x: Exit Sub
ReDim xx(1 To UBound(x, 1), 1 To UBound(x, 2))
For i = 1 To UBound(x)
For j = 2 To 6
If InStr(1, x(i, j), txt) Then
xx(ii, 1) = x(i, 1)
xx(ii, 2) = x(i, 2)
xx(ii, 3) = x(i, 3)
xx(ii, 4) = x(i, 4)
xx(ii, 5) = x(i, 5)
xx(ii, 6) = x(i, 6)
xx(ii, 7) = x(i, 7)
xx(ii, 8) = x(i, 8)
xx(ii, 9) = x(i, 9)
xx(ii, 10) = x(i, 10)
xx(ii, 11) = x(i, 11)
ii = ii + 1
Exit For
End If
Next j
Next i
.List = xx
For i = .ListCount — 1 To 0 Step -1
If .List(i, 0) = 0 Then .RemoveItem i
Next
End With
End Sub

Работает довольно быстро (Вы как-то давали пример данного поиска). Но просто для эксперимента пытался сделать быстрее взял из этой статьи пример nerv и сделал поиск:

Private Sub TextBox1_Change()
Dim txt$, t
Dim ADO As New ADO
Dim Arr As Variant
t = Timer
txt = TextBox1.Text
With ListBox1
.Clear
If Len(txt) = 0 Then .List = x: Exit Sub
ADO.Query («SELECT F1, F2, F3, F4, F5, F6, F7, F8 » _
& «FROM [Где_Искать$A2:H] » _
& «WHERE » _
& «F1 LIKE » & «‘%» & txt & «%'» _
& » Or F2 LIKE » & «‘%» & txt & «%'» _
& » Or F3 LIKE » & «‘%» & txt & «%'» _
& » Or F4 LIKE » & «‘%» & txt & «%'» _
& » Or F5 LIKE » & «‘%» & txt & «%'» _
& » Or F6 LIKE » & «‘%» & txt & «%'» _
& » Or F7 LIKE » & «‘%» & txt & «%'» _
& » Or F8 LIKE » & «‘%» & txt & «%'» _
)

Arr = ADO.ToArray()
If IsEmpty(Arr) Then
.Clear
Else
.List = Arr
End If
End With
Debug.Print Timer — t
End Sub

Работает, но все же стандартными функции VBA работают быстрее

   Лучше бы, конечно, на форуме это обсудить, чтобы не загромождать «приемчик»

   Доброго времени суток. Подскажите пожалуйста как изменить код в листе ENTRY для ввода данных с другого листа. Спасибо.

   Добрый день, может кто помочь где я что не так делаю
Option Explicit
Option Compare Text
Dim bu As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
If Target.Row = 1 Then Me.TextBox1.Visible = False: Me.ListBox1.Visible = False: Exit Sub
If Target.Column = 2 Then
bu = True
With Me.TextBox1
.Top = Target.Top: .Text = Target.Value ‘: .Activate
End With
With Me.ListBox1
.Top = Target.Top + 5
If (.Top + .Height + ActiveWindow.PointsToScreenPixelsY(0) * Application.InchesToPoints(1) * 15 / 1440) > _
(ActiveWindow.Application.Height + ActiveWindow.Application.Top) Then _
.Top = .Top — .Height + Target.Height ‘* ActiveWindow.Zoom / 100
.Clear
End With
bu = False
Me.TextBox1.Visible = True: Me.ListBox1.Visible = True
Else
Me.TextBox1.Visible = False: Me.ListBox1.Visible = False
End If
End Sub

Private Sub TextBox1_Change()
If Len(TextBox1.Text) = 0 Or bu Then Exit Sub ‘при отсутствии символов для поиска — выход
Dim x, i As Long, txt As String, lt As Long, s As String
txt = TextBox1.Text: lt = Len(TextBox1.Text)
x = Columns(32).SpecialCells(2).Offset(1).Value
For i = 1 To UBound(x, 1) ‘ поиск по первым буквам
If txt = Mid(x(i, 1), 1, lt) Then s = s & x(i, 1) & «~»
Next i
ListBox1.List = Split(s, «~»)
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Or KeyCode = 9 Then
With Me.TextBox1
ActiveCell.Value = .Value
.Visible = False: ListBox1.Visible = False
End With
ActiveCell(2, 1).Select
End If
End Sub

Private Sub ListBox1_Click()
If ListBox1.ListIndex = -1 Then Exit Sub
Application.EnableEvents = False
bu = True
With Me.ListBox1
ActiveCell.Value = .Value
Me.TextBox1.Text = .Value
Me.TextBox1.Visible = False: .Visible = False
End With

Application.EnableEvents = True
bu = False
End Sub

‘Sub tt()
‘Application.EnableEvents = True
‘End Sub

никак не могу заставить работать

   Спасибо, разобрался, только как данные с другого листа брать пока не понимаю.


   А все таки: что поменять, что бы база располагалась на другом листе? способ ENTRYYY

   Присоединяюсь к вопросу — нужно что бы данные брались с другого листа (способ 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

  • Помогите подправить рабочий макрос поиска из списка по первым буквам

Содержание

  1. Определение метода Range.Replace
  2. Синтаксис
  3. Параметры
  4. Макрос поиска ячейки с выпадающим списком
  5. Поиск функцией Find
  6. Примеры поиска функцией Find
  7. Поиск даты с помощью Find
  8. Предназначение и синтаксис метода Range.Find
  9. Синтаксис метода Range.Find
  10. Параметры метода Range.Find
  11. «Найти и заменить» в Excel
  12. Горячие клавиши
  13. Процедура «Найти и заменить» не работает
  14. Подстановочные знаки, или как найти «звездочку»
  15. Знаки подстановки для поисковой фразы

Определение метода 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:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • [xlFormulas (-4123) – формулы]**.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.
** Тесты показали неработоспособность метода 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 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Понравилась статья? Поделить с друзьями:
  • Макрос объединить все листы в один excel макрос
  • Макрос поиска в excel на vba
  • Макрос отправка писем excel кому
  • Макрос объединения всех листов excel на один лист
  • Макрос поиск ячеек excel