【发布时间】:2011-12-08 07:17:19
【问题描述】:
我正在为基于 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 时,它会清除自动过滤器。有没有办法可以保留自动筛选设置,以便以相同的方式筛选新数据?或者也许记录它们并重新应用相同的设置?我尝试使用this solution,但无法让它检测到哪些列被过滤。
编辑:
我在上面的代码中应用了 Jean-FrançoisCorbett 的方法,但它有一个问题。用测试表试试这个:
1 a
2 b
3 a
运行populateSheet 后,自动筛选第二列以仅包含“a”,工作表显示:
1 a
3 a
然后再次运行populateSheet,工作表现在显示:
1 a
1 a
如果您删除自动过滤器,重新运行populateSheet,然后重新应用自动过滤器,您将获得正确的数据,但要获得正确的输出,这是一个非常繁琐的额外步骤。
编辑:
我添加了代码来创建一个数据库并创建一个可用于测试populateSheet 的表,并更改了populateSheet 中的一些参数以反映这个测试数据库。
【问题讨论】:
-
你试过用 .ClearContents 代替 .Clear 吗?
-
@TimWilliams,这仍然会清除自动筛选。 sigil,您使用的是哪个 Excel 版本?
标签: vba excel autofilter