Страницы: 1
RSS
Фильтрованный выпадающий список средствами VBA
 
Доброго времени суток, форумчане!
Недавно нашел интересный пример поиска по базе данных.

Помогите пожалуйста разобраться с кодом и немного модифицировать его.
Модифицировать нужно следующее: поиск для списка(listbox), должен проходить на другом листе а не на одном, как в примере.
Вот часть кода:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
Select Case Target.Column
    Case 4, 17 'столбцы на которых срабатывает макрос
        If Target.Row > 3 Then 'строка после которой начинает работать макрос
            bu = True
            With Me.TextBox1
                .Top = Target.Top: .Left = Target.Left: .Text = Target.Value: .Activate 'позиция текстбокса ?????????
            End With

            With Me.ListBox1
                .Top = Target.Top - 10: .Left = Target.Left + 143: .Clear 'позиция листбокса
            End With
            cl = IIf(Target.Column = 4, 22, 25): bu = False           'почему в IIf(Target.Column = 4, 22, 25) три параметра "4,22,25" - я так понимаю что это столбцы для поиска в список, 
                                              ' но если искать только по 1 столбцу, все равно надо эти три параметра?

            Me.TextBox1.Visible = True: Me.ListBox1.Visible = True
        End If
    Case Else
        Me.TextBox1.Visible = False: Me.ListBox1.Visible = False
End Select
End Sub
Если я где-то неправильно закомментировал, прошу поправить.
В VBA  я недавно, поэтому прошу помощи у Вас.
 
Цитата
gogi пишет: почему в IIf(Target.Column = 4, 22, 25) три параметра
Прочтите справку по функции IIf.
Согласие есть продукт при полном непротивлении сторон
 
При вводе данных в ячейки столбцов D и Q находятся совпадения по первым символам из данных столбцов V и Y, и формируется список из найденных строк. При выборе строки из списка эта строка записыватеся в активную ячейку.

1. Как сделать, чтобы код работал только когда вводишь данные в столбец А?
2. Как сделать, чтобы поиск, для формирования списка, происходил на другом листе, например по столбцу B на "Лист1", а не на V и Y на текущем листе?

Не совсем понимаю что делает эта строка:
Код
cl = IIf(Target.Column = 4, 22, 25): bu = False
 
и почему там три параметра "4, 22, 25". 22 и 25 - это столбцы, для поиска данных для формирования списка. И если мы будем искать строки для формирования списка только по одному столбцу, то как тогда будет выглядеть данная строка?
Изменено: gogi - 02.10.2014 22:43:48
 
C IIf - разобрался. IIf( условие, условие выполняется, условие не выполняется). примерно так. Но если поиск строк для списка будем производить только по одному столбцу, я так думаю что,  IIf сюда уже не подходит. Тогда как правильно написать код чтобы произвести поиск только по одному столбцу?
 
IIf - аналог функции ЕСЛИ, все верно.
Не понятно, что в коде делают cl и bu - это глобальные переменные? Не могу посмотреть код с телефона, увы.
Если отвечать на вопросы по пунктам, то 1) поставить в 4 строке "Case 1" вместо "Case 4, 17" - это если не переписывать на If-Then. Плюс, эта процедура реагирует на изменение выделения на листе. Если нужно, чтобы она срабатывает на изменение данных, то тогда нужно ее изменить на Worksheet_Change
F1 творит чудеса
 
Цитата
1. Как сделать, чтобы код работал только когда вводишь данные в столбец А?
Код
If Target.CountLarge > 1 Or Target.Column <> 1 Then Exit Sub 
и удалить конструкцию Select Case
Цитата
2. Как сделать, чтобы поиск, для формирования списка, происходил на другом листе, например по столбцу B на "Лист1"
Явно указывать нужный лист в процедуре, в которой у Вас формируется список для ListBox.  
На вскидку: в процедуре Private Sub TextBox1_Change(), строку x = Columns(cl).SpecialCells(2).Value записать, например как

Код
x = Sheets("Лист1").Columns(cl).SpecialCells(2).Value
Не проверял. Это как пример !!!
Изменено: Sanja - 02.10.2014 22:43:56
Согласие есть продукт при полном непротивлении сторон
 
Код
x = Sheets("Лист1").Columns(cl).SpecialCells(2).Value
 
Если простыми словами то эту строку можно расшифровать примерно так: лист=>столбец =>ячейка формата "текст" => значение, Правильно понимаю?

Пошел экспериментировать.
Спасибо ребята!
Изменено: gogi - 02.10.2014 22:51:50
 
А чему будет равен Х,  если таких SpecialCells несколько на листе?
F1 творит чудеса
 
Всех приветствую!
Благодаря вашим советам получилось то, что я хотел. Но вот вот возникла следующая идея - своими силами к сожалению реализовать это не могу.
Собственно вопрос: Как в ListBox-е сделать так, чтобы отображались данные не только того столбца, который мы ищем, а столбцы с А по D. Тоесть сечас в ListBox-е выводятся данные только столбца s/n, а хотелось бы, чтобы чтобы выводились данные из столбцов ID - model - s/n - inv.

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

пробовал создать список, в надежде что при вводе символов начнут выпадать предлагаемые данные для выбора, но к сожалению выскакивает просто ошибка ввода данных
 
D.mоn, а не пробовали поиском по форуму? Я скопировал Вашу фразу в запрос и получил этот список тем.
Страницы: 1
Читают тему
Наверх