Поиск по выпадающему списку в excel vba

 

Виктор C

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

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

Добрый день подскажите как можно реализовать поиск в выпадающем списке  по смыслу если ввести букву А  в  поле отображались все что есть на букву Аэпорт, Ателье и тд.

Прикрепленные файлы

  • Книга1.xlsx (19.12 КБ)

 

Мотя

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

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

А что мешает предварительно выполнить сортировку данных в этом списке?

 

Виктор C

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

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

ничего не мешает это так к примеру у меня 10 слов на букву А, а есть очень большие справочники листать их не всегда удобно и не быстро

 

Виктор C

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

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

Прикрепленные файлы

  • Книга1.xlsx (23.93 КБ)
 

gling

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

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

Здравствуйте. А комбобокс не устраивает? Или выпадающих списков много? Если списков много то можно тот же комбобокс, но с макросом по событию активации ячейки. А уж коли использовать макрос то и формирование списка можно ему доверить, пусть сортирует только соответствующие первым буквам. Подобные темы уже были на форуме.

 

Виктор C

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

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

gling,не силен в макросах((  я головой понимаю что формулами не все и не всегда сделать. Сейчас делаю автоматизацию производственных процессов на ходу. Обучаться макросам  в данный период времени не имею свободного времени  

 

gling

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

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

Вот вариант того о чем писал. При вводе первых букв предлагается вариант. Но лучше когда список отсортирован,близкие по значениям будут рядом в раскрывающемся списке.

 

Виктор C

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

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

gling, я типа того уже сделал с помощью элемента ActiveX

 

gling

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

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

Посмотрите еще вариант. Для работы нужно активировать ячейку в столбце А. Писал не я, где то слямзил, сейчас уже не вспомню. Спасибо автору, мне очень понравилось по этому и сохранил. Можно настроить сочетание только с начала текста ищет и формирует список, а можно по сочетанию внутри текста. При активации заполненной ячейки ЛистБокс и ТекстБокс не появятся, ну это можете настроить под свои нужды, например на двойной клик очищать ячейку и отображать Боксы. Экспериментируйте.

 

Виктор C

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

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

gling, круто вообще!!! буду побывать адаптировать,  сразу вопрос а если  одном листе много таких  выпадающих списков нужно вставить в мою таблицу с переменными как указать источники в прилагаемом файле  это я как понял UCase(Лист1.Cells(i, 12))

Изменено: Виктор C08.10.2017 18:41:23

 

gling

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

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

Да это ссылка на столбец где находятся данные для списка.

 

Виктор C

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

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

#12

08.10.2017 20:42:58

хочется сделать красиво а VBA  я не знаю  думал исправлю
ComboBox1 на ComboBox2;
TextBox1 на  TextBox2;
Range(«A2:A3000»)) на Range(«B2:B3000»));
поменял столбец 12 на 13
и получиться второй список, а нифига (((

Код
Dim bu As Boolean

Private Sub ComboBox1_Change()

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("A2:A3000")) Is Nothing Then
        If Target.Value <> "" Then: Me.TextBox1.Visible = False: Me.ListBox1.Visible = False: Exit Sub
        bu = True
        With Me.TextBox1
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Text = Target.Value
            .Activate
        End With
        With Me.ListBox1
            .Top = Target.Top
            .Left = Target.Left + Target.Width
            .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()
    Dim X, i, txt As String, lt, s As String
    If Len(TextBox1.Text) = 0 Or bu Then Exit Sub
    txt = TextBox1.Text
    lt = Len(TextBox1.Text)
    X = Лист1.Columns(12).SpecialCells(2).Value
    For i = 1 To Лист1.Cells(Rows.Count, 12).End(xlUp).Row
        'If InStr(1, UCase(Лист1.Cells(i, 12)), UCase(TextBox1.Value)) > 0 Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в любом месте текста
        If UCase(txt) = UCase(Mid(Лист1.Cells(i, 12), 1, lt)) Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в начале текста
    Next i
    ListBox1.List = Split(s, "~")
End Sub

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

Dim bu As Boolean

Private Sub ComboBox2_Change()

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error Resume Next
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:B3000")) Is Nothing Then
        If Target.Value <> "" Then: Me.TextBox2.Visible = False: Me.ListBox2.Visible = False: Exit Sub
        bu = True
        With Me.TextBox2
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Text = Target.Value
            .Activate
        End With
        With Me.ListBox2
            .Top = Target.Top
            .Left = Target.Left + Target.Width
            .Clear
        End With
        bu = False
        Me.TextBox2.Visible = True
        Me.ListBox2.Visible = True
    Else
        Me.TextBox2.Visible = False
        Me.ListBox2.Visible = False
    End If
End Sub
Private Sub TextBox2_Change()
    Dim X, i, txt As String, lt, s As String
    If Len(TextBox2.Text) = 0 Or bu Then Exit Sub
    txt = TextBox2.Text
    lt = Len(TextBox2.Text)
    X = Лист1.Columns(13).SpecialCells(2).Value
    For i = 1 To Лист1.Cells(Rows.Count, 13).End(xlUp).Row
        'If InStr(1, UCase(Лист1.Cells(i, 13)), UCase(TextBox2.Value)) > 0 Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в любом месте текста
        If UCase(txt) = UCase(Mid(Лист1.Cells(i, 13), 1, lt)) Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в начале текста
    Next i
    ListBox2.List = Split(s, "~")
End Sub

Private Sub ListBox2_Click()
    If ListBox2.ListIndex = -1 Then Exit Sub
    bu = True
    ActiveCell.Value = ListBox2.Value
    Me.TextBox2.Visible = False
    Me.ListBox2.Visible = False
    bu = False
End Sub

Прикрепленные файлы

  • КомБокс (1).xlsm (32.36 КБ)

Изменено: Виктор C08.10.2017 21:21:45

 

gling

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

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

#13

09.10.2017 22:24:31

Для столбца А и В разные списки, Box используются те же.

Код
Private Sub TextBox1_Change()    Dim X, i, txt As String, lt, s As String
    If Len(TextBox1.Text) = 0 Or bu Then Exit Sub
    txt = TextBox1.Text
    lt = Len(TextBox1.Text)
    If ActiveCell.Column = 1 Then
    X = Лист1.Columns(12).SpecialCells(2).Value
    For i = 1 To Лист1.Cells(Rows.Count, 12).End(xlUp).Row
        'If InStr(1, UCase(Лист1.Cells(i, 12)), UCase(TextBox1.Value)) > 0 Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в любом месте текста
        If UCase(txt) = UCase(Mid(Лист1.Cells(i, 12), 1, lt)) Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в начале текста
    Next i
    Else
    X = Лист1.Columns(13).SpecialCells(2).Value
        For i = 1 To Лист1.Cells(Rows.Count, 13).End(xlUp).Row
        'If InStr(1, UCase(Лист1.Cells(i, 12)), UCase(TextBox1.Value)) > 0 Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в любом месте текста
        If UCase(txt) = UCase(Mid(Лист1.Cells(i, 13), 1, lt)) Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в начале текста
    Next i
    End If
    ListBox1.List = Split(s, "~")
End Sub

Прикрепленные файлы

  • КомБокс (1).xlsm (34.74 КБ)

Изменено: gling09.10.2017 22:27:56

 

Виктор C

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

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

gling, все красиво,  я я еще добавил столбец изменил макрос, теперь получилось что каждая ячейка выпадающий список и смешались источники данных столбец M и N теперь подставляет из двух столбцов и каждая ячейка стала выпадающей. Объясните тупому ))) какие переменные нужно менять в макросе чтоб например столбец А с выпадающим  списком A брал переменные только с столбца L. Столбец В брал переменные только в столбце M и тд. В моей БОЛЬШОЙ таблице хочу разместить около 15 выпадающих списка.Заранее благодарен. извините за настойчивость  

