VBA: Как отфильтровать лист на основе флажка? - PullRequest
0 голосов
/ 27 июня 2019

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

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

TL; DR Я думаю, что моя проблема заключается в том, как я отформатирую массив для добавления в Criteria1 функции AutoFilter ()

Sub Auto_filter()

'variables are for checkboxes'
    Dim VC1500 As Shape 
    Dim VC7500 As Shape
    Dim VC144024 As Shape

'initiates to check for the checkboxes'
   Set VC1500 = Sheets("Sheet7").Shapes("Check Box 4")
   Set VC7500 = Sheets("Sheet7").Shapes("Check Box 5")
   Set VC144024 = Sheets("Sheet7").Shapes("Check Box 6")

'if statement that will add a string to strCriteria if checkbox is true'
    If VC1500.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", VC1500"
    End If

    If VC7500.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", VC7500"
    End If

    If VC144024.OLEFormat.Object.Value = 1 Then
       strCriteria = strCriteria & ", 144024"
    End If

'with statement that finds for column vendor then filter it based on 
strCriteria, I think this is where my issue is'

    With Worksheets("Open Purchase Orders")
        With .Range("A1", .Cells(1, Columns.Count).End(xlToLeft))
            Set vendorfind = .Rows(1).Find("Vendor")
            If Not vendorfind Is Nothing Then
                .AutoFilter Field:=vendorfind.Column, 
           Criteria1:=Split(strCriteria, ", "), Operator:=xlFilterValues
            End If
        End With
         .AutoFilterMode = False
   End With

End Sub

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

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вы пробовали использовать ломтики? Это просто и нужно делать простые фильтры без макросов.

Выберите ваши данные> Вставить таблицу. Как только таблица готова, на вкладке «Дизайн» вы можете выбрать «Вставить слайсер». Попробуйте, если это решит вашу проблему.

0 голосов
/ 28 июня 2019

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

Это, например, решение для одного столбца поставщика (D), который может содержать 3 имени. В основном применяется автофильтр списка значений. (Я использую флажки activex ниже, так как их свойства доступны напрямую.)

Private Sub VC1500_Click()
Update_Filter
End Sub

Private Sub VC7500_Click()
Update_Filter
End Sub

Private Sub VC144024_Click()
Update_Filter
End Sub

Private Sub Update_Filter()
Dim varr_filter(3) As String
Dim indshow As Boolean
indshow = True
If VC1500 Then
    varr_filter(0) = VC1500.Caption
    indshow = False
End If
If VC7500 Then
    varr_filter(1) = VC7500.Caption
    indshow = False
End If
If VC144024 Then
    varr_filter(2) = VC144024.Caption
    indshow = False
End If
If indshow Then
    Range("$A:$D").AutoFilter
Else
    Range("$A:$D").AutoFilter field:=4, Criteria1:=varr_filter, Operator:=xlFilterValues
End If
End Sub

Примечание. Выберите правильный столбец для фильтрации в качестве значения «поля», и если по какой-то причине вы хотите отделить флажки от формы, добавьте «» «листы (« имя листа »). {Каждый флажок}» "".

В качестве альтернативы, если каждый из vcs обладает отдельным столбцом и ищет строки, в которых буквально написано "vendor", я бы слил их в лист следующим образом:

E2=if(cond1)*checkbox1 + if(cond2)*checkbox2 + if(cond3)*checkbox3 ; E > 0.
Cond1 could be b2="Vendor", for example.
To make the sheet display all cols when no ticks are selected,
I've added another value: 1 - max(checkboxes).
E6=1-MAX($H$4:$H$6) + IF(AND(B2="Vendor"),1,0)*$H$4 +
   IF(AND(C2="Vendor"),1,0)*$H$5 + IF(AND(D2="Vendor"),1,0)*$H$6

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

Private Sub VC1500_Click()
If VC1500.Value Then
    Range("$H$4").Value = 1
Else
    Range("$H$4").Value = 0
End If
Update_Filter
End Sub

Private Sub VC7500_Click()
If VC7500.Value Then
    Range("$H$5").Value = 1
Else
    Range("$H$5").Value = 0
End If
Update_Filter
End Sub

Private Sub VC144024_Click()
If VC144024.Value Then
    Range("$H$6").Value = 1
Else
    Range("$H$6").Value = 0
End If
Update_Filter
End Sub

Private Sub Update_Filter()
Range("$A:$E").AutoFilter field:=5, Criteria1:=">0", Operator:=xlFilterValues
End Sub

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


Редактировать: Добавленный выше проверенный код для обоих случаев (одинарный столбец, многоцветный), включая отображение всех строк, когда галочки не отмечены, а не нет. Вот демонстрационные снимки.

Один код col

Один образец листа цв.

Одиночный отфильтрованный цвет

Многоцветный код

Multicol образец

Многоцветный фильтр

...