オートフィルターが既にオンになっていると、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
どうもありがとう
AutoFilterModeは、特定の列に実際にフィルターが適用されているかどうかに関係なく、有効になっている場合はTrueになります。これが起こるとき、 ActiveSheet.ShowAllData
は引き続き実行され、エラーがスローされます(実際のフィルタリングがないため)。
私は同じ問題を抱えていて、それを使って働いた
If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
End If
これは、実際のフィルターが適用されていないがAutoFilterModeがオンになっている場合、ShowAllDataの実行を妨げるようです。
2番目のキャッチOr ActiveSheet.FilterMode
は高度なフィルターをキャッチする必要があります
これを回避する簡単な方法は、ワークシートメソッドShowAllDataを使用しないことです。
オートフィルターには、フィルターが有効になっているがフィルターが設定されていない場合にエラーをスローしない同じShowAllDataメソッドがあります
If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData
エラー 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
を完全に無効にします。
私はちょうど同じ問題を経験しました。試行錯誤を繰り返した結果、選択範囲がフィルター領域の右側にあり、表示されたレコードの数がゼロの場合、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にありました
これは動作します。これを定義し、必要なときに呼び出します。 (クリアボタンを作成する場合、ボタンロジックに適しています):
Sub ResetFilters()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
私も同じ問題です。その理由は、
1)アクティブセルがテーブル内にある場合、「ActiveSheet.ShowAllData」が機能します。 2)テーブル内にないアクティブセルの場合、「ActiveSheet.ShowAllData」は機能しません。このコードを使用すると、ActiveSheet.ListObjects( "Srv")。Range.AutoFilter Field:= 1はフィルターをクリアできます。