
VBAが書かれているファイルと同階層にある、全てのエクセルファイルの全てのシートのオートフィルタを解除したいです。
初心者のため、手始めに「ファイル内の全てのシートのオートフィルタを解除(すべて表示)する」というコードを考えているのですが、
Sub すべて表示()
Dim W As Worksheet
For Each W In Worksheets
ActiveSheet.ShowAllData
Next W
End Sub
とすると、
実行時エラー1004
WorksheetクラスのShowAllDataメソッドが失敗しました
となってしまいます。
何がいけないのでしょうか?
No.6ベストアンサー
- 回答日時:
merlionXXです。
これでどうでしょう?
Sub TEST01()
Dim mb As Workbook
Dim myfdr As String, fname As String
Dim w As Worksheet
Dim n As Long
Application.ScreenUpdating = False '画面更新停止
Set mb = ThisWorkbook 'このマクロがあるブックをmbとする。
myfdr = ThisWorkbook.Path 'このブックのパス取得
fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索
Do Until fname = Empty '全て検索
If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ
Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。
For Each w In wb.Worksheets 'wb各シートに
If w.FilterMode Then 'フィルターモードだったら
w.ShowAllData 'オートフィルタをすべて表示
End If
Next w
Application.DisplayAlerts = False '警告停止
wb.Save '保存
wb.Close '閉じる
Application.DisplayAlerts = True '警告停止解除
n = n + 1 'ブック数をカウント
End If
fname = Dir 'フォルダ内の次のExcelブックを検索
Loop '繰り返す
Application.ScreenUpdating = True '画面更新停止解除
MsgBox n & "件のブックを ShowAllData しましました。"
End Sub
ありがとうございます!希望通りの処理が行なわれました!
14、16、19行目を書き換えられたのですね。
ここを書き換えたらなぜうまくいったのでしょう?
後学のため、もし簡単にご回答頂けるようでしたらお願いできますでしょうか。
(もし面倒な説明になってしまうのでしたら結構ですので)
No.7
- 回答日時:
merlionXXです。
> ここを書き換えたらなぜうまくいったのでしょう?
> If w.FilterMode Then 'フィルターモードだったら
> w.ShowAllData 'オートフィルタをすべて表示
> End If
ここは、wendy02さんの、「エラーの種類がはっきりしている時はに、On Error トラップは必要ありません」に応えたもので、今回のとは直接関係ありません。
> wb.Save '保存
問題はここでした。
初歩的なミスです。最初(No4)の回答の
SaveAs Filename:=
だと、「名前をつけて保存」なのですが、ファイル名だけでパス(保存先)を指定しなかったのでどこか別のフォルダーに保存されたものと思います。(ファイルの名前でPC内を検索してみてください。)
そのためオリジナルのファイルは前のままなんだと思います。
「上書き保存」なら単にSaveだけで良かったんです。ごめんなさい。
(o。_。)oペコッ
なるほど、納得です。
どう見てもちゃんと保存している風なのに、更新されていないのはなぜ?と思ったのですがそういうことでしたか。
別名保存されたファイルですが、ありましたありました。
マイドキュメントにありました。
ごめんなさいなんてとんでもない。
本当に助かりました。
感謝いたします。
No.5
- 回答日時:
こんにちは。
>手始めに「ファイル内の全てのシートのオートフィルタを解除(すべて表示)する」
質問内容では、どちらかはっきりしません。
Sub すべて表示1()
'オートフィルタを解除
Dim wh As Worksheet
For Each wh In Worksheets
If Not wh.AutoFilter Is Nothing Then
wh.AutoFilterMode = False
End If
Next wh
End Sub
Sub すべて表示2()
'すべてを表示
Dim wh As Worksheet
For Each wh In Worksheets
If wh.FilterMode Then
wh.ShowAllData
End If
Next wh
End Sub
なお、暗黙のルールですが、通常、ループなどの変数は小文字にします。エラーの種類がはっきりしている時はに、On Error トラップは必要ありませんね。
わかりづらい質問文で申し訳ありません。
非表示のデータを全件表示させ、オートフィルタの設定自体は解除しないというのが希望の処理です。
お蔭様で、半分は無事解決しました。
ありがとうございました。
No.4
- 回答日時:
No1のmerlionXXです。
ご希望は「VBAが書かれているファイルと同階層にある、全てのエクセルファイルの全てのシートのオートフィルタを解除」なんでしたね。
では、こんなコードではいかがでしょう?
Sub TEST01()
Dim mb As Workbook
Dim myfdr As String, fname As String
Dim W As Worksheet
Dim n As Long
Application.ScreenUpdating = False '画面更新停止
Set mb = ThisWorkbook 'このマクロがあるブックをmbとする。
myfdr = ThisWorkbook.Path 'このブックのパス取得
fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索
Do Until fname = Empty '全て検索
If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ
Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。
For Each W In wb.Worksheets 'wb各シートに
On Error Resume Next
W.ShowAllData 'オートフィルタをすべて表示
On Error GoTo 0
Next W
Application.DisplayAlerts = False '警告停止
wb.SaveAs Filename:=fname '保存
wb.Close '閉じる
Application.DisplayAlerts = True '警告停止解除
n = n + 1 'ブック数をカウント
End If
fname = Dir 'フォルダ内の次のExcelブックを検索
Loop '繰り返す
Application.ScreenUpdating = True '画面更新停止解除
MsgBox n & "件のブックを ShowAllData しましました。"
End Sub
もし、「解除」の意味が、ShowAllDataではなく、フィルタ自体をやめにしたいのでしたら、
Sub TEST02()
Dim mb As Workbook
Dim myfdr As String, fname As String
Dim W As Worksheet
Dim n As Long
Application.ScreenUpdating = False '画面更新停止
Set mb = ThisWorkbook 'このマクロがあるブックをmbとする。
myfdr = ThisWorkbook.Path 'このブックのパス取得
fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索
Do Until fname = Empty '全て検索
If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ
Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。
For Each W In wb.Worksheets 'wb各シートに
On Error Resume Next
W.AutoFilterMode = False 'オートフィルタをやめる
On Error GoTo 0
Next W
Application.DisplayAlerts = False '警告停止
wb.SaveAs Filename:=fname '保存
wb.Close '閉じる
Application.DisplayAlerts = True '警告停止解除
n = n + 1 'ブック数をカウント
End If
fname = Dir 'フォルダ内の次のExcelブックを検索
Loop '繰り返す
Application.ScreenUpdating = True '画面更新停止解除
MsgBox n & "件のブックのオートフィルターをなくしました。"
End Sub
ご回答ありがとうございます。
次の段階に進もうと思ったら、もう既に次のアドバイスが…
希望の処理はオートフィルタ自体はそのままにして、データ行のみ全てを表示させるというものです。
早速試してみましたが、すべて表示されたはずのファイルを開いてみると、なぜかフィルタがかかったままです。
ステップインで段階的に進めながら確認もしてみて、そちらでは確かにすべて表示の処理が行なわれているようなのに、すべての処理が終了した後ファイルを開くと、非表示の行があります。
ファイルの保存もするようになっていますし…お心当たりはございますか?
No.3
- 回答日時:
私のコードの書き方が、まるっきり間違っているものだとばかり思っていましたので、この結果は予想外でした。
ご回答ありがとうございました。
No.2
- 回答日時:
提示されたコードでは、同一ブック内の全ワークシートが操作対象です。
If文でAutoFilterModeを判定し処理をするようにしてみました。
Sub tes1()
Dim W As Worksheet
For Each W In Worksheets
If W.AutoFilterMode = True Then
On Error Resume Next
W.ShowAllData
On Error GoTo 0
End If
Next W
End Sub
ご回答ありがとうございます。無事解決しました。
あとはこのコードの外側に、同一フォルダ内のファイルを順次処理せよというコードを書けばいいと思うのですが、もし下記の解決法をご存知でしたら教えて頂けないでしょうか。
*繰り返し処理はFileSearchを使おうかと思ったのですが、これは2007では使えないんですよね。
Excel2003と2007で使いたいので、どうしたものかと思っています。
ヒントだけでもご教示頂けますと助かります。
No.1
- 回答日時:
WがActiveにされていません。
ShowAllDataは、フィルターがかかっていない状態で作用させるとエラーになるのでエラー処理が必要です。
Sub すべて表示()
Dim W As Worksheet
For Each W In Worksheets
W.Activate
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
Next W
End Sub
ご回答ありがとうございます。無事解決しました。
あとはこのコードの外側に、同一フォルダ内のファイルを順次処理せよというコードを書けばいいと思うのですが、もし下記の解決法をご存知でしたら教えて頂けないでしょうか。
*繰り返し処理はFileSearchを使おうかと思ったのですが、これは2007では使えないんですよね。
Excel2003と2007で使いたいので、どうしたものかと思っています。
ヒントだけでもご教示頂けますと助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Excel(エクセル) vbaで列幅について 1 2022/11/15 08:31
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】アクティブセルの時...
-
VBAでブックを非表示で開いて処...
-
エクセルの関数 ENTERを押...
-
エクセルを共有するとPCによっ...
-
Excelファイルをダブルクリック...
-
Excelの新しい空白のブックを開...
-
Excelの警告について
-
エクセルファイルをオープンし...
-
エクセルにおける,「ブック」...
-
Excelでブックの共有を掛けると...
-
Excel(2010)のフィルターが保...
-
別ブックから入力規則でリスト...
-
Excelで複数ブックの同一セルに...
-
エクセルで別ブックをバックグ...
-
Excel起動時に特定のワークシー...
-
VBA: ブックをアクティベイトで...
-
「ブックの共有」を有効にして...
-
エクセルで参照しているデータ...
-
複数ファイルから特定シートの...
-
Excelで拡張子の後に数字が……何...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでブックを非表示で開いて処...
-
エクセルを共有するとPCによっ...
-
エクセルの関数 ENTERを押...
-
Excelの警告について
-
Excelファイルをダブルクリック...
-
エクセルで参照しているデータ...
-
WorkBooksをオープンさせずにシ...
-
Excelでブックの共有を掛けると...
-
Excel(2010)のフィルターが保...
-
Excelで複数ブックの同一セルに...
-
エクセルファイルを開かずにpdf...
-
エクセルにおける,「ブック」...
-
同じフォルダへのハイパーリン...
-
エクセルで別ブックをバックグ...
-
フォルダ内の複数ファイルから...
-
VBA バックグラウンドで別ブッ...
-
エクセルでウィンドウの枠固定...
-
ブックのピボットを別ブックに...
-
フォルダ内の複数ファイルから...
-
エクセルで50行ごとに区切った...
おすすめ情報