5、VBAによるマクロの作成(応用編)
5−3、マクロのいろいろな起動方法
これまで、マクロの実行は「ツール」メニューの中の「マクロ」メニューの中から実行してきましたが、他にもいろいろな方法があります。
ボタンによるマクロの起動
例)
※ここでの例は他の例文とのつながりはありません。新規ファイルを用意してください。
シート上にボタンを作成し、そのボタンが押された時に実行するという場合を紹介します。
- まず下のマクロを記述して下さい。
Sub Test()
MsgBox "ボタンによるマクロの実行"
End Sub
- 次にVB Editorから、Excelに戻り、シート上に以下の手順でマクロ実行用のボタンを作成します。
「表示」メニュー→「ツールバー」→「フォーム」の順にクリックしフォーム作成用のツールバーを表示させます。(下図参照)
下図の赤丸のついたボタンをクリックし、シート上の適当な位置にマウスをドラッグしてボタンを作成します。
→
ボタンができた段階で「マクロの登録」ウィンドウが表示されるので、「Test」を選択し、「OK」をクリックしてください。これで、ボタンへのマクロ登録は完了です。
- それでは、うまく実行されるか試してみましょう。
一度ボタン以外の部分(セル)をクリックし、ボタンの選択を解除して下さい。
次にマウスカーソルをボタンの上に重ね、指マークに変わることが確認できたら、ボタンをクリックしてみます。
マクロが起動し、メッセージが表示されれば、成功です。
これを利用すれば、希望のマクロプログラムをボタンクリックで実行させることができるようになります。
- ボタン上に表示されている文字(初期状態では「ボタン 1」)を変更するには、Windowsの場合はボタン上で右クリック、Macintoshの場合はボタン上で「Ctrl」+クリックし、表示されるメニューの中から「テキストの編集」を選択し、変更して下さい。
↓ ↓ ↓ ↓
サブルーチンによる起動
- サブルーチンとはマクロから別のマクロを起動するもので、処理が複雑になる場合などは、処理を細かく分けてサブルーチンとして記述し、メインルーチンでそれらをまとめるという記述の仕方ができます。簡単な例を挙げてみます。
例)
Private Sub SubR1()
Range("B2") = "サブルーチンのテスト"
End Sub
Private Sub SubR2()
MsgBox "終了します"
End Sub
Sub MainR()
Rtn = MsgBox("文字を入力しますか?", 4 ,"選択")
If Rtn = 6 Then
Call SubR1
Else
Call SubR2
End If
End Sub
【このコードの解説】
- この例は、セルへの文字入力を行う「SubR1」と、終了のメッセージを表示する「SubR2」という2つのサブルーチンを用意し、メインルーチンの処理によって、適した方が呼出されるというものです。
- 「Private Sub」とは、内部マクロという意味で、ユーザーがそれを単独で実行することはできません。今回のように、別のマクロから呼出されるといった、補助マクロ的なプログラムの場合にこの「Private Sub」という書き方をします。
- メインルーチンから、サブルーチンを呼出す場合は「Call」という記述を使います。「Call」に続けて、呼出したいマクロの名前を記述します。
- 実際のマクロの流れとしては、メインルーチンからサブルーチンを呼出すと、その時点で、サブルーチンの処理が実行されます。サブルーチン内の処理がすべて終わると、再びメインルーチンの呼び出しをした次の行に戻ってきて、そのまま処理が続けられます。
ファイルの開閉時に自動的に実行されるマクロ
- マクロ名を以下のように設定するだけで、ファイルを開いた時に自動的に処理が実行されます。
Sub auto_open()
(各種処理)
End Sub
- マクロ名を「auto_open」にし、(各種処理)の部分にオープン時に実行させたい処理を記述するだけでOKです。
例)
ファイルを開いた時にそれを知らせるメッセージを表示します。
Sub auto_open()
MsgBox "ファイルが開かれました。"
End Sub
- 同様に、ファイルを閉じる時にも自動的にマクロを実行させることができます。この場合はマクロ名を以下のように設定して下さい。
Sub auto_close()
(各種処理)
End Sub
- これにより、ファイルを閉じようとした際に自動的にこのマクロが起動し、閉じる直前にマクロを実行して、その後ファイルを閉じます。
例)
ファイルを閉じる前にそれを知らせるメッセージを表示します。
Sub auto_close()
MsgBox "ファイルを閉じます。"
End Sub