web-dev-qa-db-ja.com

WorksheetクラスのShowAllDataメソッドが失敗しました

オートフィルターが既にオンになっていると、VBAスクリプトが機能しません。なぜこれが理由なのでしょうか?

    wbk.Activate
    Set Criteria = Sheets("Sheet1").Cells(i, 1)

    Set rng = Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 4))

    wb.Activate
    If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData 'remove autofilter, but it crashes on this line

    Selection.AutoFilter

    Range("$A$1:$BM$204").AutoFilter Field:=2, Criteria1:=Criteria.Value

    rng.Copy

    Range("$BC$2:$BE$204").SpecialCells(xlCellTypeVisible).PasteSpecial

どうもありがとう

29

AutoFilterModeは、特定の列に実際にフィルターが適用されているかどうかに関係なく、有効になっている場合はTrueになります。これが起こるとき、 ActiveSheet.ShowAllDataは引き続き実行され、エラーがスローされます(実際のフィルタリングがないため)。

私は同じ問題を抱えていて、それを使って働いた

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
  ActiveSheet.ShowAllData
End If

これは、実際のフィルターが適用されていないがAutoFilterModeがオンになっている場合、ShowAllDataの実行を妨げるようです。

2番目のキャッチOr ActiveSheet.FilterModeは高度なフィルターをキャッチする必要があります

40
Aaron

これを回避する簡単な方法は、ワークシートメソッドShowAllDataを使用しないことです。

オートフィルターには、フィルターが有効になっているがフィルターが設定されていない場合にエラーをスローしない同じShowAllDataメソッドがあります

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

19
Steven Martin

エラー ShowAllData method of Worksheet class failed通常、適用されたフィルターがない場合に、適用されたフィルターを削除しようとすると発生します。

AutoFilter全体を削除しようとしているか、適用されたフィルターを削除しようとしているかはわかりませんが、それぞれに異なるアプローチがあります。

適用されたフィルターを削除し、AutoFilterをオンのままにするには:

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

上記のコードの背後にある理論的根拠は、AutoFilterがあること、またはフィルターが適用されているかどうかをテストすることです(これにより、高度なフィルターも削除されます)。

AutoFilterを完全に削除するには:

ActiveSheet.AutoFilterMode = False

上記の場合、単にAutoFilterを完全に無効にします。

11
Martin

私はちょうど同じ問題を経験しました。試行錯誤を繰り返した結果、選択範囲がフィルター領域の右側にあり、表示されたレコードの数がゼロの場合、ShowAllDataは失敗します

おそらくもう少しコンテキストが関連しています。複数のシートがあり、それぞれにフィルターが付いています。すべてのシートにいくつかの標準フィルターを設定したいので、このようなVBAを使用します

Sheets("Server").Select
col = Range("1:1").Find("In Selected SLA").Column
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE"

このコードは「In Selected SLA」という見出しの列のフィルターを調整し、他のすべてのフィルターは変更しないままにします。これには、残念ながら、ゼロレコードを表示するフィルターを作成できるという副作用があります。 UIのみを使用してこれを行うことはできません。

この状況を回避するために、上記のフィルタリングを適用する前にすべてのフィルターをリセットしたいと思います。リセットコードは次のようになりました

Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

選択したセルを移動しなかったことに注意してください。選択範囲が右の場合、フィルターは削除されないため、フィルターコードでゼロ行フィルターを作成できます。コードが2回実行される(ゼロ行フィルターで)ShowAllDataは失敗します。

回避策は簡単です:ShowAllDataを呼び出す前にフィルター列内で選択を移動します

Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData

これは、Excelバージョン14.0.7128.5000(32ビット)= Office 2010にありました

3
Peer Sommerlund

これは動作します。これを定義し、必要なときに呼び出します。 (クリアボタンを作成する場合、ボタンロジックに適しています):

Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub
1
BobbyA

私も同じ問題です。その理由は、

1)アクティブセルがテーブル内にある場合、「ActiveSheet.ShowAllData」が機能します。 2)テーブル内にないアクティブセルの場合、「ActiveSheet.ShowAllData」は機能しません。このコードを使用すると、ActiveSheet.ListObjects( "Srv")。Range.AutoFilter Field:= 1はフィルターをクリアできます。

0
Lee Li Fong