如何基于另一个单元格在Excel中创建动态下拉列表

时间:2019-04-15 13:24:07

标签: excel list

例如,假设我有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]

如果我更改省的下拉菜单,则应该清除城市的下拉菜单值。

城市下拉列表的值取决于在省下拉列表中选择的内容。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:0)

让我们假设工作表1的结构类似于下图:

enter image description here

在工作表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中,即可为下拉列表建立命名范围

Image showing an example of the formula in use, with the data from the Question Post

答案 2 :(得分:0)

这是没有VBA或讨厌(IMO)数组公式的解决方案,但仅适用于单个“省”下拉菜单。

enter image description here

它以“城市选项”的“ ID”列中的公式为中心:

MINIFS($G$3:$G$5,$H$3:$H$5,INDEX($D$3:$D$4,MATCH($B$1,$E$3:$E$4,0)),$G$3:$G$5,">"&MAX($K$1:$K1))

这将获取所选省份的城市ID的列表。然后将其包装在IF中,以将零更改为空字符串。

然后可以将数据验证列表设置为L3:LXX。这样,当所选省份更改时,列表也会更改。