ユーザーフォームはNewできるか

ユーザーフォームをNewしてみる

ユーザーフォームって、クラスモジュールに似てね?

クラスモジュールを使っていなかった頃はなんとも思ってなかったが、クラスモジュールをよく使うようになって、改めてユーザーフォームを使ってみると、結構共通点があったんだなあ、と。

「オブジェクト名」というパラメータがあったり、「~~_Initialize」というのがあったり。

……ということは、

Newして変数やら配列やらにぶち込むこともできるんじゃね?

と思ったわけです。

で、やってみた。

まずは、

f:id:akashi_keirin:20170918093649j:plain

このようなユーザーフォームを挿入。

ほぼデフォルトの状態。タテ幅を小さくしただけ。

f:id:akashi_keirin:20170918093658j:plain

コントロールはラベルだけにしとく。

こちらもほぼデフォルトの状態。フォントサイズを大きくしてテキストを中央寄せにしただけ。

フォームモジュールには、とりあえずコンストラクタだけを設定しておく。

リスト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の配列を準備。

コード入力中は、

f:id:akashi_keirin:20170918093716j:plain

ちゃんとインテリセンスがきく。安心。

んで、(2)の

Set objForm(i) = New UserForm1

で、UserForm1をインスタンス化し、配列にぶち込む。

これが実行された段階で、リスト1の(*)が実行されるので、ユーザーフォームがModeless表示されるはず。

んで、その後(3)の

    objForm(i).Label1.Caption = "アホ" & _
	                            StrConv(i + 1, vbWide) & "号"

で、ラベルのCaptionプロパティに文字列「アホ○号」を設定しておしまい。

コード入力中は、

f:id:akashi_keirin:20170918093724j:plain

インテリセンスが働かない。不安。

【追記】

変数「objForm()」を「UserForm1型」で宣言していれば、ちゃんとインテリセンスが働きます。単なる私のコーディングミスです。すんまへん。

====追記ここまで====

いざ、実行

f:id:akashi_keirin:20170918093736j:plain

こんな感じ。ちょっと周辺の影が濃い……?

めくっていくと、

f:id:akashi_keirin:20170918093817j:plain

ちゃんと5つのフォームが表示されている。

おわりに

ユーザーフォームもNewできるし、変数や配列にぶち込むこともできます。

しかしながら、これが何の役に立つのか、サッパリ分かりまへん。

@akashi_keirin on Twitter