如何在Excel中创build一个dynamic的下拉列表

我有一个电子表格,我正在尝试创build一个dynamic下拉列表。我已经安装了这个工具,以便我有一个Test No.列表和旁边的星期几。 它看起来像这样:

安装TestNumbers

现在我想要的是因为我添加相同的数字,我想要下拉列表中的一个列表,只给我没有使用该数字的可用天数。

也就是说1234下New下的下拉应该有Thu,Fri,Sat,Sun,即5678下新下的应该有Mon,Wed,Thu,Sat,Sun,也就是说9012下New下拉应该有星期六,太阳

我有一个命名的范围有7天的一周,我可以使用数据validation有这个名单是下拉选项,但我希望它是dynamic的,只给我的选项,尚未使用该Test No

可以这样做吗?

假设你的数据在列A:B,其中row1是标题行,并且你有一个名为Days的命名范围,然后右键单击工作表选项卡 – >查看代码并将下面给出的代码粘贴到打开的代码窗口中 – >保存工作簿作为macros启用的工作簿。

 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 

所以一旦你selectB列中的一个单元格,代码将添加一个下拉列表,不包括已经为特定testing编号select的日子。 A列中的相应单元格 在这里输入图像说明

您可以处理Worksheet_SelectionChange表代码模块中的Worksheet_SelectionChange事件以更改validation列表。 一些检查是必要的,以查看新的选定单元格是否是您想要validation的单元格之一; 即列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 

您可以使用相关的下拉列表
创build你的列表星期一 – 星期天定义名称wkday例如
select星期二 – 星期日和定义名字星期一
select星期三 – 星期日和定义名称星期二
select星期四 – 星期天和定义星期三
select星期五 – 星期日和定义星期四
select星期六 – 星期日和定义名称星期五
select星期日和定义名称星期六

您可以select您需要下拉列表的所有单元格:
以下面的单元格B2开始,在源代码中创build数据validation列表:

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