Изменено: Виктор C19.10.2017 20:24:10

 

phelex

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

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

Друг очень крутое решение. Как раз искал.
А можно его на множественный выбор подточить? Типо:
Столбец 1 Столбец 2
Выбор 1 Выбор 1
Выбор 1 Выбор 2
Выбор 2 Выбор 3
Выбор 2 Выбор 4

Мысли на доработку (не очень понимаю как реализовано):
1) Окно по ширине самого длинного значнеия
2) Повторный выбор в ячейки не работает, если что то выбрал выбрать еще раз
3) Как я понял макрос работает на все ячейки, как ограничить диапазон выдающих значений, если диапазонов и векторов результатов будет несколько?

Было бы очень круто :)

Изменено: phelex20.10.2017 07:01:04
(Исправил)

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

 

alex1210

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

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

 

alex1210

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

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

А если база на другой странице, например лист2 с первого столбца.. что надо изменить?

 

gling

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

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

#18

20.10.2017 00:00:13

Цитата
Виктор C написал:
какие переменные нужно менять в макросе

Если много разных списков, тогда лучше так. Переменную назвал НомерСтолбцаДанных (NomStolbDan), чтоб понятно было что менять.

Код
Private Sub TextBox1_Change()
    Dim X, i, txt As String, lt, s As String, NomStolbDan As Long
    If Len(TextBox1.Text) = 0 Or bu Then Exit Sub
    txt = TextBox1.Text
    lt = Len(TextBox1.Text)
    NomStolbDan = ActiveCell.Column + 11
    X = Лист1.Columns(NomStolbDan).SpecialCells(2).Value
    For i = 1 To Лист1.Cells(Rows.Count, NomStolbDan).End(xlUp).Row
        'If InStr(1, UCase(Лист1.Cells(i, NomStolbDan)), UCase(TextBox1.Value)) > 0 Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в любом месте текста
        If UCase(txt) = UCase(Mid(Лист1.Cells(i, NomStolbDan), 1, lt)) Then s = s & X(i, 1) & "~" 'формирует по сочетанию букв в начале текста
    Next i
    ListBox1.List = Split(s, "~")
