Excel 自动过滤器不工作

Excel 自动过滤器不工作,excel,vba,Excel,Vba,我有一个13行的范围,第一行是标题行,接下来的12行由查询表填充。查询将返回最多12行,但可能更少。在这个范围下,我有一个总计行 我想隐藏任何没有数据的行,我正在使用自动筛选来实现这一点。当我运行代码时,它会创建自动筛选,但不会应用条件。如果我一步一步地检查代码,它就可以正常工作。有什么想法吗 Sub fillTable() Dim strConn As String Dim strSQL As String Dim qt As QueryTable Sheet

我有一个13行的范围,第一行是标题行,接下来的12行由查询表填充。查询将返回最多12行,但可能更少。在这个范围下,我有一个总计行

我想隐藏任何没有数据的行,我正在使用自动筛选来实现这一点。当我运行代码时,它会创建自动筛选,但不会应用条件。如果我一步一步地检查代码,它就可以正常工作。有什么想法吗

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