Поиск в выпадающем списке 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, больше спасибо за ваши ответы.

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

Спасибо

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

С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} Если программа тебе понятна,значит она уже устарела

 

Ответить

В данном примере написаны исходные коды 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

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

Скриншот формы ввода (выпадающий список с поиском)

Надстройка для облегчения ввода значений в ячейку 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»);
  • поиска с учетом регистра и без него;
  • маски поиска;
  • заголовков.
  • 160194 просмотра

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

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

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)

Понравилась статья? Поделить с друзьями:
  • Поиск в выделенном фрагменте word
  • Поиск в выделенном диапазоне excel
  • Поиск в больших массивах excel
  • Поиск в базе данных vba excel
  • Поиск в word спецсимволы