End Sub

Прикрепленные файлы

  • КомБокс (1).xlsm (34.63 КБ)

 

alex1210

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

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

Не получается данные из листа 2 брать.Подскажите что в коде надо изменить

 

gling

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

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

Вместо Лист1 напишите имя листа с данными Sheets(«имя листа»).

Изменено: gling20.10.2017 00:39:46

 

alex1210

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

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

 

gling

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

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

#22

20.10.2017 00:42:47

Цитата
alex1210 написал:
Разобрался))))

А спасибо где?
Эх молодежь!

 

alex1210

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

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

 

alex1210

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

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

#24

20.10.2017 00:50:02

Вот просто код у Вас интересный , а почему Вы его так записали? Я просто учусь програмировать и хочу понять как и что

Код
NomStolbDan = ActiveCell.Column + 11
 

Ch.

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

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

Добрый день, уважаемые форумчане. В рамках данной темы у меня давно есть нерешенный вопрос. А именно: в приложенных файлах реализован поиск с выпадающем списком. Если копировать код из файлов-примеров возникает ошибка на отсутствие Textbox1 и Listbox1.  В иных подобных темах ответ звучал, что нужно их создать или скопировать в своем файле. Но ведь Ваши примеры работают без них, либо они скрыты?  И в таком случае как их скопировать из файлов примеров?

Изменено: Ch.20.10.2017 17:26:03

 

gling

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

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

#26

20.10.2017 18:55:32

Цитата
alex1210 написал:
а почему Вы его так записали?
Цитата
gling написал:
Писал не я, где то слямзил, сейчас уже не вспомню.

Но если речь только о переменной, то переменную уже я добавлял.
Могу перевести на русский

Цитата
alex1210 написал:
NomStolbDan = ActiveCell.Column + 11

