Страницы: 1 2 След.
RSS
Заполнить массив выбранными значениями listbox чтобы потом использовать в автофильтре таблицы
 
Уважаемые форумчане!

Пожалуйста, подскажите как заполнить массив выбранными значениями 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.
Изменено: ac1-caesar - 31.03.2016 15:49:36
 
Помимо изменения кода, я изменил свойства у listbox'а и кнопки, чтобы они не перемещались и не изменялись при скрытии строк (у меня в ходе тестирования это происходило): щелкнул по listbox'у правой кнопкой - Формат объекта... - вкладка "Свойства".
 
Karataev, спасибо за помощь!
 
Добрый вечер!
Пытался переделать полученный здесь макрос под свои нужды... не шибко получается.
Прошу помочь по возможности... Нужно, чтобы при выборе значений в 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
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, благодарю за вариант...

Однако при запуске ругается: "Unexpected error (32809)". Может дело в версии Excel? У меня наверное 2007.

И возможно ли настроить выполнение макроса без нажатия кнопки - чтобы сразу фильтр срабатывал при выборе значений в ListBox?
 
Исправил на чтобы кнопку не нажимать.
По поводу ошибки курите эту тему
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Варианты предыдущие не смотрел, но можно так без кнопок
Изменено: Nordheim - 15.05.2019 09:04:41
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, при снятии всех галочек не получается.  ;)
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, Что не получается?
"Все гениальное просто, а все простое гениально!!!"
 
Фильтр не снимается при снятых галочках.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Теперь снимается.
"Все гениальное просто, а все простое гениально!!!"
 
Благодарю за помощь!!!
Сейчас пытаюсь решить проблему выходящей ошибки...
Запустил .bat файл... Не помогло...
 
Заработало!
Установил сначала Пакет обновления 3 (SP3) содержит последние обновления для выпуска 2007 набора приложений Microsoft Office.
Затем Обновление для системы безопасности Microsoft Office 2007 suites (KB2596927)
Потом на всякий случай ещё раз забатил...
Макрос работает!!! Благодарю!
 
Столкнулся с непонятной проблемой... Может кто может прояснить этот момент?
Когда открываю рабочий файл, не могу нажать на галки в ListBox - как-будто это просто картинка...
Но стоит мне например удалить строку или снять закрепление области или перейти на другой лист и вернуться, - так галки начинают работать...
В чём может быть дело?
 
Может кто сталкивался (предыдущий пост)?
Или у Вас такой проблемы не возникает при открытии файла и выборе значений из списка в ListBox?
 
Решить момент помог запрет обновления экрана...
Код
Application.ScreenUpdating = False / True
 
Доброго вечера, вот решил немного улучшить автофильтр через ListBox вставив его форму...
В процессе работы возникло несколько неудобных моментов...
Во-первых, диапазон для автофильтра не постоянный, поэтому данный код не подходит:
Код
With Лист31.Range("$A$2:$A$2355")
пробовал его заменить на что-то подобное, чтобы диапазон брался автоматически с 3-ей строки до последней в таблице, но не получается...
Код
Лист31.Range("a3:a" & Лист31.Range("a" & Лист31.Rows.Count).End(xlUp).Row).Value
Во-вторых, при открытии формы с 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
Изменено: Владимир Самара - 22.05.2019 17:23:52
 
А зачем Array(Arr) а не просто Arr
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, благодарю за совет!
Пока не помогло, я видать не совсем корректно обозначил: Dim Фильтр, Entry
Буду копать дальше... :)
 
Непонятно какую функцию выполняет переменная "Фильтр". И желательно файл бы увидеть с ошибкой.
"Все гениальное просто, а все простое гениально!!!"
 
Переделал ваш код, вроде работает.
Код
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
Изменено: Nordheim - 23.05.2019 08:46:51
"Все гениальное просто, а все простое гениально!!!"
 
Изначально у меня была такая строка с адресом для автофильтра:
Код
With Лист31.Range("$A$2:$A$2355")
Я пытался её переделать, чтобы адрес определялся от третьей строки до конца таблицы... и нашёл такой вариант с Dim Фильтр, но там не совсем такая идея была реализована, как я хотел. Поэтому у меня не получилось.
Пробовал Ваш вариант... Также выводит ошибку по строке:
Код
.UsedRange.Offset(1, 0).AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
 
У меня никаких ошибок не выдает. открыл файл все фильтрует без проблем. А что за ошибка, случаем не 424?
Изменено: Nordheim - 24.05.2019 08:08:24
"Все гениальное просто, а все простое гениально!!!"
 
Да, 424-ая
Ошибка возможно здесь:
.UsedRange.Offset(1, 0).AutoFilter
у меня форма с ListBox на одном листе, фильтр на другом. Суть в том, что на листе "Расчёт" - формулы под исходные данные на листе "Фильтр". Меняя значения фильтра, я меняю логику расчёта. Но переходить с одного листа на другой - много времени. Нужно, чтобы фильтр был под "рукой" - на рабочем листе. Отсюда и другие хотелки из 18 поста.
Вот... :)
Изменено: Владимир Самара - 24.05.2019 16:42: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
у меня: Лист31(Фильтр)
 
"wbsh" поменяйте на "Лист31". Странно , что вы пишете макросы , а не знаете что лист имеет 2 имени одно из которых является кодовым именем.
Лист31 - кодовое имя
Фильтр - название листа(имя)
Изменено: Nordheim - 24.05.2019 20:34:14
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, да уже исправил...
VBA знаю на уровне простых макросов, но в этом конечно можно было сразу разобраться... На свежую голову понял, где наименование не указано...
Благодарю за помощь, всё работает!
У меня ещё один вопрос, пробовал сделать так, чтобы при открытии формы в ListBox по умолчанию по всему списку были установлены галочки (сейчас все сняты). Не нашёл такого варианта в объектах для ListBox... Может вы знаете, что лучше применить? Благодарю!
Страницы: 1 2 След.
Наверх