Excel vba listbox filter

 

keny

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

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

Помогите создать фильтр в listbox по параметрам (цена,код,наименование,артикул).

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

  • 798.xls (71.5 КБ)

 

ber$erk

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

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

Учимся сами и помогаем другим…

 

keny

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

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

заходил уже,у меня должно быть все проще,как в примере.

 

ber$erk

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

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

а вы попробуйте сперва на этой основе написать что-то под себя, а что не будет получаться спрашивайте здесь.

Учимся сами и помогаем другим…

 

keny

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

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

Открыл,но это совсем не то,что нужно.

Изменено: keny19.02.2013 20:30:36

 

Юрий М

Модератор

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

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

Фильтровать нужно по полному совпадению или по частичному? Например, наименование.

 

keny

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

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

 

Юрий М

Модератор

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

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

По частичному, наверное, для наименования и артикула, если судить по данным.
Ещё вопросы:
1. У Вас перепутаны радиокнопки: по цене — называется код, по коду — имя… Где истина — в Caption или в именах?
2. В ListBox 6 столбцов, данные в пяти. Куда планировали шестой столбец?
===
Вы не стесняйтесь — подробнее описывайте.

 

keny

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

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

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

Изменено: keny19.02.2013 19:35:09

 

Юрий М

Модератор

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

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

keny, я уже начал переделывать (а фактически заново писать) код, если Вы будете скрывать важные детали, то я откажусь от этой затеи. Вы поленились создать заголовки в таблице. Если с наименованием, артикулом и остатком всё понятно, то понять, где код, а где цена — я затрудняюсь. Не подскажете?

 

keny

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

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

у меня мало опыта работы с вба,по этом не поленился,просто не сталкивался.код 4,цена 5 стобец.

Изменено: keny19.02.2013 19:42:16

 

Юрий М

Модератор

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

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

#12

19.02.2013 19:57:25

Цитата
keny пишет:
для наименования,артикула и цены

У меня сомнения — цену тоже искать приблизительную? Как Вы себе это представляете?

 

keny

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

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

например если у двух товаров совпадает цена то в листбокс их останется 2,если совпадает артикул тоже самое и т.д.

 

Юрий М

Модератор

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

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

Совпадает — это одно, а частично (приблизительно) — несколько иное. Определитесь На мой взгляд, поиск по цене должен быть точным. Остаётся для частичного совпадения артикул и наименование.

 

Z

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

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

Win 10, MSO 2013 SP1

#15

19.02.2013 20:10:41

Цитата
Юрий М пишет: … У меня сомнения…
Цитата
keny пишет: … мало опыта работы с вба,по этом не поленился,просто

Уж замуж невтерпёж…
А ведь как бы было прекрасно: без дерганья, хорошо продумав, дать/получить пример в реальной структуре и форматах, и со спокойной совестью выдать/получить выполненную заветную хотелку…
Куда спешим, юнги и рулевые?.. ;)

«Ctrl+S» — достойное завершение ваших гениальных мыслей!.. ;)

 

keny

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

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

Извеняюсь, не так понял. Да действительно, Вы правы, было бы правельней оставить точное совпадение по цене.

 

Юрий М

Модератор

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

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

См. файл. При начальной загрузке формы в ЛистБокс будет выведено ВСЁ. Затем уже фильтрация по радиокнопкам и поисковому запросу.

 

Юрий М

Модератор

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

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

Забыл про выделение нужной строки (ячейки) по клику в ЛистБоксе. Исправил.

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

  • 798-02.xls (74.5 КБ)

 

keny

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

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

юрий спасибо!все очень круто работает.

 

echo

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

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

Юрий,

я использовал ваш код из этого файла для своей формы. Спасибо за отличный пример!

Вы не могли бы ответить на вопрос, я код разобрал, но только не понял двух моментов :oops: :

1. что по смыслу значит <Add Item «»> когда вы добавляете и раскидываете значения по листам Listbox в разные колонки?

2. и за счет чего происходит поэтапная фильтрация, если при каждом нажатии CommandButton лист очищается командой Me.listbox.clear?

Спасибо!

 

Юрий М

Модератор

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

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

1. Добавление новой строки в ListBox.
2. .Clear — сначала полностью очищаем содержимое ListBox, а затем заново заполняем его по условию. Если предварительно не очистить — останутся старые значения и снизу допишутся новые.

 