Это: НомерСтолбцаСДанными=АктивнаяЯчейка.Столбец+11. Если активировать ячейку в столбце А тогда: НомерСтолбцаСДанными=СтолбецА+11=1+11=12=столбец№12=столбец L.
Активируем ячейку столбца В, тогда: НомерСтолбцаСДанными=СтолбецВ+11=2+11=13=столбец№13=столбец М и т.д….
Столбец()=порядковый номер столбца начиная от левого края листа

Изменено: gling20.10.2017 19:05:34

 

alex1210

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

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

 

gling

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

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

#28

20.10.2017 23:04:45

Цитата
Ch. написал:
как их скопировать из файлов примеров?

Жмете вкладку Разработчик—Режим конструктора—Ctrl+клик на форму ЛКМ (левой кнопкой мыша)—Копируем (Ctrl+C)—Вставляем (Ctrl+V). Возможно есть и другой вариант, но я делаю так.

 

Ch.

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

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

Спасибо Вам за исчерпывающий ответ.

 

phelex

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

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

#30

21.10.2017 12:46:46

gling, больше спасибо за ваши ответы.

Уточните пожалуйста, а возможно так сделать взаимозависимые списки?
Что для этого требуется?

Спасибо

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

Содержание

  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/

mc-black, возник вопрос по Вашему списку.Нашел небольшой недочет в ее появлении.
При выборе ячейки расположенных ~ до 100 строки форма появляется на экран но соответственно ее разположение постоянно меняется на экране.А когда выбираешь ячейку со строкой 100+ то и вовсе пропадает с экрана,видимо открывается вне его видимости.
Вопрос:как закрепить ее местоположения так ,чтобы она например окрывалась все время по центру вне зависимости в каком месте листа я нахожусь?
Долго просматривал код ,возможно вот здесь нужно помимо данных функций добавить еще чтото,касающееся ее расположения?

Visual Basic
1
2
Private Sub UserForm_Initialize()
    Me.Move ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left), ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top), ActiveCell.Width * 64  48

Очень большая просьба помочь…

Добавлено через 30 минут
Всегда,как чтото спрашиваю,тут же через 5 минут решаю сам эту проблему)
разобрался )
нужно было просто изменить в свойствах формы start up position на CenterScreen)

В данном примере написаны исходные коды VBA-макросов для проверки ячеек на наличие выпадающих списков (или любых средств, созданных инструментом «проверка данных»). А также код макроса для проверки и получения доступа к ячейкам, которые содержат условное форматирование.

Макрос поиска ячейки с выпадающим списком

Допустим у нас имеется таблица Excel сформированная в результате экспорта журнала фактур из истории взаиморасчетов с клиентами фирмы, как показано ниже на рисунке:

Таблица с выпадающими списками.

Нам необходимо найти все выпадающие списки или определить каким ячейкам присвоена проверка вводимых данных, создана инструментом: «ДАННЫЕ»-«Работа с данными»-«Проверка данных».

Проверка данных.

В программе Excel по умолчанию есть встроенный инструмент для поиска ячеек с проверкой правил вводимых значений. Чтобы его использовать следует выбрать: ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек». В появившемся диалоговом окне следует отметить опцию «проверка данных» и нажать на кнопку ОК.
Выделить группу ячеек.
Но как всегда более гибким решением является написание своего специального макроса. Ведь в такие случаи всегда можно усовершенствовать инструмент и дописать много других полезных функций. А этот код макроса послужит прекрасным началом программы.

Откройте редактор макросов Visual Basic (ALT+F11) и создайте новый модуль выбрав в редакторе инструмент: «Insert»-«Module». В созданный модуль введите VBA код макроса:

Sub ProvDan()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
On Error Resume Next
   For i = 1 To diapaz1.Count
     If IsError(diapaz1(i).Validation.Type) Then
       Else
       If diapaz2 Is Nothing Then
       Set diapaz2 = diapaz1(i)
       Else
       Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
