(VBA)根据另一个下拉列表的值填充Excel中的下拉菜单?

时间:2012-12-04 17:26:12

标签: excel vba

生成两个下拉菜单的最佳方法是什么,其中第二个菜单的内容取决于从第一个菜单中选择的值?

第二个下拉列表是否会被创建为空白,每次从第一个下拉列表中选择一个新值时,我会“覆盖”某个属性,指的是第二个下拉列表?或者我应该在每次点击第一个下拉列表时重新创建第二个下拉菜单吗?

欢迎使用任何代码段!

1 个答案:

答案 0 :(得分:1)

这取决于您使用的是什么类型的下拉菜单。如果您使用数据验证来获取单元格下拉列表,则可以将第二个下拉单元格的源设置为间接函数,然后将您的数据置于引用第一个下拉列表的命名范围中。 更多信息: http://www.contextures.com/xlDataVal02.html

如果您在第一个下拉列表中有大量数据,则创建所有命名范围会很繁琐。

我也在使用VBA的用户表单中完成了这项工作。

Public Branches() As String
Public Function List_Branch_Set(lngRegion As String) As Long
    Dim lngAllBranches As Long
    Dim lngReg As String
    Dim lngBranches As Long
    Dim lngIdx As Long
    Dim rw As Long
    lngAllBranches = Sheets("sheet1").Range("C1").Value
    lngBranches = CountBranches(lngRegion)
    If lngBranches > 0 Then
        ReDim Branches(lngBranches - 1)
        For rw = 2 To lngAllBranches + 1
            lngReg = Sheets("sheet1").Cells(rw, 2).Value
            If lngReg = lngRegion Then
                Branches(lngIdx) = Sheets("sheet1").Cells(rw, 1).Value
                lngIdx = lngIdx + 1
            End If
        Next rw
    End If
    List_Branch_Set = lngBranches
End Function

然后我的数据以下列格式存储在sheet1上: 分区

函数CountBranches()计算此列表中与所选区域匹配的行数。然后你需要在第一个cbo上触发。

Private Sub cboRegion_Change()
    Dim lngNum As Long
    Me.cboBranch.Clear
    lngNum = List_Branch_Set(NullHandleText(Me.cboRegion))
    If lngNum <> 0 Then
        Me.cboBranch.List = Branches
    End If
End Sub