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
因为它是工作表代码,所以安装和自动使用非常容易:
- 右键单击 Excel window
底部附近的选项卡名称
- select 查看代码 - 这会弹出一个 VBE window
- 粘贴内容并关闭 VBE window
如果您有任何顾虑,请先在试用工作表上尝试一下。
如果您保存工作簿,宏也会随之保存。
如果您使用的 Excel 版本晚于 2003,则必须保存
文件为 .xlsm 而不是 .xlsx
删除宏:
- 如上所述调出 VBE windows
- 清除代码
- 关闭 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 下拉菜单的显示方式:
我想创建一个州、地区、分区等的下拉列表。通过从 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
因为它是工作表代码,所以安装和自动使用非常容易:
- 右键单击 Excel window 底部附近的选项卡名称
- select 查看代码 - 这会弹出一个 VBE window
- 粘贴内容并关闭 VBE window
如果您有任何顾虑,请先在试用工作表上尝试一下。
如果您保存工作簿,宏也会随之保存。 如果您使用的 Excel 版本晚于 2003,则必须保存 文件为 .xlsm 而不是 .xlsx
删除宏:
- 如上所述调出 VBE windows
- 清除代码
- 关闭 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 下拉菜单的显示方式: