Я пишу скрипт для рабочего листа, ячейки которого заполняются на основе базы данных Access.Я пытаюсь очистить содержимое листа, не удаляя автофильтры, которые пользователь установил, а затем перезагружать данные на основе базы данных.Прямо сейчас я использую:
Sub populateSheet()
Dim sht As Worksheet
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase("c:\myDB.mdb")
Set rs = db.OpenRecordset("myData")
Set sht = ThisWorkbook.Sheets("my output")
With sht
.Cells.value=empty
For c = 0 To rs.Fields.Count - 1
.Cells(1, c + 1) = rs.Fields(c).name
Next
.Range("a2").CopyFromRecordset rs
End With
End Sub
sub buildTable()
dim ws as workspace
dim db as database
dim dbPath as string
set ws=dbengine.workspaces(0)
set db=ws.createdatabase("c:\myDB.mdb")
db.execute "create table myData (field1 text,field2 text)"
db.execute "insert into myData (field1,field2) values (""1"",""a"")"
db.execute "insert into myData (field1,field2) values (""2"",""b"")"
db.execute "insert into myData (field1,field2) values (""3"",""a"")"
db.close
end sub
sub test()
buildTable
populateSheet
end sub
Когда я запускаю .cells.clear
, он стирает автофильтр.Есть ли способ сохранить настройки автофильтра, чтобы новые данные были отфильтрованы таким же образом?Или, может быть, записать их и повторно применить те же настройки?Я пытался работать с этим решением , но у меня были проблемы с его определением, какие столбцы были отфильтрованы.
РЕДАКТИРОВАТЬ:
Я применил подход Жана-Франсуа Корбетта в приведенном выше коде, но у него есть проблема.Попробуйте сделать это с помощью тестовой таблицы:
1 a
2 b
3 a
После запуска populateSheet
, а затем автофильтровать 2-й столбец, чтобы включить только «a», на рабочем листе отображается:
1 a
3 a
Затем выполнитеpopulateSheet
снова, теперь лист показывает:
1 a
1 a
Если вы удалите автофильтр, повторно запустите populateSheet
и повторно примените автофильтр, вы получите правильные данные, но это очень громоздкий дополнительный шагчтобы получить правильный вывод.
РЕДАКТИРОВАТЬ: я добавил код для создания базы данных и создать таблицу, которую вы можете использовать для проверки populateSheet
, и изменил некоторые аргументы в populateSheet
, чтобы отразить эту тестовую базу данных.