バイオインフォをやっている大学院生です。プログラミングのことなどを書きます。

Excelでセルをボタンにしてマクロを実行させるVBA

やりたいこと

f:id:feb_march:20200606160354p:plain
イメージ
このセルをダブルクリックすると、この上に新しい行を追加するマクロが実行されるようにしたい。(今回は行を追加することを目的とするが、マクロの中身は行を新しく追加するものである必要はなく、任意のマクロを行わせることができる。)

基本的な流れはここの内容を参考にした。 しかし、この記事で紹介されているボタンでは、セルの値が固定されている必要がある。行を追加する動作をさせたいので、ボタンの位置が移動してしまうのでこのままでは使えない。また、このボタンを複数個作成するので、関数を複数定義するのもいまいち。

そこで、ボタンの場所ではなく、値が"add row"であるセルをダブルクリックときに行を追加するマクロが実行できるようにする。

方法

まず、作業するブックで、マクロを有効であるとする。Excel2007以降は、拡張子がxlsxだとマクロなしになっている。もしxlsxだったら、拡張子をxlsmにして保存し直す。 なお、MacExcelで作業をした。Windowsの場合とはマクロの設定方法など細かい違いがあるかもしれないが、基本的には同じやりかたで可能だと思う。

1. ボタンを押したときに実行するマクロの定義

まず、ボタンを押したとき呼び出したいマクロを定義する。

f:id:feb_march:20200606161413p:plain
Mac版のばあいでのマクロの登録
新しいマクロの登録は、ツール→マクロ→新しいマクロの記録というところからできる。今回は選択したセル(ボタンにしたセル)をクリックしたときに、その上に新しい行を追加したい。だから、適当なセルを選んでおいて、マクロの記録を開始したら、右クリック→挿入→行全体を選択して、セルの上に新しい行を追加する。これでマクロの記録は終わりで、マクロの名前はadd_rowとしておく。

2. ボタンの作成

セルにしたいボタンに対して、"add row"と入力する。なお、これから"add row"と書かれたセルをボタンと判別するVBAをかくことになるので、ボタンの値は他のボタンでないセルとかぶらないように注意する。たとえば、"____add row____"などにすることで、偶然他のセルと値が被ってしまう可能性を下げられるだろう。 なお、見た目をボタンっぽくする方法はここで紹介されている。やってみたい方はここを参照してやってみてほしい。

kokodane.com

3. VBAの作成

"add row"と書いてあるセルがダブルクリックされたときに、1.で定義したマクロ"add_row"が呼ばれるVBAを書く。 まず、ツール→マクロ→Visual Basic Editorを開く。 機能を追加したいシートを左側のファイルナビゲータから開くと、エディタが表示される。そこに次のコードをかく

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not (Target.Value = "add row") Then Exit Sub
add_row
End Sub

2行目の"add row"は2.でボタンにしたセルの値を入力する。3行目は行いたいマクロの名称を指定している。マクロを他の名前で登録していたら、それに応じてなおしてほしい。

VBA script
VBAスクリプト

上の選択項目も画像のように直す。

テスト

"add row"としたセルをダブルクリックして、上に行が追加されることを確認した。また、このセルをコピペして他の場所にうつしても、同様に動作することを確認した。