VBA在合并文件之前清除filter

我正在通过VBA开发一个电子表格自动化过程,并且迄今为止已经取得了成功,但是我还是陷入了一个单一的元素,即在复制之前清除filter。 这个代码位于一个主文件的模块中,它的function是打开一个文件夹中的每个工作簿(每个文件都有一个表),将所有数据从A2复制到AJ(但是有很多行),粘贴到masterfile,然后closures文件并移动到文件夹中的下一个文件夹,直到所有文件都被合并到主文件中,一个数据块直接在前一个文件的下面。 它完美的作品。 问题是,在某些情况下,这些文件可能已经过滤了列,并且过滤掉的所有内容都不会被复制。 这些文件是从另一个部门发送的。 我做了search,并find了不同的方法来清除filter,我甚至尝试了一个自己的代码,但我不能让他们工作在我的代码由于某种原因,也许我把他们在一个错误的地方或什么? 另外,有什么我应该改变清理/优化代码?

感谢您的时间和关注!

Option Explicit Sub ExcelMerge() Dim wbkReports As Workbook Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set mergeObj = CreateObject("Scripting.FileSystemObject") Set dirObj = mergeObj.Getfolder("C:\Users\Report") Set filesObj = dirObj.Files For Each everyObj In filesObj Set wbkReports = Workbooks.Open(everyObj) Range("A2:AJ" & Range("A65536").End(xlUp).Row).Copy ThisWorkbook.Worksheets(1).Activate Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) Application.CutCopyMode = False wbkReports.Close Next AddFormulas Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub Sub AddFormulas() Dim lastRow As Long, i As Long Dim ws As Worksheet Set ws = Sheets("Report") lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row With ws For i = 10 To lastRow If Len(Trim(.Range("A" & i).Value)) <> 0 Then _ .Range("AK" & i).FormulaR1C1 = "formula here" .Range("AL" & i).FormulaR1C1 = "formula here" .Range("AM" & i).FormulaR1C1 = "formula here" Next i End With End Sub 

看看这个。 你也应该定义你正在使用哪个表格,而不是从Range("A2:AJ...复制,因为这可能会导致从错误的表格复制数据时出错。另外,如果在closures时添加SaveChanges:=False工作簿下来,你会阻止未经过滤的范围永久

 Sub ExcelMerge() Dim wbkReports As Workbook Dim ws As Worksheet Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set mergeObj = CreateObject("Scripting.FileSystemObject") Set dirObj = mergeObj.Getfolder("C:\Users\Report") Set filesObj = dirObj.Files For Each everyObj In filesObj Set wbkReports = Workbooks.Open(everyObj) For Each ws In wbkReports.Worksheets If ws.AutoFilterMode Then ws.AutoFilter.ShowAllData Next ws Range("A2:AJ" & Range("A65536").End(xlUp).Row).Copy ThisWorkbook.Worksheets(1).Activate Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues) Application.CutCopyMode = False ' Include savechanges:=False to not save the unfiltering of sheets wbkReports.Close savechanges:=False Next AddFormulas Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub