如何在Excel中创建动态下拉列表

时间:2017-04-21 18:36:04

标签: excel vba excel-formula excel-2010 dropdown

我有一个电子表格,我正在尝试创建一个动态下拉列表。我已经设置好了,因此我有一个Test No.列表和一周中的一周它。它看起来像这样:

Setup TestNumbers

现在我想要的是当我在其中一个列表中添加相同的号码时,我希望下拉列表只给出我尚未用于该号码的可用天数。

即。对于1234,New下的下拉应该是周四,周五,周六,周日 即对于5678,New下的下拉应该是Mon,Wed,Thu,Sat,Sun 即对于9012,New下的下拉应该有星期六,星期六,太阳

我有一个命名范围,一周有7天,我可以使用数据验证将该列表作为放置选项,但我希望它是动态的,只给我一些尚未使用的选项Test No

可以这样做吗?

3 个答案:

答案 0 :(得分:1)

您可以在工作表的代码模块中处理Worksheet_SelectionChange事件,以更改验证列表。需要进行一些检查以查看新选择的单元格是否是您要验证的单元格之一;即列B,A列中的标识符等。以下例程中的检查符合您的示例数据。

' Code Module of your worksheet
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.count > 1 Then Exit Sub
    If Target.Column <> 2 Or Target.row < 2 Then Exit Sub
    If Len(Trim(Target.Value)) > 0 Then Exit Sub
    If Len(Trim(Target.offset(, -1).Value)) = 0 Then Exit Sub

    Dim newList As String: newList = ",Sun,Mon,Tue,Wed,Thu,Fri,Sat"
    Dim r As Range: Set r = Target.offset(-1)
    Do Until Len(Trim(r.Value2)) = 0 Or r.offset(, -1).Value2 <> Target.offset(, -1).Value2
        newList = Replace(newList, "," & r.Value2, "")
        Set r = r.offset(-1)
    Loop
    With Target.Validation
        .Delete
        .Add xlValidateList, , , Mid(newList, 2)
    End With
End Sub

答案 1 :(得分:1)

假设您的数据位于列A:B中,其中row1是标题行,并且您有一个名为的命名范围,则右键单击工作表标签 - &gt;查看代码并将下面给出的代码粘贴到打开的代码窗口中 - &gt;将工作簿另存为启用宏的工作簿。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
Dim x, dict
Dim i As Long, lr As Long
Dim Rng As Range, Cell As Range
Dim Str As String
lr = Cells(Rows.Count, 1).End(xlUp).Row
Set Rng = Range("A2:A" & lr)
x = Range("Days").Value
Set dict = CreateObject("Scripting.Dictionary")
If Target.Column = 2 And Target.Row > 1 Then
    If Target.Offset(0, -1) <> "" Then
        For Each Cell In Rng
            If Cell <> "" And Cell = Target.Offset(0, -1) Then
                If Str = "" Then
                    Str = Cell.Offset(0, 1).Value
                Else
                    Str = Str & ", " & Cell.Offset(0, 1).Value
                End If
            End If
        Next Cell
        For i = 1 To UBound(x, 1)
            If InStr(Str, x(i, 1)) = 0 Then
                dict.Item(x(i, 1)) = ""
            End If
        Next i
        On Error Resume Next
        With Target.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                                xlBetween, Formula1:=Join(dict.keys, ",")
        End With
    End If
End If
End Sub

因此,一旦您在B列中选择了一个单元格,代码就会添加一个下拉列表,不包括为特定测试编号选择的日期。 A栏中的相应单元格 enter image description here

答案 2 :(得分:0)

您可以使用依赖下拉列表
创建列表周一 - 周日定义名称 wkday ,例如
选择星期二 - 星期日和定义名称星期一
选择周三 - 周日和定义名称星期二
选择星期四 - 星期日和定义名称星期三
选择星期五 - 星期日和定义名称星期四
选择周六 - 周日和定义名称周五
选择星期日并定义名称星期六

您可以选择需要下拉列表的所有单元格:
从下面的Cell B2开始,在Source中创建数据验证,List:

=IF(OR(B1="",B1="Day"),wkday,INDIRECT(B1))