我是VBA新手,正在尝试自动筛选列范围。该列被命名为"Vlookup“,位于索引位置27。
rData.AutoFilter field:=27, Criteria1:="Class" ' filter criterion
为了使其动态化,我需要能够根据列名而不是列索引进行过滤。
但是,当我这样做的时候
rData.AutoFilter field:=Application.Match("Vlookup", Selection.Rows(1), 0), Criteria1:="Class" ' filter criterion
我投降了
运行时错误'424‘-需要对象
如何在VBA中按列名正确地 Autofilter
?
发布于 2018-06-20 03:44:50
不知道您选择了什么选项,但我们遇到了类似的问题,我们发现只需使用表存储数据,然后使用Field:=Listobject.ListColumns(“列名”).Index就可以了。这样,您的解决方案就是动态的。
Set rData = Workbooks("Workbook Name").Worksheets("Sheet Name").Listobjects("Table Name")
rData.DataBodyRange.AutoFilter field:=rData.ListColumns("Vlookup").Index, Criteria1:="Class"
发布于 2017-12-04 17:17:29
您可以使用Find
函数在标题行中查找"Vlookup“,然后检索Column
的数值。
注意:不需要使用Selection
,而是使用rData
工作表对象完全限定您的Rows(1)
(使用With rData
语句)。
请参阅下面的代码和注释:
Dim FindRng As Range
Dim FiltCol As Long
With rData
Set FindRng = .Rows(1).Find(what:="Vlookup")
If Not FindRng Is Nothing Then ' Find was successful
FiltCol = FindRng.Column ' get the column number where "Vlookup" was found
Else ' find unable to find "Vlookup"
MsgBox "Find Error!"
Exit Sub
End If
.AutoFilter Field:=FiltCol, Criteria1:="Class" ' filter criterion
End With
发布于 2017-12-04 17:20:26
您可以使用helper UDF,它将返回列的索引:
Function GetIndex(colName As String)
GetIndex = WorksheetFunction.Match(colName, ActiveSheet.AutoFilter.Range.Rows(1), 0)
End Function
更新
您可以用您的工作表替换ActiveSheet
。
https://stackoverflow.com/questions/47629885
复制相似问题