初心者のためのExcel(エクセル)マクロVBA入門-ボタンを設置(イベントプロシージャ)
マクロの実行は基本はF5キーだけど・・・
テストとかで実行するならそれでF5キーで十分ですし途中で中断したければ、止めたい行でF9キーを押すとブレークポイントというものを設置できます。これで、F5で実行するとこのブレークポイントで処理を中断してくれます。さらにF8キーを押すと1行ずつ実行してくれます。
っといきなりVBE自体の機能について説明しましたが、マクロを作るうえでとても重要な機能なのでこの際覚えてくださいね。
- F5:マクロの実行
- F6:ステップイン実行
- F8:ステップ実行(1行ずつ実施)
- F9:ブレークポイントの設置、解除
F6キーは、関数や別のプロシージャを呼び出したときにそのプロシージャへ移動してさらに実行してくれます。いわゆる「マクロを追う」という作業を行う場合にとても便利な機能です。
マクロを知らない人が使えるように
これらの機能は主に開発者である「あなた」しか知らないことです。ユーザーにVBE開いてF5を押してね。(テヘペロ)なんて言えません。したがって、マクロを知らない人にも使ってもらえるようにしないといけません。その為にUI(ユーザーインターフェイス)があります。それが、ボタンやテキストボックスなどの「フォーム」と呼ばれるものです。
さっそく前回までやったプログラムをボタンが押されたら実行されるようにしてみましょう。
開発タブをクリックします。
デザインモードアイコンをクリックします。これでボタンなどのフォームを設置できるモードになります。
挿入アイコンをクリックします。すると、フォームコントロールとActiveXコントロールという2種類のフォームのパーツアイコンが表示されます。それぞれの違いについてはこちらを参照すると良くわかります。結論から言うとVBAで使用するならActiveXコントロールの方を使います。
さて、ActiveXコントロールのボタンを選択してボタンを設置してみます。
これでボタンが設置されました。CommandButton1というのがこのボタンのオブジェクトの名前です。そう、ボタンもオブジェクトです。当然ですね。Excelに存在する様々な物がオブジェクトですから、ボタンだってボタンオブジェクトというオブジェクトです。なんかオブジェクト連呼してますね(笑)オブジェクトはプロパティを持っています。ボタンを右クリックしてプロパティを見てましょう。
すると図のようなプロパティウィンドウが表示されます。これがこのボタンオブジェクトのプロパティです。
さっそく、このプロパティをいじって、カスタマイズします。まずオブジェクト名をわかりやすい名前にしましょう。「btnExeMacro」なんて名前にしましょうか。これで名前を見ればボタンオブジェクトで、マクロを実行するボタンという意味がわかると思います。さて、次にCaptionプロパティをいじります。これはボタンに表示される名前です。日本語で「マクロ実行」に書き換えましょう。するとシートに設置したボタンのタイトルが「マクロ実行」に変わります。
これで、マクロを知らない人でもボタンを押せばマクロが実行されるんだなぁとわかりますね。さらに他のエリアにマクロの説明なんか書いておけば、ばっちりです。
ボタンを押したらマクロを実行するには?
これだけでは、ボタンはいくら押しても何も起きません。「押したらこう動け」というマクロを書く必要があります。難しくはありません。非常に簡単です。ボタンをダブルクリックしてください。するとこのボタンをイベントプロシージャが自動で書かれた状態でVBEが開きます。
Private Sub btnExeMacro_Click() End Sub
こんな感じです。Sheet1オブジェクトに書かれているという所に注意してください。ボタンはSheet1に設置されています。ですからSheet1オブジェクトにイベントプロシージャを記述する必要があるのです。Sheet2にボタンを設置してダブルクリックすればイベントプロシージャは当然Sheet2に書かれます。
後は、ここで前回作成したマクロを呼び出すだけです。こんな風に。。。。
Private Sub btnExeMacro_Click() Call Module1.test1 End Sub
はい、終了。これでボタンを押せば・・・期待通りに動くはずです。大事なことは、ちゃんと「Module1」と書くことです。実際、これは省略できます。「Call test1」でも動きます。しかし、このModule1と標準モジュールから記述することは絶対に忘れないでください。なぜなら、モジュールはいくらでも挿入でき、違うモジュールであれば同じ名前のプロシージャを作成することが可能だからです。もし、違うモジュールに同じプロシージャが存在すれば、即コンパイルエラーです。
何度も何度も言っていますが、「正しくオブジェクトを指定すること」がマクロをマスターするコツです。多少面倒かもしれませんが、絶対にモジュール名から記述するようにしましょう。
イベントプロシージャとメインの処理は分ける!
良く見るとわかりますが、このイベントプロシージャの中に全部のプログラムをぶち込んでも、別に動きます。ではなぜ処理をイベントが起きた時には必要な処理を呼び出す(コールする)だけにしているのでしょうか?
答えは簡単、「プログラムの再利用性」です。こうして処理を分けることで、別のブックに同じものを作成したい場合には、モジュールをコピーするだけでいいわけです。イベントプロシージャに書いてしまうと他のファイルに移植できません。
このようにできるだけ処理を分けて書くようにすると、非常に綺麗なコードになるので心がけてみてください。最初は分け方とかで苦労すると思いますがそれが、いわゆる「プログラミング」の醍醐味です。
今日はこんな感じで。
次回は、、、考えてないので思いつきで・・・汗