On Error GoTo 0
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
  diapaz2.Select
  MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub

Visual Basic ALT+F11.

Если нужно выделить все ячейки в таблице, которые содержат проверку вводимых значений включенной инструментом «Проверка данных», тогда выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvDan»-«Выполнить».

В результате выделились 14 ячеек в столбце G, для которых включена проверка данных в стиле выпадающего списка:

Проверка данных.

В данном коде мы сначала выделяем все ячейки на текущем листе с помощью инструкции:

Cells.Select

После, определяем диапазон ячеек на листе, который использует исходная таблица и с которыми будет работать наш макрос. Чтобы определить диапазон таблицы на рабочем листе Excel, мы могли бы использовать свойство UsedRange при создании экземпляра объекта Range в переменной diapaz1. Данное свойство охватывает только непустые ячейки, а это может быть даже несмежный диапазон. Но таблица может содержать пустые ячейки для, которых присвоена проверка ввода значений. Чтобы наш макрос не игнорировал пустые ячейки внутри таблицы мы определяем смежный (неразрывный) диапазон, который начинается с ячейки A1 и заканчивается последней используемой ячейкой на рабочем листе Excel.

Set diapaz1 = Application.Range(ActiveSheet.Range(«A1»), ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))

Последняя ячейка находиться наиболее отдаленно от ячейки A1 (в данном примере – это G15) и была использована на листе (это обязательное условие). При чем использована в прямом смысле, она может даже не содержать значения, но иметь измененный числовой формат, другой цвет фона, другие границы, объединение и т.п. Чтобы найти последнюю используемую ячейку на листе стандартными средствами Excel, выберите инструмент: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».

Ячейки с выпадающими списками.

В появившемся окне следует выбрать опцию «последнюю ячейку». А после просто нажать ОК. Курсор клавиатуры сразу переместиться на последнюю используемую ячейку на рабочем листе Excel.

Можно даже при создании экземпляра объекта Range в переменной diapaz1 использовать диапазон целого листа. Для этого просто замените выше описанную инструкцию на:

Set diapaz1 = Selection

Так на первый взгляд даже проще, но тогда макрос будет проверять все ячейки на листе и потребует больше ресурсов. Особенно если мы при изменении этой инструкции не удалим инструкцию выделения всех ячеек на листе Excel. Таким кодом макроса, можно существенно снизить производительность работы программы Excel при его выполнении. Поэтому так делать не рекомендуется. Проверяйте ячейки только те, которые были использованы на листе. Так вы получите в десятки раз меньший диапазон и выше производительность макроса.

Далее в коде макроса перед циклом прописана инструкция для выключения обработки ошибок, выполняемых в коде.

On Error Resume Next

Но после конца цикла обработка ошибок снова включается.

On Error GoTo 0

Внутри цикла проверяться по отдельности все ячейки на наличие включенной проверки вводимых значений инструментом «Проверка данных». Если ячейка содержит проверку вводимых значений?

If IsError(diapaz1(i).Validation.Type) Then

Тогда она присоединяется к диапазону ячеек, находящихся в переменной diapaz2.

Set diapaz2 = Application.Union(diapaz2, diapaz1(i))

В конце кода выделяется несмежный диапазон переменной diapaz2, который включает в себя все выпадающие списки на текущем рабочем листе Excel. И сразу же выводиться сообщение о количестве найденных и выделенных ячеек в этом же диапазоне.

MsgBox «Найдено: » & diapaz2.Count & » ячеек!»



Макрос поиска ячейки с условным форматированием

Некоторые ячейки в исходной таблице содержат условное форматирование, а пользователю Excel необходимо их все найти и выделить. Очень часто нельзя визуально определить присвоено ли ячейке условное форматирование или нет. Чтобы найти и выделить ячейки с условным форматированием в Excel можно воспользоваться встроенным инструментом. Просто необходимо выбрать опцию в меню: «ГЛАВНАЯ»-«Редактирование»-«Найти и выделить»-«Выделить группу ячеек».

