keny Пользователь Сообщений: 27 |
Помогите создать фильтр в listbox по параметрам (цена,код,наименование,артикул). Прикрепленные файлы
|
ber$erk Пользователь Сообщений: 2735 |
Учимся сами и помогаем другим… |
keny Пользователь Сообщений: 27 |
заходил уже,у меня должно быть все проще,как в примере. |
ber$erk Пользователь Сообщений: 2735 |
а вы попробуйте сперва на этой основе написать что-то под себя, а что не будет получаться спрашивайте здесь. Учимся сами и помогаем другим… |
keny Пользователь Сообщений: 27 |
Открыл,но это совсем не то,что нужно. Изменено: keny — 19.02.2013 20:30:36 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Фильтровать нужно по полному совпадению или по частичному? Например, наименование. |
keny Пользователь Сообщений: 27 |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
По частичному, наверное, для наименования и артикула, если судить по данным. |
keny Пользователь Сообщений: 27 |
для наименования,артикула и цены Изменено: keny — 19.02.2013 19:35:09 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
keny, я уже начал переделывать (а фактически заново писать) код, если Вы будете скрывать важные детали, то я откажусь от этой затеи. Вы поленились создать заголовки в таблице. Если с наименованием, артикулом и остатком всё понятно, то понять, где код, а где цена — я затрудняюсь. Не подскажете? |
keny Пользователь Сообщений: 27 |
у меня мало опыта работы с вба,по этом не поленился,просто не сталкивался.код 4,цена 5 стобец. Изменено: keny — 19.02.2013 19:42:16 |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#12 19.02.2013 19:57:25
У меня сомнения — цену тоже искать приблизительную? Как Вы себе это представляете? |
||
keny Пользователь Сообщений: 27 |
например если у двух товаров совпадает цена то в листбокс их останется 2,если совпадает артикул тоже самое и т.д. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Совпадает — это одно, а частично (приблизительно) — несколько иное. Определитесь На мой взгляд, поиск по цене должен быть точным. Остаётся для частичного совпадения артикул и наименование. |
Z Пользователь Сообщений: 6111 Win 10, MSO 2013 SP1 |
#15 19.02.2013 20:10:41
Уж замуж невтерпёж… «Ctrl+S» — достойное завершение ваших гениальных мыслей!.. |
||||
keny Пользователь Сообщений: 27 |
Извеняюсь, не так понял. Да действительно, Вы правы, было бы правельней оставить точное совпадение по цене. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
См. файл. При начальной загрузке формы в ЛистБокс будет выведено ВСЁ. Затем уже фильтрация по радиокнопкам и поисковому запросу. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Забыл про выделение нужной строки (ячейки) по клику в ЛистБоксе. Исправил. Прикрепленные файлы
|
keny Пользователь Сообщений: 27 |
юрий спасибо!все очень круто работает. |
echo Пользователь Сообщений: 22 |
Юрий, я использовал ваш код из этого файла для своей формы. Спасибо за отличный пример! Вы не могли бы ответить на вопрос, я код разобрал, но только не понял двух моментов : 1. что по смыслу значит <Add Item «»> когда вы добавляете и раскидываете значения по листам Listbox в разные колонки? 2. и за счет чего происходит поэтапная фильтрация, если при каждом нажатии CommandButton лист очищается командой Me.listbox.clear? Спасибо! |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
1. Добавление новой строки в ListBox. |
echo Пользователь Сообщений: 22 |
Юрий, а за счет чего у вас в примере данные могут фильтроваться поэтапно, т.е. скажем, сначала по артикулу, потом из того, что отфильтровано по продукту, а затем, скажем по номеру. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Не понял вопрос — про какой многоуровневый фильтр Вы говорите? |
echo Пользователь Сообщений: 22 |
я когда фильтрую по вашему примеру, который вы keny сделали, там получается что, например, если я отфильтровал по артикулу 9, то он соответственно выдает список с этим артикулом, |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#25 09.04.2013 22:02:03
Неправильно! Сначала ListBox очиащается, а потом заполняется заново. Это я уже третий раз Вам говорю. В коде есть акая строка: |
||
echo Пользователь Сообщений: 22 |
походу мне сегодня хорошо жбан сорвало за компом да, вы правы, я туплю уже много раз за сегодня А вы не подскажете, как можно реализовать многоуровневый фильтр для listbox? Спасибо |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Что подразумевается под многоуровневым? |
echo Пользователь Сообщений: 22 |
Имеется ввиду, что я смогу отфильтровать данные в листбоксе по нескольким критериям. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
При варианте с радиокнопками так не получится — нужен множественный выбор, а для этого они не годятся. Выручат ЧекБоксы. Но тогда потребуется и три (минимум) поля для ввода критериев. А может Вам будет достаточно расширенного фильтра? ) |
echo Пользователь Сообщений: 22 |
#30 10.04.2013 01:54:41 Да Юрий, я согласен с вами на счет optionbuttons. А на счет расширенного фильтра в UserForm я пока такого не знаю А вы не могли бы подробнее рассказать? Прикрепленные файлы
|
Содержание
- Exceltip
- Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки
- Расширенный фильтр в Excel с символами подстановки и уникальными значениями на VBA
- Вам также могут быть интересны следующие статьи
- 6 комментариев
- Excel vba listbox filter
- filter a ListBox with a Combobox on VBA
- 1 Answer 1
- Working with LIST BOXES (Form Controls)
- 1. Create a List Box
- 2. Assign macro to List Box
- 3. Add values to a List Box
- 4. Link List Box to a cell
- 5. Delete values in a List box
- 6. Set default value in a List Box
- 7. Allow multiple selected values in a List Box
- 8. Read selected value from Listbox
- Get the Excel file
- LISTBOXES examples
- 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.
- 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:
- 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:
- Go to tab «Developer» on the ribbon.
- Press with left mouse button on «Insert» button.
- Press with left mouse button on List Box button.
- 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
- Press with right mouse button on with mouse on list box.
- Press with left mouse button on «Assign macro. «.
- Select a macro in the list.
- 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:
- Press with right mouse button on on List Box
- Press with left mouse button on «Format Control. «
- Go to tab «Control»
- Select an Input range.
- 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
- Press with right mouse button on on List Box.
- Press with left mouse button on «Format Control. «
- Go to tab «Control»
- Select a cell to link.
- 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
- Press with right mouse button on on List Box.
- Press with left mouse button on «Format Control. «.
- Go to tab Control.
- Press with left mouse button on Multi in «Selection type» window.
- 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.
Источник
Когда вы работаете с большими объемами данных, нельзя представить себе эту деятельность без фильтров. Однозначно, что в Excel разработан очень мощный и удобный инструмент фильтрации, который позволяет выбирать определенные данные из диапазона. А с приходом Excel 2007 добавилась возможность выбирать данные с определенной заливкой. Все это облегчает рабочие будни Excel юзеров и упрощает жизнь. Однако, есть еще один элемент, который пока еще не реализован в стандартных фильтрах Excel, но приятно было бы иметь в арсенале, я говорю о фильтрации с помощью символов подстановки, который мы попытаемся сегодня реализовать с помощью VBA.
Оригинальную статью можно найти на сайте https://yoursumbuddy.com/
В данной статье описан способ создания фильтра на основе формы ListBox на VBA. Фильтр использует оператор Like, для поиска соответствий в заданном диапазоне. К примеру, набрав в фильтре celti, программа вернет мне значение Exceltip, но это не самое главное, так как стандартный фильтр позволяет проводить подобные манипуляции. Гораздо интереснее, что оператор Like позволяет использовать символы подстановки, таким образом введя в текстовое поле значение /*/201? , Excel вернет все даты начиная с 2010 года. Плюс ко всему, данный фильтр позволяет задавать чувствительность к регистру и отбирать уникальные значения.
Внизу показаны принципы работы фильтра на примере списка женских имен с добавлением выбора уникальных значений и чувствительности к регистру. Обратите внимание, щелчок на имени в фильтре позволяет выбирать его в списке.
Ниже отображен макрос, который запускается каждый раз, когда меняется значение в текстовом поле фильтра или происходит щелчок на один из элементов списка в фильтре.
1 |
Sub ResetFilter() ‘звездочка возвращает все значения списка UniqueValuesOnly = Me.chkUnique.Value ‘используется, если Уникальные значения равно ИСТИНА If Not UniqueConstraint Then |
В этом макросе использована возможность элемента Collection хранить только уникальные значения. Если на форме установлена галочка Уникальные, то макрос проверит его прежде, чем поместит в массив ListBox.
Переменная FilterPattern имеет звездочки в начале и конце строки. Это позволяет находить записи внутри таблицы.
В дополнение, массив с женскими именами хранит порядковый номер этого имени, что позволяет запускать другой макрос, который выделяет соответствующую ячейку в таблице при выделении имени в форме.
1 |
Private Sub lstDetail_Change() Sub GoToRow() |
Скорость макроса достаточно приемлема для таблиц с менее чем 10000 строками. Но даже с превышением этого порога, макрос будет работать, главное, чтобы число строк было менее 65536.
Для лучшего понимания прикладываю файл с макросом.
Автофильтр в ListBox |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
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