echo

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

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

Юрий, а за счет чего у вас в примере данные могут фильтроваться поэтапно, т.е. скажем, сначала по артикулу, потом из того, что отфильтровано по продукту, а затем, скажем по номеру.
Т.е. получается многоуровневый фильтр.
Там ведь как я понял при выполнении каждого условия (нажатии commond button) listbox отчищается, или я чтото не так понял?  :D

 

Юрий М

Модератор

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

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

Не понял вопрос — про какой многоуровневый фильтр Вы говорите?
Повторюсь: каждый раз ListBox очищается и заполняется заново.

 

echo

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

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

я когда фильтрую по вашему примеру, который вы keny сделали, там получается что, например, если я отфильтровал по артикулу 9, то он соответственно выдает список с этим артикулом,
но потом, если я выберу и применю критерий, скажем, Наименовение 28
в уже отфильтрованном списке он уберет все что не «28» при этом не обновляя сам листбокс.
Получается, что в вашем примере, можно фильтровать уже отфильтрованные данные и при каждом новом критерии, листбокс не отчищается. Такая вот штука.
Как вы это сделали, я и как раз и не могу понять  :(

 

Юрий М

Модератор

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

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

#25

09.04.2013 22:02:03

Цитата
echo пишет:
Получается, что в вашем примере, можно фильтровать уже отфильтрованные данные и при каждом новом критерии, листбокс не отчищается.

Неправильно! Сначала ListBox очиащается, а потом заполняется заново. Это я уже третий раз Вам говорю. В коде есть акая строка:
Me.ListBox2.Clear она и занимается очисткой содержимого ListBox. И выполняется при КАЖДОМ нажатии на кнопку.

 

echo

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

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

походу мне сегодня хорошо жбан сорвало за компом  :D  да, вы правы, я туплю уже много раз за сегодня  :oops:

А вы не подскажете, как можно реализовать многоуровневый фильтр для listbox?
Хотя бы в каком направлении мне двигаться

Спасибо

 

Юрий М

Модератор

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

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

Что подразумевается под многоуровневым?

 

echo

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

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

Имеется ввиду, что я смогу отфильтровать данные в листбоксе по нескольким критериям.
Из примера keny, я бы хотел выбрать артикул 9 и из выбранного выбрать только наименование 28, а потом из наименования 28 выбрать конкретный код.

 

Юрий М

Модератор

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

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

При варианте с радиокнопками так не получится — нужен множественный выбор, а для этого они не годятся. Выручат ЧекБоксы. Но тогда потребуется и три (минимум) поля для ввода критериев. А может Вам будет достаточно расширенного фильтра? )

 

echo

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

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

#30

10.04.2013 01:54:41

Да Юрий, я согласен с вами на счет optionbuttons.
Вообще я использовал Combobox, я подвесил файл.
Просто я подумывал реализовать через combobox т.к. Departments и Locations могут периодически меняться в связи с добавлением новых записей, а так их значения подтягиваются непосредственно из регистра, мне показалось это проще   :|  

