依赖于Excel的下拉列表(带/不带VBA)

时间:2011-05-27 10:46:10

标签: excel vba drop-down-menu

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

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

我无法向您提供隐藏工作表上的数据列的示例,因为我不知道如何安排它们开始。

2 个答案:

答案 0 :(得分:6)

在这里您可以找到完整的教程:

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

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

如果您知道数据所在的区域(firstRowlastRowcolumn),则更改区域是VBA中的一个区域:

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

答案 1 :(得分:6)

这有效:

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

我放置了这样的数据:

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

这应该为您提供一些东西。根据需要调整单元格地址,以引用隐藏的工作表,不同数量的员工,部署,项目等。