首页 > 解决方案 > 使用过滤后的数据填充下拉列表

问题描述

我正在尝试找到一种方法来制作一个下拉列表,该列表仅在源表的不同列中满足条件时才包含项目。

所以基本上我有一张桌子,上面列出了过去和现在的所有工作。有的已经完工,有的还在营业。A 列包含所有唯一的作业编号,P 列让用户知道作业是打开还是关闭。如果作业已关闭,则单元格包含“Y”,如果作业仍处于打开状态,则单元格为空。

我有另一个表,它有一个下拉列表,允许用户选择他们正在处理的工作。为了保持下拉列表的大小合理,我只希望它包含仍处于打开状态的作业的作业编号。有没有办法使用 IF 语句或类似的方法,如果 P 列为空,则仅使用 A 列中的作业编号填充下拉列表?

我发现了几个使用一个下拉列表来更改不同下拉列表中的项目的示例,但似乎它们都需要事先知道源数据并在命名范围内,而对我来说,这将是一个动态列表由于工作已关闭并添加了其他工作。到目前为止,我一直找不到任何可以适用于我的情况的东西。

标签: exceldrop-down-menuexcel-2013

解决方案


我认为制作列表的最简单方法是使用宏来完成。

如果您遍历该列,然后将每个未关闭的作业放入一个数组中,
则可以将该数组作为列表。

Sub makeList()
Dim arr() As Variant, i As Integer, lnght As Long
lnght = Range("A" & Rows.Count).End(xlUp).Row
i = 0
For Each cell In Range("A1:A" & lnght)
    If Not cell.Offset(0, 15).Value = "Y" Then
        ReDim Preserve arr(0 To i) As Variant
        arr(i) = cell.Value
        i = i + 1
    End If
Next

With Range("C1").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Formula1:=Join(arr, ",")
End With
End Sub

这会将下拉列表置于“C1”中,因此只需将其更改为应有的位置。

每次添加、删除或更改为已关闭作业时,都需要更新此信息。您可以有一个更新按钮,或者只是将代码放在工作表中。我建议使用 a 调用它Worksheet_Change,如果您不希望它在每次更改时都运行,请添加一个 intersect 方法来验证更改的目标是否与列表相关。

此外,这假定分隔符为“,”,因此如果需要,请相应地进行更改。


推荐阅读