VBA

【VBAユーザーフォーム:動的にコントロールを追加する】

VBA ユーザーフォーム

皆さんの中に、ExcelVBAのフォームで、コントロールを動的に作成していくことってできないのかなと考えている方がいるかもしれません。

今回は、そんな方の為に、難しい技術ですが解説を書いていきたいと思います。

クラスモジュールを使うことでイベントも拾えるので、使い道は色々とあるかと思います。

クラスモジュール

VBAをバリバリ使用している方でも、クラスモジュールって何?となっている方が多いと思います。
そこで、クラスモジュールの説明から書いていきたいと思います。
クラスモジュールを理解されている方は、読み飛ばしてください。

クラスとは

オブジェクトを作成するためのデータ型です。その「型」を好きなように作成できます。オブジェクトはすべて参照型になります。

ワークシートや、セルを表す Range などのオブジェクトは、すべてクラスで作成されています。

標準モジュールと同じように、変数や関数といったコードを書けます。その他にコンストラクタやプロパティといったクラス専用の機能があります。

インスタンス化するとクラスが使用できるようになります。使い終わったらインスタンスを、破棄する必要があります。

クラスのインスタンス化とは

クラスは、オブジェクト指向のプログラムでは非常に重要な考え方ですので、イメージを固めていただければと思います。

クラスからオブジェクトを生成することを「インスタンス化」と言います。

クラスが「型」で、その「実体」がインスタンスである


あるいは、クラスは「設計図」「定義」「テンプレート(雛形)」などとも説明されることもあります。

プログラムでの記述方法としては、newというキーワードを使い、 「new クラス名」と記述します。

上記コードどちらでもインスタンス化できます。
クラス及び、オブジェクト指向はVBAだけやっていると理解しにくいと思いますので、今後詳しく解説していきます。

実装

それでは実装していきます。

クラスモジュール

まずクラスモジュールを一つ追加して以下のコードを張り付けてください。

クラスモジュールには追加するボタンのクリック処理をサンプルとして用意しました。

追加されたボタンはmybtnに格納されます。

あまり見慣れない、Propertyプロシージャや、WithEventsキーワードが出てきていますが、解説すると長くなるので今回は省略します。

VBAでのオブジェクト指向の解説を行う際に丁寧に解説します。

ユーザーフォーム

ユーザーフォームを一つ作成して、ボタンを一つ追加してください。

名前はデフォルトのままで構いません。

ボタンをダブルクリックして、下記コードを張り付けてください。

標準モジュール

最後に標準モジュールには、ユーザーフォームを表示するコードを書きます。

実行してみる

ShowFormメソッドを実行してフォームを表示してみてください。

表示後に「ボタン追加(A)」をクリックしてみてください。
クリックした回数だけボタンが増えると思います。

次に追加ボタン(0)など追加されたボタンを押してみてください。

ボタンのCaptionがメッセージボックスで表示されると思います。
()内の数字が押すボタンにより変更されていることが分かると思います。

今回のまとめ

いかがでしたか?
今回のサンプルは、そのままでは実用性はありませんが、応用していろいろなコントロールを使用する事で、かなり便利な使い方が出来るのではないでしょうか。

クラスを使用する事で、コードの可読性が上がりバグなどが発生しにくく、メンテナンス性の高いコードが出来ます。

クラス化することで、コードの再利用性も非常に高くなり、使い捨てコードを減らすことも可能です。

VBAのクラスは貧弱なので、使いたがらない人も多いですが、 当ブログでは、どんどんクラスを使っていきたいと思います。

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

オブジェクト指向を取り上げている書籍はVBAでは少ないです。

C#やVB.NETなどの書籍を読むと記載があります。

ぜひVBAに読み替えてC#などの書籍も読んでみると出来ることが一気に増えるかと思います。

複数の言語を学ぶことで、プログラミング力が飛躍的に向上するのでC#の本も読んでみてください。