Пожалуйста, подскажите как заполнить массив выбранными значениями listbox чтобы потом использовать в автофильтре таблицы? Предполагал таким образом, однако не работает.
Код
For ListboxItem = MyListBox.ListCount - 1 To 0 Step -1
If MyListBox.Selected(ListboxItem) Then
Counter = Counter + 1
ItemArray(Counter) = MyListBox.List(ListboxItem, 0)
End If
Next ListboxItem
SelectedItems = ItemArray(Counter)
With Thisworkbook.Sheets("Sheet1")
.ListObjects("WbSheetTable").Range.AutoFilter Field:=1, Criteria1:=SelectedItems, Operator:=xlFilterValues
End With
Конечная цель отфильтровать первый столбец по выделенным значениям listbox.
Помимо изменения кода, я изменил свойства у listbox'а и кнопки, чтобы они не перемещались и не изменялись при скрытии строк (у меня в ходе тестирования это происходило): щелкнул по listbox'у правой кнопкой - Формат объекта... - вкладка "Свойства".
Добрый вечер! Пытался переделать полученный здесь макрос под свои нужды... не шибко получается. Прошу помочь по возможности... Нужно, чтобы при выборе значений в ListBox, срабатывал автофильтр на другом листе. При этом активация автофильтра выполнялась бы при выборе или снятия значения в ListBox, т.е. без использования кнопки. Благодарю!
Option Explicit
Sub Test()
Dim Arr()
Dim Str$, i%, u%
With Лист1
u = 0
For i = 0 To .ListBox1.ListCount - 1
If .ListBox1.Selected(i) Then
ReDim Preserve Arr(u)
Arr(u) = .ListBox1.List(i, 0)
u = u + 1
End If
Next i
End With
With Лист3.Range("$A$1:$A$24")
If u = 0 Then .AutoFilter Field:=1: Exit Sub
.AutoFilter Field:=1, Criteria1:=Array(Arr), Operator:=xlFilterValues
End With
End Sub
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Заработало! Установил сначала Пакет обновления 3 (SP3) содержит последние обновления для выпуска 2007 набора приложений Microsoft Office. Затем Обновление для системы безопасности Microsoft Office 2007 suites (KB2596927) Потом на всякий случай ещё раз забатил... Макрос работает!!! Благодарю!
Столкнулся с непонятной проблемой... Может кто может прояснить этот момент? Когда открываю рабочий файл, не могу нажать на галки в ListBox - как-будто это просто картинка... Но стоит мне например удалить строку или снять закрепление области или перейти на другой лист и вернуться, - так галки начинают работать... В чём может быть дело?
Доброго вечера, вот решил немного улучшить автофильтр через ListBox вставив его форму... В процессе работы возникло несколько неудобных моментов... Во-первых, диапазон для автофильтра не постоянный, поэтому данный код не подходит:
Код
With Лист31.Range("$A$2:$A$2355")
пробовал его заменить на что-то подобное, чтобы диапазон брался автоматически с 3-ей строки до последней в таблице, но не получается...
Во-вторых, при открытии формы с ListBox, галочки у значений сняты по умолчанию. Нужно наоборот, чтобы все галки по умолчанию были поставлены, и при их снятии, автофильтр скрывал соответствующие значения в таблице на листе "Фильтр".
И последний момент... Можно ли, чтобы галки в ListBox при его повторном открытии через кнопку, воспроизводили текущую выборку автофильтра на листа "Фильтр"? Благодарю за помощь!
Для решения первого момента (для автоматического определения диапазона автофильтра) попробовал изменить код вот так: однако ругается на: .AutoFilter Field:=1, Criteria1:=Array(Arr), Operator:=xlFilterValues
Код
Private Sub ListBox1_Change()
Application.ScreenUpdating = False
Dim Arr()
Dim Str$, i%, u%
Dim Фильтр, Entry
u = 0
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
ReDim Preserve Arr(u)
Arr(u) = ListBox1.List(i, 0)
u = u + 1
End If
Next i
With Sheets("Фильтр")
Фильтр = .Range("a3", .Range("a" & Rows.Count).End(xlUp)).Value
If u = 0 Then .AutoFilter Field:=1: Exit Sub
.AutoFilter Field:=1, Criteria1:=Array(Arr), Operator:=xlFilterValues
End With
Application.ScreenUpdating = True
End Sub
Private Sub ListBox1_Change()
Dim arr$(), i%, txt$
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then txt = txt & ListBox1.List(i) & ","
Next i
With wbsh
If txt = "" Then .UsedRange.AutoFilter: Exit Sub
txt = Left$(txt, Len(txt) - 1)
arr = Split(txt, ",")
.UsedRange.Offset(1, 0).AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
End With
End Sub
Изначально у меня была такая строка с адресом для автофильтра:
Код
With Лист31.Range("$A$2:$A$2355")
Я пытался её переделать, чтобы адрес определялся от третьей строки до конца таблицы... и нашёл такой вариант с Dim Фильтр, но там не совсем такая идея была реализована, как я хотел. Поэтому у меня не получилось. Пробовал Ваш вариант... Также выводит ошибку по строке:
Да, 424-ая Ошибка возможно здесь: .UsedRange.Offset(1, 0).AutoFilter у меня форма с ListBox на одном листе, фильтр на другом. Суть в том, что на листе "Расчёт" - формулы под исходные данные на листе "Фильтр". Меняя значения фильтра, я меняю логику расчёта. Но переходить с одного листа на другой - много времени. Нужно, чтобы фильтр был под "рукой" - на рабочем листе. Отсюда и другие хотелки из 18 поста. Вот...
Не могу определить какое кодовое имя листа прописано в коде? Ну, наверное, поэтому оно и кодовое...
Код
Private Sub ListBox1_Change()
Dim arr$(), i%, txt$
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then txt = txt & ListBox1.List(i) & ","
Next i
With wbsh
If txt = "" Then .UsedRange.AutoFilter: Exit Sub
txt = Left$(txt, Len(txt) - 1)
arr = Split(txt, ",")
.UsedRange.Offset(1, 0).AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
End With
End Sub
"wbsh" поменяйте на "Лист31". Странно , что вы пишете макросы , а не знаете что лист имеет 2 имени одно из которых является кодовым именем. Лист31 - кодовое имя Фильтр - название листа(имя)
Nordheim, да уже исправил... VBA знаю на уровне простых макросов, но в этом конечно можно было сразу разобраться... На свежую голову понял, где наименование не указано... Благодарю за помощь, всё работает! У меня ещё один вопрос, пробовал сделать так, чтобы при открытии формы в ListBox по умолчанию по всему списку были установлены галочки (сейчас все сняты). Не нашёл такого варианта в объектах для ListBox... Может вы знаете, что лучше применить? Благодарю!