★ExcelVBA ~ フィルターをかけたままで保存できないようにする方法
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
エクセルでフィルターをかけたままで保存できないようにする設定ありますか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14328977679?post=2
★はじめに
ChatGPTに聞きましたら、直接の設定はないようで、アドインファイル(xlam。VBA入り)を作って登録しておくと、閉じるときに開いているすべてのファイルの全てのフィルタを解除してくれるみたいです。
こちらでも試してみたら、そういう動作になりました。
アドイン設定をすれば、すべてのxlsx拡張子にもxlsm拡張子にも適用されます。
ただ、マクロが有効でないといけないし、変な挙動をしてファイルを壊す可能性もゼロではないです。
また、上書き保存する度にフィルタ解除されてしまうサンプルなので、最後の閉じるときだけ、ということなら、作り替えが必要です。
(作り替えで正常動作するかは私は未確認です。すみません。)
また、パソコン1台につき、それぞれにアドイン設定が必要になってしまいます。
コードがサンプルレベルなので、変な挙動をしてファイルを壊す可能性もゼロではないのが怖いは怖いです。
VBAのプロに頼むのが良いとは思います。
●xlamファイルの作成方法
普通にxlsxとして開き、Alt+F11でVBEを開き、
「CAppEvents」という名前のクラスモジュールを挿入し、そこに以下のコードをコピペ。(Option Explicitがすでに書いてあったらそれは除外します)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
' ' Option Explicit Public WithEvents App As Application Private Sub App_WorkbookBeforeClose( _ ByVal Wb As Workbook, _ Cancel As Boolean) Dim ws As Worksheet Dim FilterRemoved As Boolean Dim lo As ListObject For Each ws In Wb.Worksheets On Error Resume Next '通常のフィルタの解除 If ws.FilterMode Then ws.ShowAllData If Err.Number = 0 Then FilterRemoved = True End If End If ' ' Err.Clear On Error GoTo 0 'テーブルのフィルターの解除 For Each lo In ws.ListObjects On Error Resume Next If lo.AutoFilter.FilterMode Then lo.AutoFilter.ShowAllData If Err.Number = 0 Then FilterRemoved = True End If End If On Error GoTo 0 Next lo Next ws ' ' If FilterRemoved Then MsgBox _ "保存前にフィルターを自動解除しました。", _ vbInformation, _ "フィルター解除" End If End Sub ' ' |
次に、標準モジュールを挿入して以下のコードをコピペ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
' ' Option Explicit Public gAppEvents As CAppEvents Sub Auto_Open() Set gAppEvents = New CAppEvents Set gAppEvents.App = Application End Sub ' ' |
あと、「ThisWorkbook」にも以下のコードをコピペ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
' ' Option Explicit Private Sub Workbook_Open() Set gAppEvents = New CAppEvents Set gAppEvents.App = Application End Sub ' ' |
その状態のまま、名前を付けて保存にて、xlam形式で保存します。
保存先は自動的にアドインファイル専用の場所にExcelが決めてくれます。
名前はとりあえず「Test01.xlam」で。
●アドインの登録
で、いったんExcelを閉じて、再度開き、アドインをExcelへ登録します。
開発タブにて、
→「Excelアドイン」
→「Test01」にチェックを入れる。
→OK。
以上で、xlsxでもxlsmでも、
フィルタがかかっているときで、
「×」ボタンで閉じるときや、
「保存や上書き保存をかけたとき」に、
自動ですべてのシートのフィルタが自動解除されて保存され、
「保存前にフィルターを自動解除しました。」と出て、
OKするとそのまま閉じれます。
1シートに複数のテーブルがあるときはちょっとわかりませんけど。
上記はサンプルなので、本当にアドインでやりたいなら、プロの方にちゃんとつくってもらってください。
保存したい入力データがちゃんと保存されつつ、フィルタだけ解除されるかどうかのチェックとか。
ただ、「そもそもVBA禁止」なら、ダメですね。
この方法はあきらめるしかないです。
また、「上書き保存のときはフィルタ解除されないでほしい」という場合もこのサンプルではダメです。
|
1 2 3 4 5 |
' ' ' ' |
- 投稿タグ
- ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, パソコンでの自動化, マクロ, 独学, 自動化