次のExcelのテーブルがあります。
A列の文字に対して、フィルターをかけるようにするには、一番手っ取り早いのはスライサーを使えばいいのですが、スライサーが横並びにならないのでちょっと使いにくいなと思っているところもあります。
そこで2行目から3行目にあるそれぞれの四角形の図形に対してマクロを登録してフィルターをかけようと思ったのですが、フィルターのリセットも含めて8つのマクロを作るのも面倒なのでなんとか一つのマクロでできないかなと思っていたところ、そういえばこのまえVBA100本ノックのどなたかのツイートの中でボタンに登録する時に変数付きでマクロを登録できるということを言っていたような気がしたので色々調べてみたらうまくできたのでそれの方法を書きます。
マクロの記録
まずA列のフィルターで「A」のみのフィルターをかける動作をマクロの記録します。
その結果できあがったのが次のVBAです。自動的に追加されたコメントは抜いてあります。
テーブルに対して1列目がAのものをフィルターするという動作ですね。
マクロを改造
テーブルに対するフィルターの場合オートフィルターが設定されるのですが、AutoFilterまでを記述するとすべて表示になります。
私はいつもすべてを表示させた後に、実際のフィルターをかけるので、今記録されているオートフィルターを設定する1行をコピーして、もう1行作って、上の行のAutoFilterより後を削除します。
こうすることによって今設定されているフィルターを解除してから1列目のAのものを抽出するようになります。つまり1列目でしかフィルターがかからないようになります。
次にこのマクロに対して引数を設定します。Sub の()の間に引数となる文字を入力します。 「条件」という名前にしましょう。「条件」は「A」から「G」のアルファベットなので文字列型です。
そしてその引数を使ってフィルターをかけるので、Criteriaが「条件」になります。
全て表示させる時は、引数を「All」としたいと思っています。その仕組みを入れるとすれば、もしも「条件」が「All」でなければ、条件で抽出する、とすれば全てのデータを表示したところで終了となります。
マクロの登録
ではこれで VBA は出来上がったので一つ一つの図形に登録していきたいと思います。
まず、Aの図形には、「Macro7(“A”)」と入力すれば良いのではないかと思ってやってみました。
まずそもそも、マクロの登録の画面に、今回作成したはずの「Macro7」が表示されません。
調べてみるとマクロ名に引数を設定した時点で、表示タブのマクロの中のマクロの表示でも表示されなくなり、マクロの登録でも表示されなくなるということがわかりました。
勘でPublicにすれば表示するのかなと思ったのですが、マクロ名に引数が設定された時点でどんな場合であれもう表示されなくなるそうです。表示させなくする方法はたくさん情報があったのですが表示させる方法の情報がなかったのでおそらくできないんだと思います。
しかし表示されていないだけで存在はしていると思ったので、「Macro7(“A”)」と手入力してみました。結果次のようなエラーが出ました。
なんとなく、Functionではないので「( )」では出来ないのかもしれない、と思い、「Macro7 “A”」と入力してみたのですが、それでもできず、でも何か方法がないか「マクロの登録 引数」調べてみたところ、「いつも隣にITのお仕事」のタカハシさんの記事を発見し(https://tonari-it.com/excel-vba-button-augument/)、どうやらマクロ名を引数ごとシングルクオーテーションで囲めばいいということがわかり実際にやってみました。
エラーメッセージが表示されずに、 クリックしてみるときちんと動いているので、この方法でいけると思いました。
まとめ
これでかなりな時短ができました。
本来であればマクロを8つ記録するか、1つ記録してコピーしてひとつひとつ内容を変更するかというとんでもない手間がかかるところがこれだけのことでできるのでおそらく作業時間が1/5ぐらいになってるのではないかなと思います。
図形に対する引数付きのマクロの登録をする時は、まず引数付きのマクロは一覧に表示されなくなるので手打ちしかなくなる、入力の仕方は「マクロ名 引数」とマクロ名と引数の間に半角スペースを一つ入れてその全体をシングルコーテーションで囲むという形になるということでした。
コメント