2009-11-06 2 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 перед этим.

Во-вторых, .Autofilter без аргументов просто включает/выключает стрелку автофильтра, и вы теряете свои критерии.

Попробуйте этот код, он работал на меня (офис 2003) ... У меня есть заголовок в A1, а затем A2..A13 названный как DRCTable, а затем а = SUM (DRCTable) в A14

редактировать 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 без критериев, а затем добавить критерии позже. Проблема, по-видимому, одна из сроков; если я пройду через код, он будет работать. Если я запустил все сразу, это не так. –

+0

в этом случае попытайтесь использовать свойство BackgroundQuery, то есть установите FALSE перед применением метода .Refresh. Это может быть просто предосторожность, но я не мог четко видеть, что является дефолтом для этого свойства. Установите значение ИСТИНА, выполнение скрипта начинается после создания ** соединения **, а не при возврате всех строк (это то, что вы хотите). Удачи MikeD – MikeD

+0

Жаль, что я долгое время просидел за это. Кажется, что это предложение сработало. Если вы отредактируете свое оригинальное решение в соответствии с вашим комментарием, я буду рад принять его. Спасибо за вашу помощь! –

Смежные вопросы