简体   繁体   中英

Excel VBA filter reset works in Immediate window but not in Sub BeforeClose

I've written the following code to reset any validation and/or autofiltering before my workbook closes:

Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error Resume Next
    Worksheets("Query").Cells.SpecialCells(xlCellTypeAllValidation).Clear

    On Error Resume Next
    Worksheets("Table").Cells.SpecialCells(xlCellTypeAllValidation).Clear

    On Error Resume Next
    Worksheets("Table").ShowAllData

    On Error Resume Next
    Worksheets("Query").Activate

    ThisWorkbook.Save

End Sub

However, 'Worksheets("Table").ShowAllData' only seems to work in the immediate window. When I close the program after filtering the table on sheet "Table" and open it up again, I get

We found a problem with some content in "Book1.xlsm". Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.

This didn't happen at first and it seems to have no cause. Why does the filter reset work in the immediate window, but not in my subroutine? How can I fix it?

never use On Error Resume Next or you will never learn anything

you need to check to see if Autofilter is on first because it's a toggle...

  If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
  End If

or

  If ActiveSheet.FilterMode Then
    ActiveSheet.AutoFilterMode = False
  End If

No need to have so many OERN On Error Resume Next . Just one will do.

I tried this

Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Worksheets("Query").Cells.SpecialCells(xlCellTypeAllValidation).Clear
    Worksheets("Table").Cells.SpecialCells(xlCellTypeAllValidation).Clear
    On Error GoTo 0

    If Worksheets("Table").FilterMode Then Worksheets("Table").ShowAllData

    Worksheets("Query").Activate

    ThisWorkbook.Save
    DoEvents
End Sub

and I did not get any errors. Try it.

We found a problem with some content in "Book1.xlsm". Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.

If you still get an error then it is not because of this piece of code. You need to see the report as to what was repaired. I have a feeling one of your DataValidation list is causing this problem. Like I said, check the repair report. If the report says that the Datavalidation was repaired then you need to check that.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM