在VBA上使用Combobox过滤ListBox

时间:2017-04-04 20:09:07

标签: vba excel-vba userform excel

我正在使用Userform,我有几周时间尝试开发一个代码来根据组合框的值过滤列表框。

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

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

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日 工作簿链接 https://drive.google.com/open?id=0B4B7v0UZxizCYnY2bVNTNURyLVU

在WorkBook中,您将看到3个用户表单,Userform1为Ok。 userform2具有Combobox(Proyect Code)和我想要过滤的ListBox。 userform3还没有准备好,因为我需要100%的Userform2来做出决定。 希望能帮助到你。 此致

1 个答案:

答案 0 :(得分:1)

我已经遇到了类似的情况,但是我需要根据其他ListBox的选择和选项的选择来过滤ListBox,而不是ComboBox。我发现满足我需要的方法是在隐藏的工作表中使用数据透视表。它对我来说很好,有点不是所有的数据都可以在数据透视表中重新排列,所以我会理解我的建议是否适用于你。

  1. 第一步:设置一个数据源表,其中包含要在ListBox中使用的数据源。在“过滤器”区域中拉出要过滤的字段。使用您的数据创建一个名为dinamic的范围,如图所示:
  2. Dynamic Named Range for Pivot Table

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

      UserForm的代码将是这样的:

      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
      

      您可以隐藏数据透视表所在的工作表,因此当您通过UserForm过滤它时,它将在后台更新。您还应该设置数据透视表以更新其缓存以捕获数据源中的新输入。

      我希望它适合你!让我知道结果是什么。