如何使相关的组合框在VBA中起作用

时间:2018-12-26 02:20:44

标签: excel vba excel-vba

下面我有一个这样的表。

enter image description here

我需要得到两个依赖的组合框。

  • 第一连击-我应该选择玩具1和玩具2
  • 第二个基于组合1的组合,应该显示车轮列表编号
  • 第三个组合-基于组合1选择名称应显示

我尝试了以下代码。 表单初始化后,我得到combo1列表 当选择组合1时,我将加载组合2和3

Private Sub UserForm_Initialize()
Dim i As Long
   For i = 2 To 9
     Me.ComboBox1.AddItem Cells(i, 1)
   Next
End Sub

Private Sub ComboBox1_Change()
    Me.ComboBox2.Value = Application.WorksheetFunction.VLookup(Me.ComboBox1.Value, Sheets("sheet1").Range("A2:C9"), 2, 0)
    Me.ComboBox3.Value = Application.WorksheetFunction.VLookup(Me.ComboBox1.Value, Sheets("sheet1").Range("A2:C9"), 3, 0)
End Sub

问题是,当我运行时,combo1不仅是toy1和toy2的2个选择,而且还会重复执行toy1 4和toy2 4次。

当我选择组合2和3时,仅显示单个值,而不显示整个列表ID。

请帮助我弄清楚这一点。谢谢

1 个答案:

答案 0 :(得分:0)

我正在从事一个具有类似要求的项目,这非常有趣。我无法完成整个项目。这是满足您要求的代码。在这里,当您选择cboToyType的任何值并转到cboWheel时,将花费很少的时间来运行代码。您可以优化代码以使其更快。

Private Sub UserForm_Initialize()
Dim ws As Worksheet

    Set ws = Sheets("Sheet1")
    ws.Range("Z:Z").ClearContents
    ws.Columns("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("Z1"), Unique:=True
    ws.Range("Z1").ClearContents

    Me.cboToyType.RowSource = ws.Range("Z2").CurrentRegion.Address
    Set ws = Nothing
End Sub


Private Sub btnOK_Click()
    Unload Me
End Sub


Private Sub cboToyType_AfterUpdate()
Dim ws As Worksheet
Application.ScreenUpdating = False

    Set ws = Sheets("Sheet1")
    ws.Range("AB:AD").ClearContents
    ws.Range("A:C").AutoFilter Field:=1, Criteria1:=Me.cboToyType
    ws.Range("B:B").Copy ws.Range("AB1")
    ws.Range("AB:AB").RemoveDuplicates Columns:=1, Header:=xlNo

    ws.Range("C:C").Copy ws.Range("AD1")
    ws.Range("AD:AD").RemoveDuplicates Columns:=1, Header:=xlNo

    ws.Range("A:C").AutoFilter
    ws.Range("AB1").ClearContents
    ws.Range("AD1").ClearContents

    Me.cboWheel.RowSource = ws.Range("AB2").CurrentRegion.Address
    Me.cboName.RowSource = ws.Range("AD2").CurrentRegion.Address
    Set ws = Nothing

Application.ScreenUpdating = True
End Sub

Sample File Download Link