• ベストアンサー

エクセルのオートフィルタで複数の列にフィルタをかけ

エクセルのオートフィルタで複数の列にフィルタをかけて内容をチェックして解除してまた別の列にフィルタをかけてチェックして…を繰り返す作業をしています。 複数のフィルタを解除する際に全解除をしたいのですが あるひとつのフィルタだけはかけたままにしておきたいのです。 となると、ひとつずつ手作業で解除することになるのですが 解除し忘れてしまうことがしばしば起こります。 解除したくない列のみを残して、それ以外のフィルタを簡単に解除する方法はありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

データ内のどこかの列にフィルターをかけて、その状態を保持したいと理解しました。 どのようなフィルターか分からないのと、何種類のフィルターが必要なのか分からないので、そのあたりをカバーできる方法を考えてみました。 マクロを使いますが、大丈夫でしょうか?まず、開発タブを表示します。(方法が分からなければ調べてください) 添付図のような状態で考えます。データの左上はセルA3です。 データ内をクリックして、開発タブ>マクロの記録でマクロ名が「Macro1」になると思うので、「Ok」 保持したいフィルターを実行します。例えば、添付図でA列の「A001」と「A0010」を指定します。 指定が終わったら、開発タブ>記録終了 これで、開発タブ>Visual Basic で、VBE画面で、標準モジュール>Module1 をクリックすると、以下のマクロが記録されているはずです。 ここで、誤操作を防ぐために、1行追加します。 記録したマクロ******************************** Sub Macro1() ' ' Macro1 Macro '   Selection.AutoFilter   ActiveSheet.Range("$A$3:$G$22").AutoFilter Field:=1, Criteria1:="=A0001", _     Operator:=xlOr, Criteria2:="=A0010" End Sub Selection.AutoFilter の前に、Range("A3").select を挿入します。 修正後**************************************** Sub Macro1() ' ' Macro1 Macro   Range("A3").select   Selection.AutoFilter   ActiveSheet.Range("$A$3:$G$22").AutoFilter Field:=1, Criteria1:="=A0001", _     Operator:=xlOr, Criteria2:="=A0010" End Sub 基本的にはこれで終了です。 前のフィルター処理を残して、再度フィルター処理を行いたいときには、開発タブ>マクロ>Macro1 とします。 しかしこれも結構面倒なので、添付図のようにボタンを配置し、ボタンをダブルクリックして、 Private Sub CommandButton1_Click()  Call Macro1 End Sub とかすれば、ボタンをクリックすることで簡単に実行します。(デザインモードから抜けます) さらに、残したいフィルターが沢山あれば、同じ様にMacro1、Macro2、Macro3・・・とたくさん作り、 Private Sub CommandButton1_Click()  Select Case Range("D1")   Case 1: Call Macro1   Case 2: Call Macro2   Case 3: Call Macro3  End Select End Sub とすれば、セルD1の値でマクロを切り替えることができます。 さらに、1、2、3・・・は分かりにくいので、選択内容を入力規則から選択し、それをマクロ名にすれば、分かりやすさと正確性が上がるでしょう。 マクロを使った回答ですが、極力分かりやすく説明したつもりです。

finafina
質問者

補足

回答ありがとうございます。 マクロを組む!なるほど!と思い、とても参考になりました。 実際に教えて頂いた手順通りでなんとかなりそうです。 ただ、ファイルが月毎に変わるので、その都度マクロを組むというのは 少し面倒な気がしてしまいます。。。 そのあたりをカバーできる方法はないでしょうか?

その他の回答 (4)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

>ただ、ファイルが月毎に変わるので、その都度マクロを組むというのは >少し面倒な気がしてしまいます。。。 >そのあたりをカバーできる方法はないでしょうか? ファイルとはExcel Bookでしょうか。 でき上ったマクロ(標準モジュール)をエキスポートし、新しいBookで必要になったらインポートすればいいでしょう。秒単位の所要時間です。小細工をすると、ほかのBookの処理に影響する場合があります。 または、マクロをインポートしたBookをテンプレートにする方法もあるでしょう。

finafina
質問者

お礼

