У меня есть ряд из 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
Спасибо. Sheet15 - это кодовое имя для объекта рабочей таблицы. Это предпочтительный способ ссылки на листы. Стандартная передовая практика заключается в том, чтобы сначала сформировать AutoFilter без критериев, а затем добавить критерии позже. Проблема, по-видимому, одна из сроков; если я пройду через код, он будет работать. Если я запустил все сразу, это не так. –
в этом случае попытайтесь использовать свойство BackgroundQuery, то есть установите FALSE перед применением метода .Refresh. Это может быть просто предосторожность, но я не мог четко видеть, что является дефолтом для этого свойства. Установите значение ИСТИНА, выполнение скрипта начинается после создания ** соединения **, а не при возврате всех строк (это то, что вы хотите). Удачи MikeD – MikeD
Жаль, что я долгое время просидел за это. Кажется, что это предложение сработало. Если вы отредактируете свое оригинальное решение в соответствии с вашим комментарием, я буду рад принять его. Спасибо за вашу помощь! –