【问题标题】:Excel dependent dropdown lists (With/without VBA)Excel 相关下拉列表(有/无 VBA)
【发布时间】:2011-05-27 10:46:09
【问题描述】:

我对 VBA 完全陌生,尽管我对常规 VB 非常熟悉。我不知道这是否必须通过 VBA 完成,或者是否可以使用内置的 Excel 功能完成。 基本上,我在隐藏工作表的列中有一堆数据。 另一张纸上应该有两个下拉列表,其中一个取决于另一个的选定值。但是,关系中有三个实体(请参见下面的示例) 我不知道我是如何让它工作的,甚至不知道这些行之间的关系是如何工作的。

这是我想要实现的目标的示例: 一张纸上有两列:“员工”和“项目”。 Employee 包含一组员工的下拉列表。此数据位于隐藏表中。 每个员工都与一个部门相关联,每个部门都与多个项目相关联。 一旦用户选择了特定员工,我希望活动行的“项目”列填充一个下拉列表,其中包含链接到所选员工所属部门的所有项目。 我将如何在 Excel 中设置这些关系,并编写实现此功能的 VBA 函数?

我无法为您提供隐藏工作表上数据列的外观示例,因为我不知道应该如何排列它们。

【问题讨论】:

    标签: excel vba drop-down-menu


    【解决方案1】:

    您可以在此处找到如何执行此操作的完整教程:

    http://www.contextures.com/xldataval02.html

    只要您的工作表的用户不更改下拉列表中允许的数据,您就不需要 VBA。如果是这种情况,我建议您添加某种“更新”功能(使用 VBA)。每当您允许的数据发生更改时,此更新功能只需重新定义您为每个下拉列表提供的命名单元格区域。

    在 VBA 中更改区域是单行的,只要您知道数据所在的区域(firstRowlastRowcolumn):

      ThisWorkbook.Names.Add Name:="areaname", _
           RefersToR1C1:="=YourSheetName!R" & firstRow & "C" & column _
           & ":R" & lastRow & "C" & column 
    

    【讨论】:

    • 这也适用于未排序的数据吗?我想要依赖下拉列表,但我的数据未排序。
    • @DutchArjo:当然,为什么不呢?
    • 如果有很多员工,我认为使用VBA自动化流程会有所帮助。
    【解决方案2】:

    这行得通:

    我假设三个部门(A、B、C)和编号为 1 到 9 的项目。有 3 名员工。当然,这可以推广到任意数量的员工、部门、项目。

    我这样放置数据:

    ColA    ColB  ColC  ColD     ColE ColF ColG
    Name    Dept        Dept      A    B    C
    Peter   A           Projects  1    4    8
    Paul    B                     2    5    9
    Mary    C                     3    6    
                                       7    
    

    在单元格 A7 中,我有一个使用数据验证创建的下拉菜单,您可以在其中选择员工:

    • 数据-->验证-->列表-->来源=$A$2:$A$4

    在工作表模块中:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Call FillDropDown
    End Sub
    

    它会自动更新单元格 D7 中的下拉菜单,然后您可以从中选择项目:

    Sub FillDropDown()
    
        Dim dept As String
        Dim col As Long
    
        dept = WorksheetFunction.VLookup(Range("A7"), Range("A2:B4"), 2, False)
        col = WorksheetFunction.Match(dept, Range("E1:G1"), 0)
    
        With Range("D7").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=$" & Chr(68 + col) _
                 & "$2:$" & Chr(68 + col) & "$10" 'Range("E2:E4").Offset(0, col - 1)
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    
    End Sub
    

    这应该为您提供一些开始。酌情调整单元格地址,以引用您的隐藏工作表、不同数量的员工、部门、项目等。

    【讨论】:

    • 这可行,但恕我直言,如果有一个没有 VBA 的更简单的解决方案,则无需使用 VBA 解决方案。
    • 如何确保下拉列表不包含重复项?
    猜你喜欢
    • 2022-07-31
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多