例如,假设我有2张桌子。表A是省,表B是城市。
我没有每个省的表格,因此城市的下拉列表应仅显示基于我选择的省的值
省
ID, Title
1, Ontario
2, Quebec
城市
ID, ProvinceID, Title
1, 1, Ottawa
2, 1, Toronto
3, 2, Quebec City
我有第三个表,可以叫它,citysVisited表。该表看起来像这样
ID, Provivince, City
1, [Province Drop down based on the entire column], [INSERT ISSUE HERE]
如果我更改省的下拉菜单,则应该清除城市的下拉菜单值。
城市下拉列表的值取决于在省下拉列表中选择的内容。
感谢您的帮助:)
答案 0 :(得分:0)
让我们假设工作表1的结构类似于下图:
在工作表1更改事件上使用此代码:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strID As String, strarr As String
Dim i As Long, LastRow As Long
With ThisWorkbook.Worksheets("Sheet1") '<- Change sheet name if needed
If Not Intersect(Target, .Range("B1")) Is Nothing And Target.Count = 1 Then '<- Lets say that province drop down appears in cell B1.If cell affected then
Application.EnableEvents = False
.Range("B2").ClearContents '<- Clear Cities drop down
strID = Target.Value '<- Let as assume that province drop down includes provinces ID NOT Title
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row '<- Find the last row of the Cities table
For i = 3 To LastRow '<- Loop cities table and get the cities with provincesw choicen
If .Range("E" & i).Value = strID Then
If strarr = "" Then
strarr = .Range("F" & i).Value
Else
strarr = strarr & "," & .Range("F" & i).Value
End If
End If
Next i
With .Range("B2").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=strarr
End With
Application.EnableEvents = True
End If
End With
End Sub
答案 1 :(得分:0)
如果仅用于1个下拉列表,而不是用于多个下拉列表,则可以在AGGREGATE
和数组公式。
AGGREGATE(15, 7, Range, k
将使您获得15
中最小的 k th 值(Range
隐藏行(7
)。因此,我们需要将Range
定义为一个数组,当省份匹配我们的选择时返回ID;否则,返回一个错误(嘿,NA()
函数返回一个错误!)。
这似乎很简单:如果E列与单元格H2匹配,IF(E$1:E$4=$H$2,D$1:D$4,NA())
将返回D列中的值,否则返回#NA!
错误
k
?好吧,我们想从顶部开始(k = 1)并向下移动各行,因此我们可以使用ROW()-1
从第2行开始
=AGGREGATE(15,7,IF(E$1:E$4=$H$2,D$1:D$4,NA()),ROW()-1)
NB 输入公式后,您必须按 Ctrk + Shift + Enter ,以确保它是一个数组公式(由{
和}
包围)
然后,我们只需要一个校验和列就可以告诉我们要获取多少行数据:=--NOT(ISERROR(I:I))
将为我们提供1
包含城镇的行,或0
错误行。我们只需SUM
将该列用于OFFSET
中,即可为下拉列表建立命名范围
答案 2 :(得分:0)