excel 中的动态下拉列表

Dynamic DropDown in excel

我想创建一个州、地区、分区等的下拉列表。通过从 drpoDown 州列表中选择一个州,地区下拉列表应该只包含属于该特定州的地区列表。如何使用 vba 代码做到这一点。真的可以吗??

这个想法有点粗略...试试吧 - 我已经在 sheet2 中设计了所有内容 首先创建数据

[A1]    [B1]    [C1]
State   Dist    SubDist
State1  Dist1   SD1
State1  Dist1   SD1
State1  Dist1   SD1
State1  Dist1   SD2
State1  Dist1   SD2
State1  Dist2   SD1
State1  Dist2   SD1
State1  Dist2   SD2
State1  Dist2   SD2
State1  Dist2   SD2
State1  Dist3   SD3
State1  Dist3   SD3
State2  Dist1   SD1
State2  Dist1   SD1
State2  Dist1   SD1
State2  Dist1   SD2
State2  Dist1   SD2
State2  Dist2   SD1
State2  Dist2   SD1
State2  Dist2   SD2
State2  Dist2   SD2
State2  Dist2   SD2
State2  Dist3   SD3
State2  Dist3   SD3

高级过滤器的克里特岛标准 [J1] [K1] [L1] 州区 SubDist State1 距离 1

首先在下拉列表 1 中添加唯一状态值 'drpState' 并将 getDist() 分配给下拉列表以进行状态选择(为其他选择增加 2 个,例如 dist、sub dist...)

创建 3 个下拉菜单 'drpState'[宏:getDist()],'drpDist'[宏:getSDist()],'drpSDist'

Sub getDist()'<< Assign to State Selection
    Call GetDropdownValue("drpState", Sheet2.Range("J2"))
    Sheet2.Range("J1").CurrentRegion.Offset(1, 1).Clear
    Call GetSubList("drpDist", 2, Sheet2.Range("O1"))
End Sub

Sub getSDist() '<< Assign to Destic Selection
    Call GetDropdownValue("drpDist", Sheet2.Range("K2"))
    Call GetSubList("drpSDist", 3, Sheet2.Range("O1"))
End Sub

Sub GetDropdownValue(ByVal DropdownName As String, OutPutRange As Range)
    With Sheet2.DropDowns(DropdownName)
        OutPutRange.Value = .List(.ListIndex)
    End With
End Sub

Sub GetSubList(ByVal DropdownName As String, ByVal intLevel As Integer, ByVal OutPutRange As Range)

    Dim rngMainData As Range
    Dim rngList     As Range

    If OutPutRange.Value <> vbNullString Then
        OutPutRange.CurrentRegion.Clear
    End If

    Set rngMainData = Sheet2.Range("A1").CurrentRegion.Columns(1).Resize(, intLevel)
    rngMainData.AdvancedFilter xlFilterCopy, Sheet2.Range("J1").CurrentRegion.Columns(1).Resize(, intLevel), OutPutRange, True

    With OutPutRange.CurrentRegion.Columns(intLevel)
        Set rngList = .Offset(1).Resize(.Rows.Count - 1)
    End With

    With Sheet2.DropDowns(DropdownName)
        .List = rngList.Value
    End With
End Sub

我认为这将帮助您解决问题...

假设我们根据列 H:

中的值在单元格 B2 中设置了主下拉菜单

I 包含辅助下拉信息作为 逗号分隔列表, 每个列表在一个单元格中。以下事件宏将检测单元格 B2 的更改,并相应地在单元格 C2 中建立 DV。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim v As Variant, r As Range
    If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub
    If Range("B2").Value = "" Then Exit Sub
    Application.EnableEvents = False

    v = Target.Value
    Set r = Range("H3:H5").Find(What:=v, After:=Range("H3")).Offset(0, 1)
    v = r.Value

    With Range("C2").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=v
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
    End With
    Application.EnableEvents = True
End Sub

因为它是工作表代码,所以安装和自动使用非常容易:

  1. 右键单击 Excel window
  2. 底部附近的选项卡名称
  3. select 查看代码 - 这会弹出一个 VBE window
  4. 粘贴内容并关闭 VBE window

如果您有任何顾虑,请先在试用工作表上尝试一下。

如果您保存工作簿,宏也会随之保存。 如果您使用的 Excel 版本晚于 2003,则必须保存 文件为 .xlsm 而不是 .xlsx

删除宏:

  1. 如上所述调出 VBE windows
  2. 清除代码
  3. 关闭 VBE window

要了解有关宏的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

要了解有关事件宏(工作表代码)的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/event.htm

必须启用宏才能工作!

下面是 C2 下拉菜单的显示方式: