在 VBA 上用组合框过滤列表框

filter a ListBox with a Combobox on VBA

我正在开发用户窗体,我花了数周时间尝试开发代码以根据组合框的值过滤列表框。

我所做的最接近的事情是制作一个命令按钮来过滤列表框提供的 table 但它不会刷新列表框。

我在论坛上看到有人做我想做的事情,但我已经尝试了所有这些都没有结果。

Private Sub CommandButton1_Click()
    If ComboBox1.Value <> "" Then ActiveSheet.ListObjects("Tabla2").Range.AutoFilter field:=2, Criteria1:=ComboBox1.Value
End Sub

Private Sub CommandButton2_Click()
    ActiveSheet.ListObjects("Tabla2").Range.AutoFilter field:=2
End Sub

Private Sub CommandButton3_Click()
    Unload UserForm2
    UserForm3.Show
End Sub

Private Sub UserForm_Initialize()
    For i = 2 To 30
        ComboBox1.AddItem Sheets("Proyectos - J.P.").Range("A" & i).Value
    Next i
End Sub

2017 年 4 月 5 日 工作簿Link https://drive.google.com/open?id=0B4B7v0UZxizCYnY2bVNTNURyLVU

在 WorkBook 中您将看到 3 个用户窗体,Userform1 可以。 userform2 有组合框(Proyect 代码)和我要过滤的列表框。 userform3 还没有准备好,因为我需要 100% 的 Userform2 来做出决定。 希望能帮助到你。 此致

我已经遇到过类似的情况,但我需要根据其他 ListBox 的选择和 Option 的选择来过滤 ListBox,而不是 ComboBox。我发现满足我需要的方法是在隐藏 sheet 中使用 Pivot Table。它对我来说效果很好,但并不是所有数据都可以在 Pivot 中重新排列 Table,所以如果我的建议对您不起作用,我会理解。

  1. 第一步: 设置一个 Pivot Table 以及您要在 ListBox 中使用的数据源。在“过滤器”区域中拉出要过滤的字段。使用您的数据创建动态命名范围,如图所示:

=OFFSET('Certificates Pivot'!$A;0;0;COUNTA('Certificates Pivot'!$A:$A);2)
  1. 第二步: 创建用户窗体。我设置了 2 个 ComboBoxes 作为 ListBox 的过滤器,但是你可以删除或添加尽可能多的,你只需要调整你的代码。我还命名了组合框列表选项中可用的范围。所以我们将有:

用户窗体的代码将是这样的:

Private Sub UserForm_Initialize()

    ComboBox1.RowSource = "CustomerID"
    ComboBox2.RowSource = "SalesOrg"
    With ListBox1
        .RowSource = "Consult_List"
        .ColumnCount = 2
        .ColumnWidths = "60;90"
        End With

End Sub
Private Sub ComboBox1_Change()

    Dim SelectedCID As String
    Dim SelectedSO As String
        SelectedCID = ComboBox1.Text
        SelectedSO = ComboBox2.Text

    With Sheets("Certificates Pivot").PivotTables("Certificates_PivotTable")
        .ClearAllFilters
        If Not SelectedCID = "" Then .PivotFields("Customer ID").CurrentPage = SelectedCID
        If Not SelectedSO = "" Then .PivotFields("Sales Org.").CurrentPage = SelectedSO
        End With

    ListBox1.RowSource = "Consult_List"

End Sub
Private Sub ComboBox2_Change()

    Call ComboBox1_Change

End Sub

您可以隐藏枢轴 Table 所在的 sheet,这样当您通过用户窗体过滤它时,它会在后台更新。您还应该设置 Pivot Table 以更新其缓存以捕获数据源中的新输入。

希望对你有用!让我知道结果如何。