Excel VBA – 工作表类的ShowAllData方法失败

我已经自动将正确的logginginput到我用作数据库的表中,并且在过滤表时,input不起作用。

所以我有这样的代码,在每个logginginput之前不要过滤数据库。

Public Sub UnFilter_DB() Dim ActiveS As String, CurrScreenUpdate As Boolean CurrScreenUpdate = Application.ScreenUpdating Application.ScreenUpdating = False ActiveS = ActiveSheet.Name Sheets("DB").Activate Sheets("DB").Range("A1").Activate Sheets("DB").ShowAllData DoEvents Sheets(ActiveS).Activate Application.ScreenUpdating = CurrScreenUpdate End Sub 

但现在,它仍然停留在Sheets("DB").ShowAllData说:

工作表类的ShowAllData方法失败

因为桌子已经过滤了

而且我不知道是否最好使用On Error Resume Next一样的error handling程序,或者如何检测是否有filter或没有filter

任何指针将受到欢迎!

如果您使用Worksheet.AutoFilter.ShowAllData而不是Worksheet.ShowAllData它不会抛出错误,当没有被过滤。

这假设Worksheet.AutoFilterMode = True ,否则你会得到一个有关AutoFilter不是一个对象的错误。

 Public Sub UnFilter_DB() Dim ActiveS As String, CurrScreenUpdate As Boolean CurrScreenUpdate = Application.ScreenUpdating Application.ScreenUpdating = False ActiveS = ActiveSheet.Name Sheets("DB").Activate Sheets("DB").Range("A1").Activate Sheets("DB").AutoFilter.ShowAllData DoEvents Sheets(ActiveS).Activate Application.ScreenUpdating = CurrScreenUpdate End Sub 

以下是我的工作解决scheme

 Public Sub UnFilter_DB() Dim ActiveS As String, CurrScreenUpdate As Boolean CurrScreenUpdate = Application.ScreenUpdating Application.ScreenUpdating = False ActiveS = ActiveSheet.Name Sheets("DB").Activate Sheets("DB").Range("A1").Activate On Error Resume Next If Sheets("DB").FilterMode = True Then Sheets("DB").ShowAllData On Error GoTo 0 DoEvents Sheets(ActiveS).Activate Application.ScreenUpdating = CurrScreenUpdate End Sub 

而且我写的一个更有效的版本可以轻松地使用命名范围:

如何使用它 :

 Private Sub TEST_UnFilter_Table() Dim tB As Workbook, _ Sh As Worksheet Set tB = ThisWorkbook Set Sh = tB.Sheets("DB") Call UnFilter_Table(Sh, "Db_Val") End Sub 

适当的function与优化(如果你有大表):

 Public Function UnFilter_Table(ByRef SheetWithTable As Worksheet, ByVal RangeName As String) As Boolean On Error GoTo ErrHdlr Dim aWB As Workbook, _ ActiveSH As Worksheet, _ ScreenUpdateState As Boolean, _ StatusBarState As Boolean, _ CalcState As XlCalculation, _ EventsState As Boolean, _ DisplayPageBreakState As Boolean Set aWB = ActiveWorkbook Set ActiveSH = aWB.ActiveSheet DisplayPageBreakState = ActiveSH.DisplayPageBreaks ActiveSH.DisplayPageBreaks = False With Application ScreenUpdateState = .ScreenUpdating StatusBarState = .DisplayStatusBar CalcState = .Calculation EventsState = .EnableEvents .ScreenUpdating = False .DisplayStatusBar = False .Calculation = xlCalculationManual .EnableEvents = False End With SheetWithTable.Activate SheetWithTable.Range(RangeName).Cells(1, 1).Activate On Error GoTo 0 On Error Resume Next If SheetWithTable.FilterMode Then SheetWithTable.ShowAllData On Error GoTo 0 On Error GoTo ErrHdlr DoEvents ActiveSH.Activate ActiveSH.DisplayPageBreaks = DisplayPageBreakState With Application .ScreenUpdating = ScreenUpdateState .DisplayStatusBar = StatusBarState .Calculation = CalcState .EnableEvents = EventsState End With UnFilter_Table = True On Error GoTo 0 Exit Function ErrHdlr: UnFilter_Table = False Debug.Print "Error in unfiltering sheet " & SheetWithTable.Name & " !" & vbCrLf & _ "Error n° " & Err.Number & vbCrLf & _ Err.Description End Function 
 With ActiveSheet If .AutoFilterMode = False Then .Cells(1, 1).AutoFilter For Each f In .AutoFilter.Filters If f.On Then .ShowAllData: Exit For Next