Vba 是否可以对数据验证下拉列表应用筛选器?

Vba 是否可以对数据验证下拉列表应用筛选器?,vba,excel,Vba,Excel,我在上有一个下拉列表,其中显示了另一个工作表中的合并零件库。该工作表将不断更新,直到我们能够获得一个工作数据库,因此明细表的功能或多或少是一成不变的 零件库是通过查询购买的,如下所示: 我连接了一些数据,形成了一个命名表“ProjectTab”,如下所示: 命名表形成一个详细的数据验证列表,如下所示: 为了让工作表自动填充,我缩短了数据验证列表的输出,只输出零件索引,如下所示: Private Sub Worksheet_Change(ByVal Target As Range) On

我在上有一个下拉列表,其中显示了另一个工作表中的合并零件库。该工作表将不断更新,直到我们能够获得一个工作数据库,因此明细表的功能或多或少是一成不变的

零件库是通过查询购买的,如下所示:

我连接了一些数据,形成了一个命名表“ProjectTab”,如下所示:

命名表形成一个详细的数据验证列表,如下所示:

为了让工作表自动填充,我缩短了数据验证列表的输出,只输出
零件索引
,如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next

Dim textVal As String
Dim strVal As String

    strVal = Target.Value
        If Target.Column = 2 Then
            textVal = Left(strVal, 9)
                Target.Value = textVal

    End If
End Sub
下面的
IF
语句允许我确定零件的产品类型
=IF(B2>0,IF(LEFT(D2,1)=“1”,“组装”,IF(LEFT(D2,1)=“2”,“子组装”,IF(LEFT(D2,1)=“3”,“软件”,IF(LEFT(D2,1)=“4”,“硬件”,IF(LEFT(D2,1)=“5”,“化学”,IF(LEFT(D2,1)=“6”,“备用”,IF(LEFT(D2,1)=“7”,“备用”,IF(LEFT(D2,1)=“8”,“文档”,IF(LEFT(D2,1)=“9”,“杂项”、“,”)”)”)/code>
将生成以下列:

我想使用类似于上述
IF
语句的内容来过滤下拉列表以选择零件,即,我通过工作表顶部的过滤器预选
装配类型
,该过滤器将
零件列表
下拉列表过滤为相应的类型

这可能吗?如果是这样的话,我该怎么做呢

谢谢


Dan更新了答案

我已经编写了一个VBA示例,我认为它对您很有用。您可以下载一个示例,但如果您愿意,并且为了将来的读者,您可以根据下面的示例构建自己的工作表

对于本例,您需要按如下方式设置工作簿

复制并粘贴到“示例”工作表代码中

    Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AssemblyFilter As Range, PartsDropDown As Range
    Dim strList As String, strAssemblyFilter As String
    Dim i As Long

    Set AssemblyFilter = Range("B1") 'Set this to the cell that has the Assembly Filter
    strAssemblyFilter = AssemblyFilter.Value

    If Not Intersect(Target, AssemblyFilter) Is Nothing Then 'Only Run following code when Assembly Filter cell has changed
        strList = ""
        With Sheets("Parts Library")    'Sheet with Parts Library
            For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
                If strAssemblyFilter = .Cells(i, "B").Value Then    'Compare Assembly Filter to values in Column "B"
                    strList = strList & "," & .Cells(i, "A").Value  'If filter matches, then append this to the data Validation List
                End If
            Next i
            strList = Mid(strList, 2)   'Chop off leading comma
        End With

        'Apply Data Validation to this Range (starting at cell B4 and ending at the last row with data in column A)
        Set PartsDropDown = Range("B4:B" & Cells(Rows.Count, "A").End(xlUp).Row)
        Application.EnableEvents = False
        With PartsDropDown.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=strList                  'Pass in Validation List created above
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
        Application.EnableEvents = True
    End If
End Sub
当您更改部件过滤器并触发
工作表\u change
事件时,代码首先基于部件过滤器生成明细表,然后重置并创建一个新的验证过滤器,从B4开始,到最后一行结束,数据在a列中。您可以根据需要进行调整,如果愿意,甚至可以硬编码一个范围


希望这对您有所帮助,如果您在修改此文件以供使用时遇到任何问题,请告诉我。

谢谢,我现在就查看它!这是对我的问题的一个很好的回答,但并不能完全解决它。在公式中设置数据验证源时,它会设置一个自动更新表,例如,如果表中有20个可能的条目,并且我选择了第10行,但需要在第9行添加一个新条目,则我以前选择的条目将被编入第11行,但所选条目仍将显示条目10。我希望这有意义?不幸的是,电子表格将随着时间的推移不断更新,因此我没有静态数据的奢侈:(@DanM,我已经用一个使用VBA的解决方案更新了我的答案。希望这会有所帮助。这是一个出色的解决方法,我找不到任何缺陷。非常感谢您为这个答案投入时间和精力