VBA ユーザーフォームをオブジェクトとして操作する

VBA

皆さんはExcel VBAでユーザーフォームを使用していますか?
ユーザーフォームを使うことで、視覚的に見やすい機能を実現できたり、ユーザーがデータを入力しやすくなるなどメリットがあります。
一方で、自由度が高いが故に、ある程度の経験がないと実用的なものを作るのが難しかったり、人によって癖が出やすいため保守が困難になったりもします。

ここでは、オブジェクト指向プログラミングにすることで、コードの再利用性保守性が向上する点に着目し、ユーザーフォームにもこれを取り入れることで、上記の障害を緩和する方法を紹介します。

①今回の題材

下記のように「SampleForm」というユーザーフォームを作るとします。
コンボボックスラベルを1つずつ置いています。

Sheet1にコンボボックスに登録したい文字列を入力しておくことにします。

マクロを起動すると「SampleForm」が立ち上がり、Sheet1のB3セル以下にある値がコンボボックスに追加されます。
また、コンボボックスで選択した値が下のラベルに反映されるようにします。

以上が、今回の題材となるユーザーフォームの仕様です。

②一般的なユーザーフォームの使い方

一般的には下記のような実装になるかと思います。

・ユーザーフォーム側の実装

・標準モジュール側の実装
(「SampleModule」に「showUserForm」プロシージャを作った場合)

ユーザーフォームを起動するだけなので、これだけです。

下記のとおり実行して結果を確認してみます。

マクロからshowUserFormを選んで実行すると下記のユーザーフォームが表示されます。
ラベルの値は「初期値です」となっています。

コンボボックスのドロップダウンリストで「守山」を選択します。

ラベルの値が「守山」に変わりました。

③オブジェクトとしての使い方

続いて、ユーザーフォームをオブジェクトとして扱う場合です。

今回はユーザーフォーム側のInitializeを削除し、メイン処理側で初期化するようにしてみます。
②のUserForm_Initialize内のコードを標準モジュール側に移植したような形になります。

・ユーザーフォーム側の実装(オブジェクト使用)

・標準モジュール側の実装(オブジェクト使用)

実行結果は②と同じなので割愛します。

一番のポイントはSet fm = New SampleFormの箇所です。オブジェクト変数の場合はSetステートメントが必要なのでご注意ください。
最後にオブジェクト解放もしておきます。

今回の題材の場合は恩恵が感じられませんが、ユーザーフォームに外部のモジュールから値を渡す際に、グローバル変数を使用する必要がなかったり、同じユーザーフォームを違う機能として使いたい場合など多くのメリットがあります。

④おわりに

今回は、ユーザーフォームをオブジェクトとして扱う方法を紹介しました。
ここでは、オブジェクトにする具体的なメリットについては次の記事に書いています。

以上、最後まで読んでいただき、ありがとうございました。

次の記事

コメント