【问题标题】:VBA Clear filters before merging filesVBA 在合并文件之前清除过滤器
【发布时间】:2017-08-25 18:38:58
【问题描述】:

我正在通过 VBA 进行电子表格自动化流程,到目前为止取得了成功,但我有点坚持其中的一个元素,即在复制之前清除过滤器。 此代码位于主文件的模块中,它的作用是打开文件夹中的每个工作簿(每个文件都有一个工作表),将所有数据从 A2 复制到 AJ(无论有多少行),将其粘贴到masterfile,然后关闭文件并移动到文件夹中的下一个,直到所有文件都合并到master中,在上一个的正下方有一个数据块。它完美地工作。问题在于,在某些情况下,这些文件可能具有过滤列,并且过滤掉的所有内容都不会被复制。这些文件是从另一个部门发送的。 我确实搜索了 SO 并找到了清除过滤器的不同方法,我什至尝试了一个单独工作的代码,但由于某种原因我无法让它们在我的代码上工作,也许我将它们放在错误的位置或某物?另外,我应该改变什么来清理/优化代码吗?

感谢您的时间和关注!

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

【问题讨论】:

  • 我没有查看您的代码,但尝试使用Worksheet.ShowAllData 删除过滤器
  • @Tom 那是我自己尝试过的一个,它可以工作,但我应该把它放在我的代码中的什么地方?这就是让我难倒的原因

标签: vba excel filtering


【解决方案1】:

看看这个。此外,您应该定义您正在使用的工作表,而不是仅仅从Range("A2:AJ... 复制,因为这可能会导致从错误的工作表复制数据时出错。此外,如果您在关闭工作簿时添加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

【讨论】:

  • 感谢有关保存更改的提示 :) 我没有添加工作表,因为我从中复制的工作簿总是只有一个工作表,但我可以添加它以防万一。无论如何,您的方法落在“对象'_Worksheet'的“运行时错误'1004'方法'ShowAllData'失败”上知道如何解决吗?谢谢!
  • 刚刚更新了它以测试自动筛选。现在再试一次
  • 感谢您的更新,但不幸的是,它仍然会出现同样的错误,当我点击调试时,它会突出显示“ws.ShowAllData”
  • 床单是否受到保护?
  • 你能再试一次吗。我认为这可能是由于没有过滤任何内容(这会引发ShowAllData 的错误。现在不应该
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2015-09-24
相关资源
最近更新 更多