清除细胞,同时保留自动filter设置?
我正在为其单元格基于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
,它会清除Autofilter。 有没有办法保持自动筛选设置,以便新的数据将以相同的方式进行过滤? 或者可能logging它们并重新应用相同的设置? 我试着使用这个解决scheme ,但是我很难得到它来检测哪些列被过滤。
编辑:
我在上面的代码中应用了Jean-FrançoisCorbett的方法,但是有一个问题。 试试这个testing表:
1 a 2 b 3 a
运行populateSheet
,然后自动筛选第二列以仅包含“a”,工作表显示:
1 a 3 a
然后再次运行populateSheet
,工作performance在显示:
1 a 1 a
如果你删除自动filter,重新运行populateSheet
,并重新应用自动filter,你会得到正确的数据,但这是一个非常繁琐的额外步骤,以获得正确的输出。
编辑:我添加代码来创build一个数据库,并build立一个表,你可以用它来testingpopulateSheet
,并改变populateSheet
一些参数,以反映这个testing数据库。
如果你只是想清除单元格中的值而没有其他的东西,那么你可以这样做:
sht.Cells.Value = Empty
编辑响应OP的编辑:
奇怪的是,上面的语句不会清空被Autofilter隐藏的行中的单元格! 我认为使用CopyFromRecordset
导入数据时,隐藏自动筛选的行也会导致意外的行为。
解决这个问题当然是,在清空所有单元格和导入数据之前,通过将自动filter设置为(All)
来取消隐藏所有行,在VBA中这样做是这样的:
With Range("C1:D1") ' or wherever the filters are .AutoFilter Field:=1 .AutoFilter Field:=2 ' ... continue to set all fields to (All). End With
好的,我有一个解决scheme。 基本上,我将自动筛选标准logging在一系列变体中,然后删除自动筛选设置,填充工作表(使用@ Jean-FrançoisCorbett的build议sht.Cells.Value = Empty
),然后重新应用数组中的设置。 代码如下:
Sub reapplyAutofilter() Dim fltr As Filter Dim columnCriteria1() As Variant Dim columnCriteria2() As Variant Dim columnOperators() As Variant Dim filterCriteria() As Variant Dim sht As Worksheet Dim rangeAddr As String Dim fieldCount As Long Dim ctr As Long Set sht = ThisWorkbook.Sheets("mySheet") 'don't analyze autofilter if it's not on If Not sht.AutoFilterMode Then populateSheet Exit Sub End If 'put autofilter settings in arrays for criteria1, criteria2, and operator With sht.AutoFilter rangeAddr = .Range.Address fieldCount = .Filters.Count ReDim columnCriteria1(1 To fieldCount) ReDim columnCriteria2(1 To fieldCount) ReDim columnOperators(1 To fieldCount) For ctr = 1 To fieldCount With .Filters(ctr) If .On Then columnCriteria1(ctr) = .Criteria1 columnOperators(ctr) = .Operator If (.Operator = xlOr) or (.Operator=xlAnd) Then columnCriteria2(ctr) = .Criteria2 Else columnCriteria2(ctr) = Null End If Else columnCriteria1(ctr) = Null End If End With Next ctr End With 'clear autofilter sht.AutoFilterMode = False populateSheet 're-apply autofilter settings With sht.Range(rangeAddr) For ctr = 1 To fieldCount If Not IsNull(columnCriteria1(ctr)) Then If IsNull(columnCriteria2(ctr)) Then .AutoFilter Field:=ctr, Criteria1:=columnCriteria1(ctr), Operator:=xlFilterValues Else .AutoFilter Field:=ctr, Criteria1:=columnCriteria1(ctr), Criteria2:=columnCriteria2(ctr), Operator:=columnOperators(ctr) End If End If Next End With End Sub
我不确定这是否能解决问题,因为我受到了Jean-FrançoisCorbett的代码的启发。 我不得不自己弄清楚如何捕获和重新应用Autofilter设置。 随意就这个人谁应该得到信贷钟声; 否则,我会接受我自己的答案。