Vba 是否可以对数据验证下拉列表应用筛选器?
我在上有一个下拉列表,其中显示了另一个工作表中的合并零件库。该工作表将不断更新,直到我们能够获得一个工作数据库,因此明细表的功能或多或少是一成不变的 零件库是通过查询购买的,如下所示: 我连接了一些数据,形成了一个命名表“ProjectTab”,如下所示: 命名表形成一个详细的数据验证列表,如下所示: 为了让工作表自动填充,我缩短了数据验证列表的输出,只输出Vba 是否可以对数据验证下拉列表应用筛选器?,vba,excel,Vba,Excel,我在上有一个下拉列表,其中显示了另一个工作表中的合并零件库。该工作表将不断更新,直到我们能够获得一个工作数据库,因此明细表的功能或多或少是一成不变的 零件库是通过查询购买的,如下所示: 我连接了一些数据,形成了一个命名表“ProjectTab”,如下所示: 命名表形成一个详细的数据验证列表,如下所示: 为了让工作表自动填充,我缩短了数据验证列表的输出,只输出零件索引,如下所示: Private Sub Worksheet_Change(ByVal Target As Range) On
零件索引
,如下所示:
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的解决方案更新了我的答案。希望这会有所帮助。这是一个出色的解决方法,我找不到任何缺陷。非常感谢您为这个答案投入时间和精力