В появившемся окне отмечаем опцию «условные форматы» и нажимаем кнопку ОК.

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

Снова откройте редактор Visual Basic (ALT+F11) и в уже созданный модуль добавьте новый код для нового макроса:

Sub ProvFormat()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
   For i = 1 To diapaz1.Count
     If diapaz1(i).FormatConditions.Count > 0 Then
       If diapaz2 Is Nothing Then
       Set diapaz2 = diapaz1(i)
       Else
       Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
       End If
     End If
   Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной ячейки!"
Else
  diapaz2.Select
  MsgBox "Найдено: " & diapaz2.Count & " ячеек!"
End If
End Sub

Теперь чтобы проверить, посчитать и выделить все ячейки для которых было применено любое условное форматирование запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«ProvFormat»-«Выполнить».

В результате будут выделены все соответствующие ячейки и отобразиться сообщение с информацией о их количестве:

Диапазон с условным форматированием.

В этом макросе уже нет необходимости отключать контроль ошибок в процессе выполнения инструкций внутри цикла.

Проверка ячеек на наличие условного форматирования выполняется с помощью свойства Cuont для объекта FormatConditions. Если данное свойство возвращает значение 0, то для текущей ячейки не применялось ни одно условное форматирование.

If diapaz1(i).FormatConditions.Count > 0 Then

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

Сombobox в userform как сделать поиск из выпадающего списка?

RomanCompass

Дата: Понедельник, 23.08.2021, 18:23 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

Уважаемые знатоки и все кто разбирается в ЭКСЕЛЬ лучше чем я :D
Нужна помощь с осуществление такой задачи .
Если кто знает как сделать поиск по первым буквам в выпадающем списке Сombobox в userform буду признателен ?

Сообщение отредактировал RomanCompassПонедельник, 23.08.2021, 22:33

 

Ответить

Kuzmich

Дата: Понедельник, 23.08.2021, 18:48 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

 

Ответить

RomanCompass

Дата: Понедельник, 23.08.2021, 22:35 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

ВОТ ЗДЕСЬ КАК ОСУЩЕСТВИТЬ ПОИСК ?

К сообщению приложен файл:

1701276.png
(133.2 Kb)

Сообщение отредактировал RomanCompassПонедельник, 23.08.2021, 22:38

 

Ответить

bmv98rus

Дата: Вторник, 24.08.2021, 08:24 |
Сообщение № 4

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

вы ж сами это запретили
нужно в инициализации формы
[vba]

Код

ComboBox_coutry.MatchEntry = fmMatchEntryFirstLetter

[/vba]


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

RomanCompass

Дата: Пятница, 27.08.2021, 10:55 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

Спасибо за подсказку !
В принципе можно и так работать ,но хотелось бы чтобы поиск работал не только по первой букве но и по совпадению 2-3 символов независимости от их положения .Например Skoda Fabia ITY 7916 ,при наборе 79 чтобы выделялась из списка .
как то так

 

Ответить

bmv98rus

Дата: Пятница, 27.08.2021, 11:53 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

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


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

RomanCompass

Дата: Суббота, 28.08.2021, 17:35 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

bmv98rus, Можно по подробней ?
дело в том что я только только начинаю вникать в елсел и пока мало что понимаю .

 

Ответить

bmv98rus

Дата: Суббота, 28.08.2021, 18:11 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

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

Если серьезно, то отключить тот поиск который встроен и по событию ввода в комбобокс символа, осуществлять поиск и наполнение комбобокса элементами одним из способов. Это может быть просто перебор диапазон , массива со сравнением а есть ли то что написано там и если есть то добавляем в список, или ADO запрос к диапазону .


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

RomanCompass

Дата: Суббота, 28.08.2021, 18:34 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

bmv98rus, кроме того что это так просто и что вам лень писать дранный код не чего не понял .
Как бы не на что не претендую .
попытаюсь разобраться .

 

Ответить

Pelena

