ユーザーフォームはNewできるか
ユーザーフォームをNewしてみる
ユーザーフォームって、クラスモジュールに似てね?
クラスモジュールを使っていなかった頃はなんとも思ってなかったが、クラスモジュールをよく使うようになって、改めてユーザーフォームを使ってみると、結構共通点があったんだなあ、と。
「オブジェクト名」というパラメータがあったり、「~~_Initialize」というのがあったり。
……ということは、
Newして変数やら配列やらにぶち込むこともできるんじゃね?
と思ったわけです。
で、やってみた。
まずは、
このようなユーザーフォームを挿入。
ほぼデフォルトの状態。タテ幅を小さくしただけ。
コントロールはラベルだけにしとく。
こちらもほぼデフォルトの状態。フォントサイズを大きくしてテキストを中央寄せにしただけ。
フォームモジュールには、とりあえずコンストラクタだけを設定しておく。
リスト1 フォームモジュール
Option Explicit Private Sub UserForm_Initialize() Me.Show vbModeless '……(*)' End Sub
計算通りなら、インスタンス化されるとすぐにユーザーフォームが表示されるはず。
デフォルトだと、ユーザーフォームを閉じないと次の処理に進まないので、Modelessで表示することにしとく。
標準モジュールには次のコードを書く。
リスト2 標準モジュール
Public Sub test() Dim objForm(0 To 4) As UserForm '……(1)' Dim i As Integer For i = 0 To 4 Set objForm(i) = New UserForm1 '……(2)' objForm(i).Label1.Caption = "アホ" & _ StrConv(i + 1, vbWide) & "号" '……(3)' Next End Sub
(1)の
Dim objForm(0 To 4) As UserForm
では、UserForm型の要素数5の配列を準備。
コード入力中は、
ちゃんとインテリセンスがきく。安心。
んで、(2)の
Set objForm(i) = New UserForm1
で、UserForm1をインスタンス化し、配列にぶち込む。
これが実行された段階で、リスト1の(*)が実行されるので、ユーザーフォームがModeless表示されるはず。
んで、その後(3)の
objForm(i).Label1.Caption = "アホ" & _ StrConv(i + 1, vbWide) & "号"
で、ラベルのCaptionプロパティに文字列「アホ○号」を設定しておしまい。
コード入力中は、
インテリセンスが働かない。不安。
【追記】
変数「objForm()」を「UserForm1型」で宣言していれば、ちゃんとインテリセンスが働きます。単なる私のコーディングミスです。すんまへん。
====追記ここまで====
いざ、実行
こんな感じ。ちょっと周辺の影が濃い……?
めくっていくと、
ちゃんと5つのフォームが表示されている。
おわりに
ユーザーフォームもNewできるし、変数や配列にぶち込むこともできます。
しかしながら、これが何の役に立つのか、サッパリ分かりまへん。