dynamicDropDown在Excel中

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

这是一个有点粗糙的想法…尝试一下 – 我已经devise了所有sheet2首先创build数据

[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]状态距离子状态1 Dist1

首先在下拉列表1中添加唯一状态值'drpState',并将getDist()分配给状态select的下拉列表(为dist,sub dist等其他select项做更多的2)

创build3个下拉菜单'drpState'[Macro:getDist()],'drpDist'[Macro: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包含作为逗号分隔列表的辅助下拉列表信息每个列表位于一个单元格中。 下面的事件macros将检测对单元格B2的更改并相应地在单元格C2中build立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窗口底部附近的选项卡名称
  2. select查看代码 – 这会popup一个VBE窗口
  3. 粘贴东西,closuresVBE窗口

如果您有任何疑问,请先在试用工作表上尝试。

如果您保存该工作簿,该macros将与它一起保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx

要删除macros:

  1. 调出上面的VBE窗口
  2. 清除代码
  3. closuresVBE窗口

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

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

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

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

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

macros必须启用这个工作!

下面是如何显示C2下拉菜单:

在这里输入图像说明