我希望每次选择组合框值时都运行一个子程序。我该怎么做呢?

时间:2014-05-04 06:03:43

标签: excel excel-vba combobox vba

我有一个包含三列的excel文件。 每行都是独一无二的。 有三个组合框对应于这三列。

当选择第一个组合框中的选项时,我希望第二个组合框中填充第二列中与第一个组合框中的选择对应的项目。 即:

- Adam | Apple | Seed

- Adam | Apple | Core

- Adam | Orange | Peel

- Jess | Banana | Peel

- Jess | Mango | Pulp

- Jess | Orange | Seed

这里第一列有数据Adam,Jess。第一个组合框已经有两个独特的选项Adam和Jess。

一旦用户选择了Adam或Jess,第二个组合框应填充相应的水果名称。

实施例。 Combobox1 = Adam

然后combobox2 = {Apple,Orange}

当选择Apple / Orange时,第三个组合框应该有与前两个组合框相对应的选项。

请注意我的第一个组合框已正确填充数据:

Function UniqueList()
'Populate control with
'unique list.

Range("Names").AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Range("uniqueNames"), Unique:=True

'Set combo control's Row Source property.

Range("uniqueNames").RemoveDuplicates Columns:=1, Header:=xlNo
UserForm1.uniqueNameList.RowSource = Selection.CurrentRegion.Address

'Display user form.
UserForm1.Show

Selection.CurrentRegion.Clear

End Function
编辑:我基本上需要这样说: 使用第二行的单元格填充第二个组合框,其中第一行等于combobox1。

1 个答案:

答案 0 :(得分:1)

假设您在sheet1中有数据:

enter image description here

1-您可以使用combobox_Change事件处理程序来跟踪用户何时从组合框中选择了新值。

2- Combobox.listindex:这将为您提供组合框中当前选择的索引

3- Combobox.list:是一个包含组合框中所有项目的数组

 Private Sub ComboBox1_Change()
    Dim strValue As String
    Dim i As Integer
    If ComboBox1.ListIndex <> -1 Then
        strValue = ComboBox1.List(ComboBox1.ListIndex)
        ComboBox2.Clear
    ComboBox3.Clear
    For i = 1 To 6
        If Cells(i, 1) = strValue Then
            If exists(ComboBox2, Cells(i, 2)) = False Then
                ComboBox2.AddItem (Cells(i, 2))
            End If
            If exists(ComboBox3, Cells(i, 3)) = False Then
                ComboBox3.AddItem (Cells(i, 3))
            End If

        End If

    Next i
Else
    ComboBox2.Clear
    ComboBox3.Clear
End If

End Sub



Private Sub ComboBox2_Change()
Dim strValue1 As String
Dim strValue2 As String
Dim i As Integer
If (ComboBox2.ListIndex <> -1) And (ComboBox1.ListIndex <> -1) Then
    strValue1 = ComboBox2.List(ComboBox2.ListIndex)
    strValue2 = ComboBox1.List(ComboBox1.ListIndex)
    ComboBox3.Clear
    For i = 1 To 6
        If (Cells(i, 2) = strValue1) And (Cells(i, 1) = strValue2) Then
            If exists(ComboBox3, Cells(i, 3)) = False Then
                ComboBox3.AddItem (Cells(i, 3))
            End If    
        End If
    Next i
    Else
        ComboBox3.Clear  
    End If
End Sub

Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 6
    If exists(ComboBox1, Cells(i, 1)) = False Then
        ComboBox1.AddItem (Cells(i, 1))
    End If
Next i
End Sub

Private Function exists(ByRef objCmb As ComboBox, ByVal strValue As String) As Boolean
Dim i  As Integer

For i = 1 To objCmb.ListCount
    If strValue = objCmb.List(i - 1) Then
        exists = True
        Exit Function
    End If

Next i
exists = False
End Function

假设您有3个名为Combobox1,Combobox2和Combobox3(VBA编辑器创建的默认名称)的组合框,代码将起作用