А на счет расширенного фильтра в UserForm я пока такого не знаю  :(  А вы не могли бы подробнее рассказать?

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

  • ListBox.rar (39.87 КБ)

Содержание

  1. Exceltip
  2. Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки
  3. Расширенный фильтр в Excel с символами подстановки и уникальными значениями на VBA
  4. Вам также могут быть интересны следующие статьи
  5. 6 комментариев
  6. Excel vba listbox filter
  7. filter a ListBox with a Combobox on VBA
  8. 1 Answer 1
  9. Working with LIST BOXES (Form Controls)
  10. 1. Create a List Box
  11. 2. Assign macro to List Box
  12. 3. Add values to a List Box
  13. 4. Link List Box to a cell
  14. 5. Delete values in a List box
  15. 6. Set default value in a List Box
  16. 7. Allow multiple selected values in a List Box
  17. 8. Read selected value from Listbox
  18. Get the Excel file
  19. LISTBOXES examples
  20. SHAPES examples

Exceltip

Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки

Расширенный фильтр в Excel с символами подстановки и уникальными значениями на VBA

Когда вы работаете с большими объемами данных, нельзя представить себе эту деятельность без фильтров. Однозначно, что в Excel разработан очень мощный и удобный инструмент фильтрации, который позволяет выбирать определенные данные из диапазона. А с приходом Excel 2007 добавилась возможность выбирать данные с определенной заливкой. Все это облегчает рабочие будни Excel юзеров и упрощает жизнь. Однако, есть еще один элемент, который пока еще не реализован в стандартных фильтрах Excel, но приятно было бы иметь в арсенале, я говорю о фильтрации с помощью символов подстановки, который мы попытаемся сегодня реализовать с помощью VBA.

Оригинальную статью можно найти на сайте https://yoursumbuddy.com/

В данной статье описан способ создания фильтра на основе формы ListBox на VBA. Фильтр использует оператор Like, для поиска соответствий в заданном диапазоне. К примеру, набрав в фильтре celti, программа вернет мне значение Exceltip, но это не самое главное, так как стандартный фильтр позволяет проводить подобные манипуляции. Гораздо интереснее, что оператор Like позволяет использовать символы подстановки, таким образом введя в текстовое поле значение /*/201? , Excel вернет все даты начиная с 2010 года. Плюс ко всему, данный фильтр позволяет задавать чувствительность к регистру и отбирать уникальные значения.

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

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

Sub ResetFilter()
Dim rngTableCol As Excel.Range
Dim varTableCol As Variant
Dim RowCount As Long
Dim collUnique As Collection
Dim FilteredRows() As String
Dim i As Long
Dim ArrCount As Long
Dim FilterPattern As String
Dim UniqueValuesOnly As Boolean
Dim UniqueConstraint As Boolean
Dim CaseSensitive As Boolean

‘звездочка возвращает все значения списка
If Not ValidLikePattern(Me.txtFilter.Text) Then
Exit Sub
End If
FilterPattern = «*» & Me.txtFilter.Text & «*»

UniqueValuesOnly = Me.chkUnique.Value
CaseSensitive = Me.chkCaseSensitive

‘используется, если Уникальные значения равно ИСТИНА
Set collUnique = New Collection
Set rngTableCol = loActive.ListColumns(1).DataBodyRange
‘обратите внимание, функция Transpose не работает с больше, чем 65536 строчек
varTableCol = Application.WorksheetFunction.Transpose(rngTableCol.Value)
RowCount = UBound (varTableCol)
ReDim FilteredRows(1 To 2, 1 To RowCount)
For i = 1 To RowCount
If UniqueValuesOnly Then
On Error Resume Next
‘сброс цикла
UniqueConstraint = False
‘не добавляет, если не уникальное значение
collUnique.Add Item:= «test» , Key:=CStr(varTableCol(i))
If Err.Number <> 0 Then
UniqueConstraint = True
End If
On Error GoTo 0
End If

If Not UniqueConstraint Then
‘Оператор Like чувствителен к регистру,
‘поэтому необходимо использовать команду Lcase, если галка не стоит
If ( Not CaseSensitive And LCase(varTableCol(i)) Like LCase(FilterPattern)) _
Or (CaseSensitive And varTableCol(i) Like FilterPattern) Then
‘добавить в массив, если пункт из ListBox соответствует фильтру
ArrCount = ArrCount + 1
‘в ListBox есть скрытый столбец для нумерования элементов
FilteredRows(1, ArrCount) = i
FilteredRows(2, ArrCount) = varTableCol(i)
End If
End If
Next i
If ArrCount > 0 Then
‘удаляем пустые элементы массива
‘ListBox не может содержать более 65536 элементов
ReDim Preserve FilteredRows(1 To 2, 1 To Application.WorksheetFunction.Max(ArrCount, 65536))
Else
Erase FilteredRows
End If
If ArrCount > 1 Then
Me.lstDetail.List = Application.WorksheetFunction.Transpose(FilteredRows)
Else
Me.lstDetail.Clear
‘добавляем отдельно, если найден только один элемент
If ArrCount = 1 Then
Me.lstDetail.AddItem FilteredRows(1, 1)
Me.lstDetail.List(0, 1) = FilteredRows(2, 1)
End If
End If
End Sub

В этом макросе использована возможность элемента Collection хранить только уникальные значения. Если на форме установлена галочка Уникальные, то макрос проверит его прежде, чем поместит в массив ListBox.

Переменная FilterPattern имеет звездочки в начале и конце строки. Это позволяет находить записи внутри таблицы.

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

Private Sub lstDetail_Change()
GoToRow
End Sub

Sub GoToRow()
If Me.lstDetail.ListCount > 0 Then
Application. Goto loActive.ListRows(Me.lstDetail.Value).Range.Cells(1), True
End If
End Sub

Скорость макроса достаточно приемлема для таблиц с менее чем 10000 строками. Но даже с превышением этого порога, макрос будет работать, главное, чтобы число строк было менее 65536.

Для лучшего понимания прикладываю файл с макросом.

Вам также могут быть интересны следующие статьи

6 комментариев

Статья хорошая, но практического применения не имеет.
1. Символы подстановки * и ? можно использовать в стандартом фильтре Excel 2010 и в формулах.
Например, в фильтре пишем *По?та России* и выводятся строки содержащие Почта России или Поста России.
Тоже самое с формулами:
=СУММЕСЛИМН(data!$L:$L;data!$A:$A;$N50;data!$C:$C;»*По?та России*»)
или так:
=СУММЕСЛИМН(data!$L:$L;data!$A:$A;ЕСЛИ($B$2=»Все поставщики»;»*»;$B$2))
2. Если бы уникальные значения выводились в диапазоне данных, а не в ListBox-е, еще можно думать о применении, хотя расширенный фильтр Excel 2010 прекрасно справляется и с этой задачей.

Только начал читать блог. Оказалось что я мало что знаю об Экселе. Подача материала радует, всё понятно.

День добрый Ренат,
подскажите пож-та как сделать такой же фильтр только который сразу находится на рабочем листе (отображает 10-15 первых значений) и имеет возможность фильтрации как у вас. то есть такой же фильтр только сразу на странице а не вызываемый через кнопку?

Добрый день! Возникла задача, не знаю как реализовать). Есть 2 массива данных. Первый: таблица из 2х столбцов: номер карты и дата издания (Список карт находящихся на судне). Второй массив это таблица вообще всех изданных карт. Содержит столбцы: номер карты, дата последнего издания, масштаб, название. Задача состоит в том чтобы по номерам карт из первого массива вытащить данные из второго массива. И если дата издания не совпадает(т.е. Вышла новое издание карты) пдсветить номер карты в первом массиве.

Добрый вечер. Подскажите курс по макросам. Хочу пройти.

Источник

Excel vba listbox filter

Pardon my impetuous ignorance.

After a whole day

I have found something that is similar to what I am trying to achieve.

I meant to explain that I was trying to filter the results so I get all the values with apple in them.

I will put in apple in the TextBox1

I have gone back to basics as suddenly it has catapulted me into listbox land for which I had no idea it was this complex — am i able to simply filter a list box with a search keyword that i put in the text box?

For Example Can I display all the results that have apple in them? in the listbox, I can then make a choice from the various apples.

I am hoping that I now understand what you are attempting to do. Test the code in the example (xl file and Word file) that I have uploaded to OneDrive.

I have used family names and given names in the list in the xl worksheet. In particular try the Mac combinations and the more of the name you type the further the filter is applied.

I have saved the range for the list to an array that has been dimensioned as Public in Module1 and also see that I have added a button to reset the list to for ListBox by using the public array variable.

May I say thank you so much for your incredible help!

I have been working on this for weeks on and off, becuase there were so many problems connecting word to excel — and im none the wiser.

The problem is I am using word to populate a listbox from excel — so by its very nature it became messy.

Everything I found on listboxes was attached to excel within Excel so that made my newbie job very very hard to begin with 🙁

But im very stubborn and once I see something that would help me do a job, I just cant give up on my idea. I have always wanted a listbox in word but I could never make it work 🙁 and filtering was out of the question. But I had an urgent outlook list I needed to put in the excel spreadsheet but I was also using word and this cross app inteference was really amplified yesterday.

I can now use this for a multitude of jobs, oh as well as list some macros to in the listbox. Also I just didn’t have the energy to look for a combobox solution as if that would be any better so alas I went back to basics.

But you have solved it now.

Yay I am sooo happy

So thank you for your very kind and incredbily awesome help .

Reaally stoked to bits!

Have a Wonderful week now — Ossie ( if that’s your name)

I have one shiny new toy the ListBox to set up tomorrow — with lots of lists of names and things and things etc

Источник

filter a ListBox with a Combobox on VBA

I’m working on a Userform and I have weeks trying to develop a code to filter a listbox depending of the value of a combobox.

The closest I have done is make a commandbutton to filter the table where the listbox feeds but it doesn’t refresh the listbox.

I have seen on forums people doing things like I want but I have tried all of them with no results.

In the WorkBook you will see 3 userforms, the Userform1 is Ok. The userform2 have the Combobox (Proyect Code) and the ListBox i want to filter. The userform3 is not ready yet, because i need to have on 100% the Userform2 to take a decision. Hope it helps. Regards

1 Answer 1

I have already faced a similar situation, but instead of a ComboBox, I needed to filter the ListBox based on the selection of other ListBox and the selection of an Option. The way I found to meet my need was to use a Pivot Table in a hidden sheet. It worked fine for me, bit not all data can be rearranged in a Pivot Table, so I will understand if my suggestion does not work for you.

  1. First Step: set up a Pivot Table with your data source to be used in your ListBox. Pull the fields you want to filter in the Filters area. Create a dinamic named range with your data, like in the image:

  1. Second Step: create your UserForm. I set up 2 ComboBoxes as filters to the ListBox, but you can remove or add as many as you can, you’ll just need to adjust your code. I also named the ranges that will be available in the list options of the ComboBoxes. So we’ll have:

The UserForm’s code will be something like this:

You can hide the sheet where your Pivot Table is, so when you filter it through your UserForm, it will update in the background. You should also set up your Pivot Table to update its cache to capture new inputs in your data source.

I hope it works for you! Let me know what were the results.

Источник

Working with LIST BOXES (Form Controls)

This blog post shows you how to manipulate List Boxes (form controls) manually and with VBA code.

The list box shows you a number of values with a scroll bar (if needed). The selected value is Asia and it is the fourth (4) value in list F1:F6. It links the relative position of selected value (4) in a list, here it is linked to cell D2.

Form controls are not as flexible as ActiveX controls but are compatible with earlier versions of Excel. You can find the controls on the developer tab.
How to enable developer tab: Excel 2007, Excel 2010 and Excel 2013

Table of Contents

1. Create a List Box

Steps to build a List Box:

  1. Go to tab «Developer» on the ribbon.
  2. Press with left mouse button on «Insert» button.
  3. Press with left mouse button on List Box button.
  4. Press and hold and then drag with mouse on sheet.

You can build a List Box with vba code, here is how:

2. Assign macro to List Box

  1. Press with right mouse button on with mouse on list box.
  2. Press with left mouse button on «Assign macro. «.
  3. Select a macro in the list.
  4. Press with left mouse button on OK.

You can assign macro to a List Box by using vba code.

3. Add values to a List Box

You can add values to a List box with these steps:

  1. Press with right mouse button on on List Box
  2. Press with left mouse button on «Format Control. «
  3. Go to tab «Control»
  4. Select an Input range.
  5. Press with left mouse button on OK

The following vba macro adds E1:E3 to the List Box input range.

The VBA macro below adds the values in cell range E1:E3 to «List Box 100» without manipulating the input range. I recommend using the macro above, if values change in cell range E1:E3 they are instantly changed in List Box also. On the other hand, you can´t delete specific values using a VBA macro.

If your cell range size often changes, consider using a named range. Use technique demonstrated here: Populate combox with values from a dynamic named range

You can also populate a List Box with excel table values:
Populate combox with values from a table

4. Link List Box to a cell

  1. Press with right mouse button on on List Box.
  2. Press with left mouse button on «Format Control. «
  3. Go to tab «Control»
  4. Select a cell to link.
  5. Press with left mouse button on OK

5. Delete values in a List box

The following macro deletes all values in «List Box 100». It also removes the cell reference in «Input range:»

The RemoveItem method cannot be used to remove items from a list box if the list box is linked to a range on a worksheet.

You will get this error message: Run-time error ‘1004’: RemoveItem method of ListBox class failed.

This macro deletes the first value in «List Box 100».

6. Set default value in a List Box

This macro sets default value to the first value in a List Box.

7. Allow multiple selected values in a List Box

  1. Press with right mouse button on on List Box.
  2. Press with left mouse button on «Format Control. «.
  3. Go to tab Control.
  4. Press with left mouse button on Multi in «Selection type» window.
  5. Press with left mouse button on OK button.

This macro enables «Multiselection» for List Box 100.

8. Read selected value from Listbox

This macro returns the relative position of all selected values.

If you prefer, you can return the selected value with .List(.ListIndex) property.

Get the Excel file

LISTBOXES examples

SHAPES examples

This extensive vba reference list provides detailed information including syntax, arguments, return values, and examples for Visual Basic for Applications.

Источник

96-0-Расширенный фильтр Excel VBA

Когда вы работаете с большими объемами данных, нельзя представить себе эту деятельность без фильтров. Однозначно, что в Excel разработан очень мощный и удобный инструмент фильтрации, который позволяет выбирать определенные данные из диапазона. А с приходом Excel 2007 добавилась возможность выбирать данные с определенной заливкой. Все это облегчает рабочие будни Excel юзеров и упрощает жизнь. Однако, есть еще один элемент, который пока еще не реализован в стандартных фильтрах Excel, но приятно было бы иметь в арсенале, я говорю о фильтрации с помощью символов подстановки, который мы попытаемся сегодня реализовать с помощью VBA.

Оригинальную статью можно найти на сайте https://yoursumbuddy.com/

В данной статье описан способ создания фильтра на основе формы ListBox на VBA. Фильтр использует оператор Like, для поиска соответствий в заданном диапазоне. К примеру, набрав в фильтре celti, программа вернет мне значение Exceltip, но это не самое главное, так как стандартный фильтр позволяет проводить подобные манипуляции. Гораздо интереснее, что оператор Like позволяет использовать символы подстановки, таким образом введя в текстовое поле значение /*/201? , Excel вернет все даты начиная с 2010 года. Плюс ко всему, данный фильтр позволяет задавать чувствительность к регистру и отбирать уникальные значения.

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

96-1-Расширенный фильтр Excel

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

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

Sub ResetFilter()
Dim rngTableCol As Excel.Range
Dim varTableCol As Variant
Dim RowCount As Long
Dim collUnique As Collection
Dim FilteredRows() As String
Dim i As Long
Dim ArrCount As Long
Dim FilterPattern As String
Dim UniqueValuesOnly As Boolean
Dim UniqueConstraint As Boolean
Dim CaseSensitive As Boolean

‘звездочка возвращает все значения списка
If Not ValidLikePattern(Me.txtFilter.Text) Then
Exit Sub
End If
FilterPattern = «*» &amp; Me.txtFilter.Text &amp; «*»

UniqueValuesOnly = Me.chkUnique.Value
CaseSensitive = Me.chkCaseSensitive

‘используется, если Уникальные значения равно ИСТИНА
Set collUnique = New Collection
Set rngTableCol = loActive.ListColumns(1).DataBodyRange
‘обратите внимание, функция Transpose не работает с больше, чем 65536 строчек
varTableCol = Application.WorksheetFunction.Transpose(rngTableCol.Value)
RowCount = UBound(varTableCol)
ReDim FilteredRows(1 To 2, 1 To RowCount)
For i = 1 To RowCount
If UniqueValuesOnly Then
On Error Resume Next
‘сброс цикла
UniqueConstraint = False
‘не добавляет, если не уникальное значение
collUnique.Add Item:=«test», Key:=CStr(varTableCol(i))
If Err.Number &lt;&gt; 0 Then
UniqueConstraint = True
End If
On Error GoTo 0
End If

If Not UniqueConstraint Then
‘Оператор Like чувствителен к регистру,
‘поэтому необходимо использовать команду Lcase, если галка не стоит
If (Not CaseSensitive And LCase(varTableCol(i)) Like LCase(FilterPattern)) _
Or (CaseSensitive And varTableCol(i) Like FilterPattern) Then
‘добавить в массив, если пункт из ListBox соответствует фильтру
ArrCount = ArrCount + 1
‘в ListBox есть скрытый столбец для нумерования элементов
FilteredRows(1, ArrCount) = i
FilteredRows(2, ArrCount) = varTableCol(i)
End If
End If
Next i
If ArrCount &gt; 0 Then
‘удаляем пустые элементы массива
‘ListBox не может содержать более 65536 элементов
ReDim Preserve FilteredRows(1 To 2, 1 To Application.WorksheetFunction.Max(ArrCount, 65536))
Else
Erase FilteredRows
End If
If ArrCount &gt; 1 Then
Me.lstDetail.List = Application.WorksheetFunction.Transpose(FilteredRows)
Else
Me.lstDetail.Clear
‘добавляем отдельно, если найден только один элемент
If ArrCount = 1 Then
Me.lstDetail.AddItem FilteredRows(1, 1)
Me.lstDetail.List(0, 1) = FilteredRows(2, 1)
End If
End If
End Sub

В этом макросе использована возможность элемента Collection хранить только уникальные значения. Если на форме установлена галочка Уникальные, то макрос проверит его прежде, чем поместит в массив ListBox.

Переменная FilterPattern имеет звездочки в начале и конце строки. Это позволяет находить записи внутри таблицы.

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

1
2
3
4
5
6
7
8
9

Private Sub lstDetail_Change()
GoToRow
End Sub

Sub GoToRow()
If Me.lstDetail.ListCount &gt; 0 Then
Application.Goto loActive.ListRows(Me.lstDetail.Value).Range.Cells(1), True
End If
End Sub

Скорость макроса достаточно приемлема для таблиц с менее чем 10000 строками. Но даже с превышением этого порога, макрос будет работать, главное, чтобы число строк было менее 65536.

Для лучшего понимания прикладываю файл с макросом.

Автофильтр в ListBox

damask_86ru

Дата: Суббота, 21.02.2015, 10:48 |
Сообщение № 1

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

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

Сообщений: 60


Репутация:

0

±

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


Excel 2010

Всем доброго времени суток!
Во вложении файл excel, на листе DataBase имеется таблица и кнопка вызова UserForm.
В UserForm есть ListBox в котором отображаются данные из той самой таблицы.
А теперь сам вопрос:
Возможно ли осуществить автофильтр в ListBox используя TextBox’ы и ComboBox’ы расположенные над ним?
TextBox’ы только для точного поиска, а ComboBox’ы именно для фильтрации как в оригинальном автофильтре excel.

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

DBS.xls
(41.0 Kb)

Сообщение отредактировал damask_86ruСуббота, 21.02.2015, 13:43

 

Ответить

nilem

Дата: Суббота, 21.02.2015, 14:16 |
Сообщение № 2

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

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


Excel 2013, 2016

вот этот примерчик вроде бы подходит


Яндекс.Деньги 4100159601573

 

Ответить

damask_86ru

Дата: Суббота, 21.02.2015, 14:43 |
Сообщение № 3

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

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

Сообщений: 60


Репутация:

0

±

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


Excel 2010

nilem, это не то. Необходима фильтрация по разным критериям, как в оригинальном автофильтре excel.

 

Ответить

Leanna

Дата: Суббота, 21.02.2015, 17:15 |
Сообщение № 4

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

damask_86ru, чем тогда оригинальный фильтр не подходит?


Лучше день потерять, потом за пять минут долететь!

 

Ответить

Leanna

Дата: Суббота, 21.02.2015, 19:23 |
Сообщение № 5

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

А какие действия кроме фильтрации вы хотите проводить?
Тоже самое: защитить лист и оставить возможность автофильтра. Чем стандартный автофильтр не подходит?


Лучше день потерять, потом за пять минут долететь!

 

Ответить

Leanna

Дата: Суббота, 21.02.2015, 20:56 |
Сообщение № 6

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

Посмотрите вложение сделала на примере ComboBox’ов
функцию NoDups использовала отсюда

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

2942381.xls
(68.5 Kb)


Лучше день потерять, потом за пять минут долететь!

 

Ответить

damask_86ru

Дата: Воскресенье, 22.02.2015, 11:25 |
Сообщение № 7

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

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

Сообщений: 60


Репутация:

0

±

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


Excel 2010

Leanna, у меня есть еще один вопрос по теме.
Простите за назойливость.
Я даже и не знаю, поймете Вы меня…
Возможно ли сделать так, чтобы при выборе в ComboBox1 (тип задания) к примеру «кап.ремонт»он не терял у себя из списка остальные значения, а ComboBox2 (ид.) фильтровался под это значение… в нем должно остаться «20» и «80».
И затем при выборе значения из ComboBox2 к примеру «20», он не терял значение «80», а так же происходил фильтр данных ComboBox1, оставив в нем значения «кап.ремонт» и «ремонт».
Блин как все запутано.

Сообщение отредактировал damask_86ruВоскресенье, 22.02.2015, 11:43

 

Ответить

Leanna

Дата: Воскресенье, 22.02.2015, 17:02 |
Сообщение № 8

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

Вот посмотрите, так?
Я там добавила невидимый ListBox2 что бы не подгружать каждый раз с листа данные в Listbox 1, я подгружаю массив из ListBox2


Лучше день потерять, потом за пять минут долететь!

Сообщение отредактировал LeannaВоскресенье, 22.02.2015, 17:09

 

Ответить

damask_86ru

Дата: Воскресенье, 22.02.2015, 20:35 |
Сообщение № 9

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

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

Сообщений: 60


Репутация:

0

±

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


Excel 2010

Leanna, добрый вечер.
Я вложил два файла оригинальной таблицы, посмотрите пожалуйста. Первая сделана по Вашему первому примеру, все работает, как в примере. Второй файл по последнему примеру, и что-то не получается совсем, выдает ошибку.
У меня там перевод текста на объектах имеется, который осуществляется в зависимости от выбора языка в ComboBox1, может быть поэтому проблема? Хотя в первом файле так же имеется перевод.

 

Ответить

Leanna

Дата: Воскресенье, 22.02.2015, 22:55 |
Сообщение № 10

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

damask_86ru, Ошибка в том что в вашем случае надо перебирать комбобоксы начиная со второго по седьмой (первый занят). Подправила ещё там по мелочам. Смотрите файлик:

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

6231940.rar
(26.6 Kb)


Лучше день потерять, потом за пять минут долететь!

 

Ответить

Leanna

Дата: Воскресенье, 22.02.2015, 22:59 |
Сообщение № 11

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

Ранг: Форумчанин

Сообщений: 189


Репутация:

78

±

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


excel 2010

Вот эта конструкция понимаете что делает?
Она контролам по очереди имя которых ComboBox2, ComboBox3 … ComboBox7 по очереди присваивает сброс значения
[vba]

Код

For ii = 2 To 7
     With Me.Controls(«ComboBox» & ii)
         .ListIndex = -1
     End With
Next

[/vba]


Лучше день потерять, потом за пять минут долететь!

 

Ответить

damask_86ru

Дата: Вторник, 10.03.2015, 14:26 |
Сообщение № 12

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

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

Сообщений: 60


Репутация:

0

±

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


Excel 2010

Leanna, Спасибо Вам за внимание!
Все верно, ошибка была именно в том, что перебор combobox’ов был со 2 по 7.
Переделал, чтобы combobox’ы которые отвечают за фильтрацию listbox начинались с 1-го, и теперь все отлично работает! hands
Еще раз, СПАСИБО!

 

Ответить

Hi friends,

I am trying to make my TextBox1 work with my ListBox1 to Filter Search Results.

My set up is a bit strange , but for a good reason.

The Listbox 
populates from an excel sheet

Next I am trying to search a TextBox1 
— and filter the results.

So I can search for what I want but I couldn’t find a way to fix that. 

The goal is to try and run a macro stored within the document when an item is selected from the listbox, I can do that if I use listindex=0,1,2,3 etc.

I wanted to try and simplify that by
only running a macro when the item is selected.

I have wasted away this Sunday.

How can I fix my text box search — there is something missing.

And run a macro only when the item is selected from the listbox — I have googled forever and still no luck :(

I have attached the problematic duo in question — 
doc and the xl sheet

https://1drv.ms/w/s!AvcJQhgRih3LkmNwEln3y9TLE28w

https://1drv.ms/x/s!AvcJQhgRih3LkmdloYUSmLRG1NCK

Thank you for your help 
— I really appreciate it


Cheers Dan :)

  • Edited by

    Monday, January 23, 2017 3:30 AM

Like this post? Please share to your friends:
  • Excel vba for index
  • Excel vba on workbook load
  • Excel vba listbox controlsource
  • Excel vba for in list
  • Excel vba on error goto error