Excel VBA > Excel上級:マクロ > マクロの記録ではできないこと(ユーザーフォームについて)
このエントリーをはてなブックマークに追加

マクロの記録ではできないこと(ユーザーフォームについて)

ユーザーフォームはとても使い勝手がよい方法だけど・・

ExcelのVBAを使う上で、スキルが挙がってくるにつれ使用頻度が多くなるのが、ユーザーフォームだと思います。
しかしながら、このフォームについてはマクロの記録では「何も手が出ない」領域です。従い、このフォームを使う(使って開発する)には、VBEの画面上からガリガリとコーディングを行う必要があります。
ユーザーフォームで作成したカレンダー

ユーザーフォームの特徴とは

マクロの記録ではできないこのフォームですが、表題に合わせて言えば、これで説明が終わってしまいます(笑)。そこでマクロの記録目線で言った場合に、(多少強引ですが)ユーザーフォームにはどんな特徴があるのか見てみたいと思います。
ユーザーフォームを使うことでかなり幅広いシステムが作れます。

シートを触らせない

プログラムでは基本的に「利用者に勝手に変えてもらったら困る」という部分が出てきます。マクロの記録もこのルールが当てはまります。
例えば「シート名」があります。例えばあるマクロでは「2012年12月」シートを使いますが、このシート名がないと文法エラーになり(プログラムが)先に進めなくなります。
あるいは、(プログラム上から参照するため)触ってほしくないセルがある場合、事前に保護などをかけておく必要があります。
ユーザーフォームを使うとこれらの問題は解決できます。ユーザーフォームを使えば、この画面だけ操作できるような仕組みがあるからです。シートをクリックしても「シート触れないよ!」の警告ビープ音が鳴るだけです(※画面を開きながらシートを触るようにすることもできます)。

フォーム画面を作りシートを直接利用者に触らせない

プログラム上からセルとフォームの項目を関連付けさせる

上記につながる話ですが、ユーザーフォームはシートから独立しています。そのため、フォーム上の各項目に入力されている値とシート上のセルを関連付けさせる必要があります。
もしマクロの記録でユーザーフォームが作れる機能がある場合、この点がとても複雑になる気がします。
各項目を「コントロール」と呼びますが、このコンロトールには初めからセルの値を関連付けさせるものや、処理の都度関連付けさせることができます。
下記はリストボックスとセルを関連付けさせています。

いつ何を(実行)するのかを決める

マクロの記録を実行させる場合、通常は画像、図形などに作ったマクロを割り当てて、その画像をクリックすると実行するパターンが多いように思いますが、ユーザーフォームではさらに細かく見ていく必要があります。
ユーザーフォームでは「いつ処理を実行するか」を細かく決めていかないといけません。例えば、ブックを開いたと同時にフォーム画面を表示させるのか、あるいは画面上の「住所」ボタンを押すとシートに(住所内容を)展開させるのかなどを事前に決めておく必要があります。

上記のテキストボックスでは、ここに文字を入力すると同時にセルにも表示させることができます。リストボックスはクリック時のタイミングでシート上の行を選択することができます。
このようなタイミングをユーザーフォーム的に言うと「イベント」と呼びますが、このイベントの理解は慣れるまで大変かもしれません。しかし覚えるとかなり細い部分まで画面やシート、あるいはExcelアプリケーション自体を制御できるため、セキュリティを高めたり、利用者の入力ミスを減らさせたり等、やりたいことが実現しやすくなります。

それでもマクロの記録が必要となるときがある!?

ユーザーフォーム上の処理は基本的にマクロの記録が挟む余地は極めて少ないですが、「フォーム画面→シート展開→シート加工」の流れの場合、シート加工ではユーザーフォームが入ってこないため、マクロの記録が必要になったりします。
これは、開発者のスキルにも依存しますので絶対必要かというとそうではないのですが、(恐らく経験的に)マクロの記録を使ってコードを自動作成し、それを必要に応じて加筆していくパターンが多いように思います。

カテゴリ:Excel上級:マクロ