2009-11-06 80 views
1

我有一个13行的范围,第一行是一个标题行,接下来的12行由QueryTable填充。该查询将返回最多12行,但可能更少。在这个范围之下,我有一个总计行。自动筛选器不工作

我想隐藏任何没有数据的行,我使用AutoFilter来做到这一点。当我运行代码时,它会创建AutoFilter,但不会应用这些条件。如果我单步执行代码,它就可以正常工作。有任何想法吗?

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 

回答

1

首先,我看不出你是如何将工作表分配给“Sheet15”对象的 - 也许这是问题的一部分。如果您有一个命名范围,则在此之前不需要Sheet对象。其次,没有参数的自动过滤器只是打开/关闭自动过滤器箭头,并且你失去了标准。

试试这个代码,它为我工作(办公室2003)......我在A14

在A1头,接着A2..A13命名为DRCTable,随后= SUM(DRCTable) 编辑02-JAN-2010

(抱歉,我无法从我的度假住所所以这部分是语法测试,测试ODBC)

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 

希望帮助 祝你好运MikeD

+0

谢谢。 Sheet15是工作表对象的代码名称。这是参考工作表的首选方式。标准的最佳做法是先不使用条件来构建AutoFilter,然后再添加条件。问题似乎是一个时机;如果我单步执行代码,它就可以工作。如果我一次运行它,它不会。 – 2009-11-12 18:52:45

+0

在这种情况下,请尝试使用“BackgroundQuery”属性,即在应用.Refresh方法之前将其设置为FALSE。这可能只是一种安全预防措施,但我无法清楚地看到此属性的默认值。设置为TRUE,脚本执行一旦**连接**开始,而不是所有行都返回(这是你想要的)。祝你好运MikeD – MikeD 2009-11-16 08:37:49

+0

对不起,我保留了这么久。该建议似乎奏效了。如果您编辑原始解决方案以符合您的评论,我很乐意接受它。谢谢你的帮助! – 2009-12-30 23:37:44