Форум программистов, компьютерный форум, киберфорум
Наши страницы

VBA

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Extremo
4 / 0 / 2
Регистрация: 07.12.2009
Сообщений: 39
#1

Выпадающий список, отфильтрованный по введенным буквам - VBA

15.11.2012, 16:21. Просмотров 5416. Ответов 8
Метки нет (Все метки)

Здравствуйте, нужны советы, подскажите с чего начать, чем пользоваться в таком вот деле:
Каждый день создаю документ, в котором указываю фамилии людей и виды работ, которые они будут делать за рабочий день. Хочу ускорить процесс набора этих самых фамилий( около 200 людей). Вот примерно что хочу: начинаешь набирать фамилию, выпадает списочек фамилий соответствующих набору, делаю выбор нужной из списка. Возможно кто-то делал уже что-то подобное, мне бы пример, а я разберусь думаю дальше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 16:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выпадающий список, отфильтрованный по введенным буквам (VBA):

Фильтр содержимого в ComboBox по первым введенным буквам - VBA
Доброго времени суток. Подскажите пожалуйста есть ли возможность реализовать такую вещь? Есть combobox, например с фамилиями, можно ли...

Отфильтрованный список на листе Excel - VBA
Kak mojno na Listbox-e v Excel pokazatj otfiljtrovannyj spisok SPASIBO

Как получить отфильтрованный список в Excel VBA? - VBA
Подскажите, пожалуйста, если в результате применения фильтра на странице в Excel скрывается часть строк, как узнать какие строки остались...

Помогите записать отфильтрованный список в форму Excel - VBA
Подскажите, какой для записи отфильтрованного списка нужно использовать объект на форме. Хочу чтобы эти данные были в форме, а не на листе...

Выпадающий список - VBA
Доброго времени суток, прошу помощи, на листе Товары есть данные за 2010-2015 гг, на 2016-2018 прогноз, в выпадающем списке надо 2016,...

Выпадающий список - VBA
Возникла некая проблема с реализацией выпадающего списка. Есть некая область в скрытом листе(название листа $), в которой находятся...

8
Romas654
116 / 30 / 2
Регистрация: 16.11.2012
Сообщений: 65
16.11.2012, 10:52 #2
Есть такой пример. На его основе раньше кое-что делал.
0
Вложения
Тип файла: xls autocomplete.xls (45.0 Кб, 404 просмотров)
mc-black
2744 / 677 / 97
Регистрация: 04.02.2011
Сообщений: 1,393
16.11.2012, 18:02 #3
Мой пример ComboBox'а с поиским похходящих строк во время ввода. Посложней для понимаания, но вроде удобный. Поиск производится одновременно по принципу "Начинается с", а также список дополняется результатами условия "Содержит". Писался для вставки связанного с искомым полем значения - поиск идетификатора в каталоге с подстановкой.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
Option Explicit
 
 
Dim txtArr() As Variant
 
 
' Сортировка двумерного массива (1 to m, 1 to 1) As Variant как текст
Private Sub SortArray(SortArr() As Variant)
    Dim i&, j&, t$(2)
    
    j = UBound(SortArr, 1) - 1
    Do While j >= 1
        i = 1
        Do While i <= j
            If UCase(SortArr(i, 1)) > UCase(SortArr(i + 1, 1)) Then
                t(1) = SortArr(i + 1, 1)
                t(2) = SortArr(i + 1, 2)
                SortArr(i + 1, 1) = SortArr(i, 1)
                SortArr(i + 1, 2) = SortArr(i, 2)
                SortArr(i, 1) = t(1)
                SortArr(i, 2) = t(2)
            End If
            i = i + 1
        Loop
        j = j - 1
    Loop
End Sub
 
 
' Фильтрация массива по маске, используемой с операцией Like
Private Function FilterArray(Src() As Variant, Dst(), Filter As String) As Long
    Dim i&, m&, n&(2), k&, l&(4), b() As Boolean
    
    m = UBound(Src, 1)
    ReDim b(1 To m, 1 To 2) As Boolean
    
    ' Поиск по правилу "Начинается с"
    n(1) = 0
    i = 1
    Do While i <= m
        If UCase(Src(i, 1)) Like UCase(Filter) Then
            If n(1) = 0 Then l(1) = i
            b(i, 1) = True
            n(1) = n(1) + 1
            l(2) = i
        End If
        i = i + 1
    Loop
    
    ' Поиск по правилу "Содержит"
    n(2) = 0
    i = 1
    Do While i <= m
        If Not UCase(Src(i, 1)) Like UCase(Filter) Then
        If UCase(Src(i, 1)) Like UCase("*" & Filter) Then
            If n(2) = 0 Then l(3) = i
            b(i, 2) = True
            n(2) = n(2) + 1
            l(4) = i
        End If
        End If
        i = i + 1
    Loop
    
    If n(1) + n(2) > 0 Then ReDim Dst(1 To n(1) + n(2), 1 To 2)
    If n(1) > 0 Then
        k = 0
        i = l(1)
        Do While i <= l(2)
            If b(i, 1) Then
                k = k + 1
                Dst(k, 1) = Src(i, 1)
                Dst(k, 2) = Src(i, 2)
            End If
            i = i + 1
        Loop
    End If
    If n(2) > 0 Then
        i = l(3)
        Do While i <= l(4)
            If b(i, 2) Then
                k = k + 1
                Dst(k, 1) = Src(i, 1)
                Dst(k, 2) = Src(i, 2)
            End If
            i = i + 1
        Loop
    End If
    FilterArray = n(1) + n(2)
