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