Excel 自动过滤器不工作
我有一个13行的范围,第一行是标题行,接下来的12行由查询表填充。查询将返回最多12行,但可能更少。在这个范围下,我有一个总计行 我想隐藏任何没有数据的行,我正在使用自动筛选来实现这一点。当我运行代码时,它会创建自动筛选,但不会应用条件。如果我一步一步地检查代码,它就可以正常工作。有什么想法吗Excel 自动过滤器不工作,excel,vba,Excel,Vba,我有一个13行的范围,第一行是标题行,接下来的12行由查询表填充。查询将返回最多12行,但可能更少。在这个范围下,我有一个总计行 我想隐藏任何没有数据的行,我正在使用自动筛选来实现这一点。当我运行代码时,它会创建自动筛选,但不会应用条件。如果我一步一步地检查代码,它就可以正常工作。有什么想法吗 Sub fillTable() Dim strConn As String Dim strSQL As String Dim qt As QueryTable Sheet
Sub fillTable()
Dim strConn As String
Dim strSQL As String
Dim qt As QueryTable
Sheet15.AutoFilterMode = False
Sheet15.Range("DCRTable").ClearContents
strConn = "ODBC;DSN=MS Access Database;DBQ=<db path>;"
Set qt = Sheet15.QueryTables.Add(strConn, Sheet15.Range("DCRTable"))
qt.CommandText = <sql query>
qt.AdjustColumnWidth = False
qt.EnableRefresh = False
qt.FieldNames = False
qt.Refresh
hideEmpties Sheet15.Range("DCRTable").offset(-1).Resize(13)
End Sub
Sub hideEmpties(rng As Range)
rng.Parent.AutoFilterMode = False
With rng
.AutoFilter
.AutoFilter 1, "<>", , , False
End With
End Sub
子填充表()
作为字符串的Dim strConn
作为字符串的Dim strSQL
将qt设置为查询表
Sheet15.AutoFilterMode=False
表15.范围(“目录”).ClearContents
strConn=“ODBC;DSN=MS Access数据库;DBQ=;”
Set qt=Sheet15.QueryTables.Add(strConn,Sheet15.Range(“DCRTable”))
qt.CommandText=
qt.AdjustColumnWidth=False
qt.enablefresh=False
qt.FieldNames=False
qt.刷新
隐藏空白页15.范围(“DCRTable”).偏移(-1).调整大小(13)
端接头
子隐藏空间(rng As范围)
rng.Parent.AutoFilterMode=False
带rng
.自动过滤器
.AutoFilter 1,“,,False
以
端接头
首先,我看不出您是如何将工作表分配给对象“Sheet15”的-也许这是问题的一部分。如果有命名范围,则在此之前不需要图纸对象
其次,.Autofilter不带参数,只需打开/关闭Autofilter箭头,您就失去了条件
试试这个代码,它对我有用(Office 2003)。。。在A1中有一个标题,后面是A2..A13,命名为DRCTable,在A14中后面是a=SUM(DRCTable)
编辑2010年1月2日
(很抱歉,我无法从我的度假住所测试ODBC,因此此部分仅按语法进行测试)
子填充表()
将MySheet设置为工作表,MyRange设置为范围
将MyQRY设置为查询表,MyCONNECT设置为字符串,MySELECT设置为字符串'2010年1月2日添加
“初始化
设置MySheet=Sheets(“Sheet1”)
设置MyRange=Range(“DRCTable”)
MyCONNECT=“ODBC;”于2010年1月2日添加
MySELECT=“选择双轨制””于2010年1月2日添加。。注意到我的过去:)??
设置MyQRY=ActiveSheet.QueryTables.Add(连接:=MyCONNECT_
目的地:=MyRange_
Sql:=MySELECT)
“清理
MySheet.AutoFilterMode=False
MyRange.ClearContents
'模拟查询已删除2010年1月2日
'MyRange(1,1)=1已删除2010年1月2日
'MyRange(2,1)=2已删除2010年1月2日
'MyRange(3,1)=3已删除2010年1月2日
'MyRange(4,1)=4已删除2010年1月2日
'MyRange(5,1)=5已删除2010年1月2日
'已于2010年1月2日添加
'BackgroundQuery=FALSE将等待执行查询
'=一旦连接到数据库,VBA将继续为TRUE
MyQRY.BackgroundQuery=False'将此设置为影响所有子类刷新
'并且不要在刷新中使用bool,除非
'以覆盖该设置
MyQRY.Refresh False“False为单个刷新设置背景查询;
'刷新方法中此参数没有默认值。
'如果此处未指定,则使用QueryTable.BackgroundQuery属性
"审查,
'选择数据范围加上标题和过滤器
范围(MyRange.Offset(-1,0),MyRange(12,1)).AutoFilter_
字段:=1,标准1:
端接头
希望有帮助
祝你好运MikeD首先,我看不出你是如何将工作表分配给对象“Sheet15”的-也许这是问题的一部分。如果有命名范围,则在此之前不需要图纸对象 其次,.Autofilter不带参数,只需打开/关闭Autofilter箭头,您就失去了条件 试试这个代码,它对我有用(Office 2003)。。。在A1中有一个标题,后面是A2..A13,命名为DRCTable,在A14中后面是a=SUM(DRCTable) 编辑2010年1月2日 (很抱歉,我无法从我的度假住所测试ODBC,因此此部分仅按语法进行测试)
子填充表()
将MySheet设置为工作表,MyRange设置为范围
将MyQRY设置为查询表,MyCONNECT设置为字符串,MySELECT设置为字符串'2010年1月2日添加
“初始化
设置MySheet=Sheets(“Sheet1”)
设置MyRange=Range(“DRCTable”)
MyCONNECT=“ODBC;”于2010年1月2日添加
MySELECT=“选择双轨制””于2010年1月2日添加。。注意到我的过去:)??
设置MyQRY=ActiveSheet.QueryTables.Add(连接:=MyCONNECT_
目的地:=MyRange_
Sql:=MySELECT)
“清理
MySheet.AutoFilterMode=False
MyRange.ClearContents
'模拟查询已删除2010年1月2日
'MyRange(1,1)=1已删除2010年1月2日
'MyRange(2,1)=2已删除2010年1月2日
'MyRange(3,1)=3已删除2010年1月2日
'MyRange(4,1)=4已删除2010年1月2日
'MyRange(5,1)=5已删除2010年1月2日
'已于2010年1月2日添加
'BackgroundQuery=FALSE将等待执行查询
'=一旦连接到数据库,VBA将继续为TRUE
MyQRY.BackgroundQuery=False'将此设置为影响所有子类刷新
'并且不要在刷新中使用bool,除非
'以覆盖该设置
MyQRY.Refresh False“False为单个刷新设置背景查询;
'刷新方法中此参数没有默认值。
'如果此处未指定,则使用QueryTable.BackgroundQuery属性
"审查,
'选择数据范围加上标题和过滤器
范围(MyRange.Offset(-1,0),MyRange(12,1)).AutoFilter_
字段:=1,标准1:
端接头
希望有帮助
祝你好运,谢谢。Sheet15是工作表对象的代码名。这是首选
Sub fillTable()
Dim MySheet As Worksheet, MyRange As Range
Dim MyQRY As QueryTable, MyCONNECT As String, MySELECT As String ' added 02-Jan-2010
'initialize
Set MySheet = Sheets("Sheet1")
Set MyRange = Range("DRCTable")
MyCONNECT = "ODBC;..." ' added 02-Jan-2010
MySELECT = "SELECT * FROM DUAL" ' added 02-Jan-2010 .. noticed my Oracle past :) ??
Set MyQRY = ActiveSheet.QueryTables.Add(Connection:=MyCONNECT, _
Destination:=MyRange, _
Sql:=MySELECT)
' clean up
MySheet.AutoFilterMode = False
MyRange.ClearContents
' simulate Query removed 02-Jan-2010
' MyRange(1, 1) = 1 removed 02-Jan-2010
' MyRange(2, 1) = 2 removed 02-Jan-2010
' MyRange(3, 1) = 3 removed 02-Jan-2010
' MyRange(4, 1) = 4 removed 02-Jan-2010
' MyRange(5, 1) = 5 removed 02-Jan-2010
' added 02-Jan-2010
' BackgroundQuery = FALSE waits until query is executed
' = TRUE continues with VBA once connection to DB is made
MyQRY.BackgroundQuery = False ' set this to affect all subsequet refresh
' and don't use the bool in refresh except
' to override the setting
MyQRY.Refresh False ' the false sets BackgroundQuery for the individual refresh;
' there is no default on this param within the refresh method.
' If unspecified here the QueryTable.BackgroundQuery property
' is examined
' select data range plus header and filter
Range(MyRange.Offset(-1, 0), MyRange(12, 1)).AutoFilter _
Field:=1, Criteria1:="<>"
End Sub