End Function
 
 
' Заполнение массива и комбо при выборе
Private Sub cmbFind_Enter()
    Dim wsh As Worksheet, m&
    
    Set wsh = ThisWorkbook.Worksheets(1)
    
    m = wsh.Cells.SpecialCells(xlCellTypeLastCell).Row
    txtArr = wsh.Range(wsh.Cells(2, 1), wsh.Cells(m, 2)).Value
    Call SortArray(txtArr)
    
    cmbFind.MatchEntry = fmMatchEntryNone
    cmbFind.ListRows = 20
    cmbFind.ColumnCount = 2
    cmbFind.ColumnWidths = "35" & Application.DecimalSeparator & "86;0"
    cmbFind.List = txtArr
    
    Set wsh = Nothing
End Sub
 
 
' Поиск текста при наборе
Private Sub cmbFind_Change()
    Dim t$, srhArr(), r&
    
    Application.EnableEvents = False
    
    t = cmbFind.Text
    If t <> "" Then
        r = FilterArray(txtArr, srhArr, t & "*")
        If r > 0 Then
            ' Комбинация символов найдена
            cmbFind.List = srhArr
        Else
            ' Комбинация символов не найдена
            cmbFind.Clear
            cmbFind = "" ' Сброс, если нет результатов
        End If
    Else
        ' Пустое поле - показать все
        cmbFind.List = txtArr
    End If
    cmbFind.DropDown
    
    Application.EnableEvents = True
    
    If cmbFind.ListIndex >= 0 Then MsgBox cmbFind.List(cmbFind.ListIndex, 1)
End Sub
 
Private Sub UserForm_Click()
 
End Sub
3
Вложения
Тип файла: xls Поиск ComboBox 2.xls (53.0 Кб, 430 просмотров)
mc-black
2744 / 677 / 97
Регистрация: 04.02.2011
Сообщений: 1,393
16.11.2012, 18:08 #4
Есть также вариации этого алгоритма, где поиск производится или строго "Начинается с", или строго с "Сожержит". Там чуть-чуть проще. И возможно меньше "багов".
1
Extremo
4 / 0 / 2
Регистрация: 07.12.2009
Сообщений: 39
17.11.2012, 02:23  [ТС] #5
Спасибо ребята за помощь! Спасибо всем кто откликнулся. Начну разбираться, думаю всё получиться)
0
Дмитрий2015
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 3
16.01.2015, 20:48 #6
Добавлено через 6 минут
Цитата Сообщение от mc-black Посмотреть сообщение
Мой пример ComboBox'а
Добрый день! Очень хороший код с массивом - спасибо. В данном коде предусмотрен выбор из выпадающего списка необходимого наименования с помощью мышки (можно щелкнуть кнопкой мыши по 2 или 3 или т.д. значению в подобранном списке), при этом, если попытаться осуществить выбор с помощью клавиатуры (стрелка вниз), то сразу же комбобокс принимает первое значение в полученном списке. Подскажите, пожалуйста, а возможно ли сделать так, чтобы необходимое значение в полученном списке можно было выбирать с помощью стрелки (вниз/вверх) на клавиатуре?
0
mc-black
2744 / 677 / 97
Регистрация: 04.02.2011
Сообщений: 1,393
22.01.2015, 10:41 #7
Пока не могу дать ответ на Ваш вопрос, Дмитрий2015, надо пробовать что-то изменить в коде. Получится или нет - рано говорить. И да, если получится, будет удобней работать с одной клавиатуры без использования мыши - я люблю это. Сейчас, к сожалению некогда заниматься макросами - много другой важной работы..
0
nodirstein
25 / 25 / 8
Регистрация: 12.04.2015
Сообщений: 75
10.06.2017, 20:38 #8
У меня была такая-же задача, искал решения во многих форумах, но так и не нашел решения.
Пришлось самому изобретать велосипед ))
Ответ оказался очень простым.
Саму процедуру поиска я взял с какого-то сайта, сам уже не помню с какого.
Но вот как сделать так что-бы можно было выбирать один из вариантов с помощью стрелок вверх/вниз так и не нашел.
Ответ оказался довольно простым, просто процедуру поиска нужно задавать на событие нажатия какой-либо вообще клавиши. Поставить условие на то что-бы поиск производился только в том случае если нажали на любую клавижу кроме стрелок вверх/вниз.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub cmbFind_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 38 Or KeyCode = 40 Then
    Exit Sub
    Else
        Dim a
        cmbFind.List = [aaa].Value
        a = Application.Transpose(cmbFind.List)
        If cmbFind.Value = "" Then
            cmbFind.List = [aaa].Value
        Else
            a = Filter(a, cmbFind.Value, True, vbTextCompare)
            cmbFind.List = a
        End If
        cmbFind.DropDown
    End If
End Sub
0
nodirstein
25 / 25 / 8
Регистрация: 12.04.2015
Сообщений: 75
10.06.2017, 20:47 #9
Забыл прикрепить файл

Поиск ComboBox 2.xls
0
10.06.2017, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2017, 20:47
Привет! Вот еще темы с ответами:

Выпадающий список - VBA
Дорогие форумчане, пожалуйста, подскажите по поводу выпадающего списка. Существует зависимый выпадающий список, работает замечательно. ...

Выпадающий список макрос - VBA
День добрый, господа! Задача стоит простейшая, чтобы выбранное значение из выпадающего списка вставляло в соседнюю ячейку имя, и...

Выпадающий список с мультивыбором? - VBA
Доброго всем знатокам! Сам не осилил, прошу помощи! Есть задача, необходимо создать выпадающий список, значения в списке должны...

Выпадающий список со значением - VBA
есть прайс лист в котором два столбца. в первом наименование товара, во втором цена. есть форма в которой в выпадающий список...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.