1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UserFormの動的生成まとめ

Last updated at Posted at 2020-07-12

要点

・まずVBIDE.VBComponent型の変数を宣言し、VBProject.VBComponents.Addメソッドで生成したインスタンスを格納する

Dim foo = VBIDE.VBComponent
Set foo = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)

・プロパティは.Propertiesコレクションで設定するが、.Nameの様に直接設定できるものもある

With foo
    .Name = "bar"
    .Properties("BackColor") = &HF4F5F6
    ....
End With

・コントロールの追加は.Designerプロパティで

Dim con as MSForms.Control
Set con = foo.Designer.Controls.Add("Forms.Label.1")
With con
    .BackColor = &HF4F5F6
    ....
End With

・イベント等を書くのは.CodeModuleプロパティで

With foo.CodeModule
    .InsertLines(1, "Private Sub UserForm_Initialize()")
    .InsertLines(2, "[codes here]")
    .InsertLines(3, "End Sub")
    .InsertLines(4, ....)
    ....
End With

・生成したVBComponentのインスタンス化はUserForms.Addメソッド、受けるインスタンスはObject型で

Dim hoge as Object
Set hoge = UserForms.Add("bar")

・インスタンスを.Showで表示

hoge.Show

・削除はインスタンスのUnload後に

Call ThisWorkbook.VBProject.VBComponents.Remove(foo)

補足

.Designer.Controls.Addで作成したコントロールを受けるオブジェクト(上記con)は、使い回しがきく。複数・多種のコントロールを追加する場合でも、一つMSForms.Control型オブジェクトを用意すればいい。

・一方、MSForms.TextBox等の個別のコントロールに存在してMSForms.Controlに存在しないプロパティは多く、例えばMSForms.Control.Fontとするとエラーが返る。MSForms.Controlには.Properties([property name])も用意されていないのでプロパティ名からの設定もできない。作成するコントロールの型に合わせてオブジェクトを作ればエラー回避できるが、オブジェクト数が増えて使い回しメリットが減る。

・「追加」と「属性設定」のプロシージャを分けて、追加するプロシージャではMSForms.Controlで受けた後、属性を設定するプロシージャに渡し、その際に(ByRef [paramname] As MSForms.TextBox)のように個別のコントロール型で受ける手はある。

・同種のコントロールを反復処理で追加するとき、属性の反映が不十分なまま描画進行してしまう(例えば.Heightがまちまちな)ときは、反復処理中にDoEventsしてみる。

.Designerプロパティの引数やオプションについてはMicrosoft Docs参照(下記)。

・VBComponentのインスタンス(上記hoge)をObject型ではなくMSForms.UserForm型で受けるとエラー。

.CodeModule.InsertLinesで設定する行番号は、モジュールオプションの自動挿入を考慮する(例えば、Option Explicitが自動挿入される設定であれば、行番号は2からスタートする、等)。

.CodeModule.InsertLinesでプロシージャを書き込むと、ブレークポイント設定もStopコマンドも許されない(「中断モードでは入力できません」→「継続」or「終了」の選択を迫られる)。デバッグの妨げになるので、静的に生成したUserFormで完成させてから動的UserFormに移行するのが無難。

・インスタンスのUnload前にVBComponents.RemoveするとExcelが落ちる。

参考サイト

[Microsoft Docs: Properties (Visual Basic Add-in Model)]
https://docs.microsoft.com/ja-jp/office/vba/language/reference/visual-basic-add-in-model/properties-visual-basic-add-in-model

[Reference Dynamic UserForm Name]
https://www.excelvbasolutions.com/2017/08/reference-dynamic-userform-name.html

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?