トップ > 逆引きで学ぶ ユーザーフォーム&コントロール > 追加章 遊ぶ!楽しむ!ユーザーフォーム > デザインモードのフォームコントロールをコードから操作する

デザインモードのフォームコントロールをコードから操作する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_StdModule1標準モジュール
vbext_ct_ClassModule2クラスモジュール
vbext_ct_MSForm3ユーザーフォーム

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

ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.