デザインモードのフォームコントロールをコードから操作する2022.05.03 更新:2023.04.25
次の書籍の第1章~5章を公開しています。
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」
ユーザーフォームの作成や編集は、一般的に「デザインモード」で行います。
このモードでは、フォームやコントロールを視覚的に把握でき、マウスを用いてコントロールの移動や大きさの変更を容易に行えます。
またドラッグ&ドロップでコントロールをまとめて選択し、複数のコントロールのプロパティを一括で設定するといったことも簡単に行えます。
しかし、コントロールのオブジェクト名を変更するといった、コントロール毎に異なるプロパティを設定するには、一つ一つのコントロールを選択し、プロパティの変更が必要になるため、手間がかかります。
そのように各コントロールのプロパティに別の値を設定したい場合には、コードからコントロールのプロパティを設定する方法がお薦めです。
準備
デザインモードのユーザーフォームをコードから操作するには、事前の設定が必要です。
■VBA プロジェクト オブジェクト モデルへのアクセスを信頼する
「開発」タブの「マクロのセキュリティー」コマンドをクリックすると、「セキュリティーセンター」ウィンドウが表示されます。
ウィンドウ内の「開発者向けマクロ設定」項目の
「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックボックスにチェックを入れ、「OK」を押します。
これで設定は完了です。
サンプルコード
以下のコードは、標準モジュールに記述します。
■ユーザーフォームを追加する
Sub Add_Form() ActiveWorkbook.VBProject.VBComponents.Add 3 'vbext_ct_MSForm End Sub
VBComponentsのAddメソッドの後に「3」を設定するとフォームが追加されます。
この「3」は vbext_ComponentType列挙型 の vbext_ct_MSForm の「実体の数値」になります。
この vbext_ComponentType列挙型 ですが、デフォルトでは使用できません。この列挙体を使用するには「Microsoft Visual Basic for Applications Extensibility」の参照設定が必要になります。
ここでは「Microsoft Visual Basic for Applications Extensibility」の参照設定をしていない状態でも、フォームが追加できるように、Addメソッドの引数に列挙型の実体の数値を設定しています。
vbext_ComponentType | 数値 | コンポーネント |
---|---|---|
vbext_ct_StdModule | 1 | 標準モジュール |
vbext_ct_ClassModule | 2 | クラスモジュール |
vbext_ct_MSForm | 3 | ユーザーフォーム |
Add メソッド (VBA アドイン オブジェクト モデル)
■ユーザーフォームを追加し そのフォームにコマンドボタンを100個追加する
Sub Add_CommandButton100() Dim i As Long With ActiveWorkbook.VBProject.VBComponents.Add(3) With .Designer 'デザインモード For i = 1 To 100 .Controls.Add "Forms.CommandButton.1" '参照:ProgID: Next End With End With End Sub
Controls.Addメソッドで追加するコントロールのProgIDは次をご参照ください。
Addメソッド(Microsoft Forms)| Microsoft Docs
上記コードを実行するとフォームが追加され、そのフォーム上にコマンドボタンが100個追加されます。フォームを一見するとコマンドボタンは1つして見えませんが、それは100個のボタンが重なっているためです。
追加されたコントロールのオブジェクト名は「CommandButton2」「CommandButton3」のようにコントロールのタイプ+連番で自動設定されます。
■既存のユーザーフォームにLabelを100個追加しCaptionプロパティを設定する
Sub Add_Label100() Dim i As Long With ActiveWorkbook.VBProject.VBComponents.Item("UserForm1") With .Designer For i = 1 To 100 With .Controls.Add("Forms.Label.1") .Caption = i 'Captionプロパティにiの値を設定 End With Next End With End With End Sub
コード中の"UserForm1"の部分が、既存のユーザーフォームのオブジェクト名になります。オブジェクト名に応じて変更してください。
■既存の100個のLabelコントロールにプロパティを設定する
Sub Set_Property() '既存の「UserForm1」上にLabelコントロールが100個あることが前提です 'Labelのオブジェクト名はLabel1~Label100とします Dim i As Long Dim j As Long Dim objForm As Object Set objForm = ActiveWorkbook.VBProject.VBComponents.Item("UserForm1") With objForm.Designer For i = 1 To 10 For j = 1 To 10 With .Controls("Label" & (i - 1) * 10 + j) .Caption = "" '見出し:無 .Width = 18 '幅:18 .Height = 18 '高さ:18 .Left = (i - 1) * 18 + 18 '横位置 .Top = (j - 1) * 18 + 18 '縦位置 .BackColor = &HFFFFFF '背景色:白 .BorderStyle = 1 '輪郭線:有 .Name = "FCells_" & i & "_" & j 'オブジェクト名 End With Next Next End With End Sub
書籍紹介140以上のサンプルファイル付き!
知りたいがすぐわかる! やりたいがすぐできる!
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」(Kindle版)
ユーザーフォームを扱えると、VBAでできることが大きく広がります!
本書では、知りたいこと、やりたいことから、逆引きで学びを深められます。
■ 購入:amazon