Дата: Суббота, 28.08.2021, 19:03 |
Сообщение № 10

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

RomanCompass, по мотивам ссылки из второго сообщения

К сообщению приложен файл:

9837161.xlsm
(72.5 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

RomanCompass

Дата: Суббота, 28.08.2021, 22:23 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

Pelena, добавил к коду ComboBox_coutry.DropDown и все заработало как и хотел .
Спасибо большое !

Сообщение отредактировал RomanCompassСуббота, 28.08.2021, 22:36

 

Ответить

RomanCompass

Дата: Суббота, 28.08.2021, 22:38 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

Pelena, рано я обрадовался .
Не работает заполнение Combox-a в форме по символам .

 

Ответить

bmv98rus

Дата: Воскресенье, 29.08.2021, 08:20 |
Сообщение № 13

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

просто нужно обрабатывать события Key….. например KeyUp только нужно помнить что ряд кнопок сисетмные например ESC и тут тоже надо обработать.


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

RomanCompass

Дата: Воскресенье, 29.08.2021, 16:35 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 35


Репутация:

10

±

Замечаний:
0% ±


Excel 2016

bmv98rus,для меня это пока что темый лес .Я только начинаю пользоваться excel .

 

Ответить

bmv98rus

Дата: Воскресенье, 29.08.2021, 19:12 |
Сообщение № 15

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

[vba]

Код

Private Sub ComboBox_coutry_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim x, s As String, s1
    With ComboBox_coutry
        x = Лист2.ListObjects(«Таблица1»).DataBodyRange.Columns(2).Value
        For Each s1 In x
            If InStr(LCase(s1), LCase(.Text)) Then s = s & «~» & s1   ‘поиск по любому вхождению
        Next
        .List = Split(Mid(s, 2), «~»)
        .DropDown
    End With
End Sub

[/vba] да и ESC и прочее надо обрабатывать.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rusВоскресенье, 29.08.2021, 19:13

 

Ответить

R_Dmitry

Дата: Воскресенье, 29.08.2021, 22:00 |
Сообщение № 16

Группа: Друзья

Ранг: Участник

Сообщений: 74


Репутация:

34

±

Замечаний:
0% ±


2010

Я бы вынес обращение к листу из этого события.

К сообщению приложен файл:

4301278.xlsm
(73.3 Kb)


{Skype : RDG_Dmitry} Если программа тебе понятна,значит она уже устарела

 

Ответить

bmv98rus

Дата: Воскресенье, 29.08.2021, 22:26 |
Сообщение № 17

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

Я бы вынес обращение к листу

это не главное, а вот то что ESC отрабатывает не корректно, должен происходить сброс или… Прочие кнопочки тоже надо предусматривать типа TAB ….


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

R_Dmitry

Дата: Воскресенье, 29.08.2021, 23:30 |
Сообщение № 18

Группа: Друзья

Ранг: Участник

Сообщений: 74


Репутация:

34

±

Замечаний:
0% ±


2010

ESC отрабатывает не корректно

Это Вы так решили? у меня корректно, так как и задумал.


{Skype : RDG_Dmitry} Если программа тебе понятна,значит она уже устарела

 

Ответить

bmv98rus

Дата: Понедельник, 30.08.2021, 10:39 |
Сообщение № 19

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016


Тогда , какова была задумка?


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

R_Dmitry

Дата: Понедельник, 30.08.2021, 11:53 |
Сообщение № 20

Группа: Друзья

Ранг: Участник

Сообщений: 74


Репутация:

34

±

Замечаний:
0% ±


2010

Ну Вы же код читать умеете :)


{Skype : RDG_Dmitry} Если программа тебе понятна,значит она уже устарела

 

Ответить

Like this post? Please share to your friends:
  • Поиск по выпавшему списку в excel
  • Поиск по выделенному тексту word
  • Поиск по вхождению слова excel
  • Поиск по всему столбцу в excel vba
  • Поиск по всему документу excel