教えて頂いた通り、インポート→エクスポートでなんとかなりそうです。 小細工するとほかのBOOKに影響する場合があるというのは少し不安ですが ひとまずこれでやっていこうと思います。 度々ご回答いただきありがとうございました。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.4

#3です。 画像をポスト漏れしたので添付します。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

>ただ、ファイルが月毎に変わるので、 >その都度マクロを組むというのは... >そのあたりをカバーできる方法はないでしょうか? 若干ハードルが上がりますが、アドインを使う方法があります。 また、今回は、課題作業を実行するメニューを コンテキストメニュー(セルを右クリックしたときのメニュー)に 追加する方法を提案します。よかったら挑戦してみてください。 手順1 アドインについての理解が必要です。 https://excel-ubara.com/excelvba4/EXCEL297.html を一読してください。 手順2 コンテキストメニューの設定解除の理解が必要です。 http://officetanaka.net/excel/vba/tips/tips30.htm を一読してください。 手順3 添付のソースコードを仕込んだブックをアドインとして保存し エクセルを閉じます。 手順4 新規ブックを開き、手順3のファイルをエクセルアドインとして有効に。 VBEの画面で、アドインの中のPublic Sub AddMenu を実行 エクセルを閉じます。 以下、フィルターのリセットが必要なブックを開き メニューから「フィルターリセット」を選択します。 なお提示したマクロは、 Activeなセルを含む列以外のフィルターの設定をリセットする仕様です。 もし、リセットしない列が固定なら、 コメントアウトしている後半のコードを使ってください。 Option Explicit Public Sub AddMenu()  Dim Newb  Set Newb = Application.CommandBars("Cell").Controls.Add()  With Newb   .Caption = "フィルターリセット"   .OnAction = "FilterReset"   .BeginGroup = False  End With End Sub Public Sub DelMenu()  Application.CommandBars("Cell").Controls("フィルターリセット").Delete End Sub '//Activeセル以外の列をリセット Public Sub FilterReset()  Dim ColCnt As Long 'フィルターの列数  Dim ColNum As Long 'Activeセルの列番号  Dim ColCounter As Long  Dim wkCnt As Long    If ActiveSheet.AutoFilterMode = False Then   MsgBox ("フィルター未設定")   Exit Sub  End If  ColCnt = ActiveSheet.AutoFilter.Range.Columns.Count  ColNum = ActiveCell.Column  With ActiveSheet.Range("$A:$A")   For wkCnt = 1 To ColCnt    If ColNum <> wkCnt Then     .AutoFilter Field:=wkCnt    End If   Next wkCnt  End With End Sub ''//指定列以外の列をリセット 'Public Sub FilterReset() ' ' Const ColNum = 2 'リセットしない列番号 ' Dim ColCnt As Long 'フィルターの列数 ' Dim ColCounter As Long ' Dim wkCnt As Long ' ' If ActiveSheet.AutoFilterMode = False Then '  MsgBox ("フィルター未設定") '  Exit Sub ' End If ' ' ColCnt = ActiveSheet.AutoFilter.Range.Columns.Count ' With ActiveSheet.Range("$A:$A") '  For wkCnt = 1 To ColCnt '   If ColNum <> wkCnt Then '    .AutoFilter Field:=wkCnt '   End If '  Next wkCnt ' End With 'End Sub '

finafina
質問者

お礼

回答いただきありがとうございます。 とても詳しく教えて頂きましたが 残念ながら勉強不足で、理解するまでにしばらく時間がかかりそうです(苦笑) しかし、右クリックをした時のメニューで追加できるというのはとても興味があるので 時間があるときにじっくり勉強してみたいと思いました。 どうもありがとうございました。

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

一度全部解除して、残しておきたいフィルタだけを再度かけるとした方が早いと思うのですが、それではダメなのでしょうか?

finafina
質問者

お礼

回答いただきありがとうございます。 確かにそうするのが一番手っ取り早いかなとも思ったりしています。 ただ、フィルタをかけるとき、20項目ぐらいあるうちから5つ選択するので 一回一回それをするのも煩わしいなぁと感じて質問させていただきました。 でもどうしても思いつかない場合はそうしようと思います。 ありがとうございました。

関連するQ&A