Excel VBA ユーザーフォームにコンボボックスの追加とリスト作成、詳細設定の方法

コントロール作成/操作

ユーザーフォームにコンボボックスを追加する方法、リストの作成と詳細設定の方法をご説明します。

コンボボックスはリスト機能を持ったテキストボックスです。

文字列を入力したり、入力された文字列を取得もできます。

また、登録されたリストを選択して表示したり、入力された値をリストに登録が可能です。

追加するにはツールボックスから追加する方法と、VBAから追加する方法がありますので、順にご説明します。

また、サンプルコードではループを使用して複数のコントロールの追加や、詳細設定するコードも記載したいと思います。

その他のコントロールの操作については下記記事をご覧ください。

1.ツールボックスでコンボボックスを追加する

まずは、ツールボックスでコンボボックスを追加する方法です。

ユーザーフォームの作成がまだの方は、VBE→挿入タブ→ユーザーフォームを選択してUserFormを作成してください。

ツールボックスが表示されていない方は、メニューの実行ボタンや停止ボタンの並びにあるツールボックスボタンをクリックしてください。

もしくは表示タブのツールボックスを選択する事で表示出来ます。

ツールボックスのコンボボックスを選択します。

選択したら、ユーザーフォーム上の設置したい位置でユーザーフォームをクリックします。

すると下記図のように、コンボボックスが追加されます。

2.プロパティウィンドウで詳細設定する

コンボボックスを大まかな位置に設置したら、次はプロパティウィンドウで詳細設定をします。

詳細設定と言ってもプロパティの種類が多すぎますので、一覧で簡単に説明します。

プロパティ一覧

定数の説明があるプロパティは赤字になっています。

プロパティ名説明
オブジェクト名コントロールの名前を指定します。
AutoSize文字列に合わせて文字列の表示領域を自動で調整するか指定します。
AutoTabMaxLengthに設定された入力できる最大文字数が入力されたとき、
フォーカスを自動的に次のコントロールに移動するか指定します。
AutoWordSelect入力されている文字列をダブルクリックした場合に、
選択範囲を単語単位かすべての文字列にするか指定します。
BackColor背景色をシステムまたは、カラーパレットで指定します。
BackStyle背景のスタイルを指定します。
BorderColor枠線の色をシステムまたは、カラーパレットで指定します。
BorderStyle枠線のスタイルを指定します。
BoundColumn選択されている行の何列目の値をコンボボックスの値として格納するか指定します。
ColumnCount表示する列の数を指定します。
ColumnHeads列見出しを表示するか
ColumnWidths複数列ある場合、各列の幅をポイント単位または、指定した単位で指定します。
ControlSourceリンクさせるセルのアドレスを指定します。
ControlTipTextマウスポインターを上に置いたとき、表示する文字列を指定します。
DragBehaviorドラッグ&ドロップを許可するか指定します。
DropButtonStyleドロップダウンボタンのスタイルを指定します。
Enabledイベントに対応するか指定します。
EnterFieldBehaviorフォーカスされた場合に文字列を選択するか指定します。
Font文字列のフォントの種類やサイズを指定します。
ForeColor文字列の色を指定します。
Height高さを指定します。
HelpContextID指定したオブジェクトと関連付けるヘルプのコンテキストIDを指定します。
HideSelectionフォーカスが外れた際に選択されているテキストが強調されたままか指定します。
IMEMode日本語入力システムの実行モードを指定します。
Left位置をフォームの左端を0として、ポイント単位で指定します。
ListRows一度に表示できるデータの最大行数を指定します。
ListStyleリストボックスの表示スタイルを指定します。
ListWidthリスト部分の幅を指定します。
Lockedコンボボックスが編集できるか指定します。
MatchEntryリストの項目を検索する際の規則を指定します。
MatchRequiredリスト内にある項目と一致する値しか入力できないようにするかどうかを指定します。
MaxLength入力できる最大文字数を指定します。
MouseIconマウスポインターがコンボボックス上にあるときアイコンファイルを指定します。
MousePointerマウスポインターがコンボボックスに移動したとき、
表示されるポインターの種類を指定します。
RowSourceリストとしてリンクするセル範囲を指定します。
SelectionMargin文字列をワンクリックで選択可能にする、左端余白の有効・無効を指定します。
ShowDropButtonWhenドロップダウンボタンの表示タイミングを指定します。
SpecialEffectコンボボックスの表面の立体表示を指定します。
Style値の選択方法または設定方法を指定します。
TabIndexコンボボックスにフォーカスをあてる順番を指定します。
TabStopTabIndexの有効/無効を指定します。
Text表示する文字列を指定します。
TextAlignテキストボックス部分の文字列の位置を指定します。
TextColumn表示されている複数列の値のTextプロパティに格納する列を指定します。
Top位置をフォームの上端を0としてポイント単位で指定します。
TopIndexリストの先頭に表示される項目を指定します。
Value文字列を指定します。
Visible表示/非表示を切り替えます。
Width幅をポイント単位で指定します。
BackStyleの定数一覧

fmBackStyleOpaque」が既定値となります。

定数名説明
fmBackStyleTransparent0背景を透明に指定します。
fmBackStyleOpaque1背景を不透明に指定します。
BorderStyleの定数一覧

fmBorderStyleNone」が既定値となります。

定数名説明
fmBorderStyleNone0枠線を表示に指定します。
fmBorderStyleSingle1枠線を非表示に指定します。
DragBehaviorの定数一覧

fmDragBehaviorDisabled」が既定値となります。

定数名説明
fmDragBehaviorDisabled0ドラッグ&ドロップを許可しません。
fmDragBehaviorEnabled1ドラッグ&ドロップを許可します。
EnterFieldBehaviorの定数一覧

fmEnterFieldBehaviorSelectAll」が既定値となります。

定数名説明
fmEnterFieldBehaviorSelectAll0文字列をすべて選択します。(既定値)
FmEnterFieldBehaviorRecallSelection1文字列を選択しません。
IMEModeの定数一覧

fmIMEModeNoControl」が既定値となります。

定数名説明
fmIMEModeNoControl0IMEのモードを変更しません。
fmIMEModeOn1IMEをオンにします。
fmIMEModeOff2IMEをオフにして英語モードにします。
fmIMEModeDisable3IMEをオフにし、キー操作によってIMEをオンにできません。
fmIMEModeHiragana4全角ひらがなモードでIMEをオンにします。
fmIMEModeKatakana5全角カタカナモードでIMEをオンにします。
fmIMEModeKatakanaHalf6半角カタカナモードでIMEをオンにします。
fmIMEModeAlphaFull7全角英数モードでIMEをオンにします。
fmIMEModeAlpha8半角英数モードでIMEをオンにします。
ListStyle の定数一覧
定数名内容
fmListStylePlain0 標準のリストボックスを表示します。
fmListStyleOption1各項目の先頭にオプションボタンが表示されます。
MatchEntryの定数一覧
定数名説明
fmMatchEntryFirstLetter0入力した文字と1文字目が一致する候補を検索します。
fmMatchEntryComplete1入力した文字とすべて一致する項目を検索します。
fmMatchEntryNone2マッチングを行いません。
MousePointerの定数一覧

fmMousePointerDefault」が既定値となります。

定数名内容
fmMousePointerDefault0標準ポインター
fmMousePointerArrow1矢印
fmMousePointerCross2十字ポインター
fmMousePointerIBeam3Iビーム
fmMousePointerSizeNESW6右上と左下を指し示す両端矢印
fmMousePointerSizeNS7上と下を指し示す両端矢印
fmMousePointerSizeNWSE8左上と右下を指し示す両端矢印
fmMousePointerSizeWE9左と右を指し示す両端矢印
fmMousePointerUpArrow10上向き矢印
fmMousePointerHourglass11砂時計
fmMousePointerNoDrop12ドラッグされているオブジェクトに重なった不可シンボル無効なターゲット。
fmMousePointerAppStarting13矢印と砂時計
fmMousePointerHelp14矢印と疑問符
fmMousePointerSizeAll15サイズ変更カーソル (上下左右を指し示す矢印)
fmMousePointerCustom99MouseIcon プロパティで指定されたアイコンを使用します。
ShowDropButtonWhenの定数一覧
定数名説明
fmShowDropButtonWhenNever0ボタンは表示しません。
fmShowDropButtonWhenFocus1フォーカスがあたったときボタンを表示します。
fmShowDropButtonWhenAlways2ボタンを常に表示します。
Styleの定数一覧
定数名説明
fmStyleDropDownCombo0値を入力とリストから値を選択することができます。
fmStyleDropDownList2リストの値のみ入力可能です。
TextAlignの定数一覧

fmTextAlignLeft」が既定値となります。

定数名位置
fmTextAlignLeft1左揃え
fmTextAlignCenter2中央揃え
fmTextAlignRight3右揃え

3.VBAでコンボボックスを追加する方法

VBAでコントロールの追加は次のように記述します。

Set Object = UserForm1.Controls.Add("Forms.ComboBox.1","コントロールの名前","オブジェクトの表示")

コントロールオブジェクトに「Addメソッド」で追加して操作します。

コンボボックスのコントロールIDは「Forms.ComboBox.1」です。

コントロールの種類とコントロールの名前、オブジェクトの表示をTrue、Falseで指定します。

オブジェクトの表示」は省略可能で、省略した場合は既定値がTrueになります。

4.サンプルコード

コンボボックスを追加するサンプルコード

何も指定しないと左上にデフォルト設定の状態で追加されます。

また、コンボボックスを追加する際にオブジェクト名に、コンボボックスと判定できるような名前に指定する事をおすすめします。

追加後にVBAでコントロールを特定する際に簡単になります。

Sub Sample1()

Dim MyCtrl As Object

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
    
    .Show vbModeless

End With

End Sub

コンボボックスのリストを追加する

コンボボックスのリストを追加する場合は、「AddItem」で追加します。

追加する対象が直接、セル、配列と変わっても基本的には同じです。

直接リストを追加する
Sub Sample2()

Dim MyCtrl As Object

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
    
    With MyCtrl
    
        .AddItem "りんご"
        .AddItem "みかん"
        .AddItem "ぶどう"
        .AddItem "スイカ"
    
    End With
    
    .Show vbModeless

End With

End Sub
セルの値をリストに追加する
Sub Sample3()

Dim MyCtrl As Object
Dim i      As Long

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
    
    With MyCtrl
        
        For i = 1 To 4
        
            .AddItem Cells(i, 1).Value
        
        Next i
    
    End With
    
    .Show vbModeless

End With

End Sub
配列の値をリストに追加する

1次元の配列を作成して、コンボボックスのリストにループで追加します。

Sub Sample4()

Dim MyCtrl      As Object
Dim i           As Long
Dim MyArray()   As Variant

ReDim MyArray(0 To 3)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
    
    With MyCtrl
        
        For i = 0 To 3
        
            .AddItem MyArray(i)
        
        Next i
    
    End With
    
    .Show vbModeless

End With

End Sub

コンボボックスの詳細設定をするサンプルコード

Sub Sample5()

Dim MyCtrl      As Object
Dim i           As Long
Dim MyArray()   As Variant

ReDim MyArray(0 To 3)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
    
    With MyCtrl
        .Top = 24                           'Top位置
        .Left = 18                          'Left位置
        .Height = 20                        '高さ
        .Width = 100                        '幅
        .BorderStyle = fmBorderStyleSingle  '枠線
        .ForeColor = RGB(0, 0, 0)           '文字色
        .Font.Name = "メイリオ"             'テキストのスタイル
        .TextAlign = 2                      'テキストの位置
        .FontSize = 10                      'テキストのサイズ
        .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
        .TabIndex = 1
        
        For i = 0 To 3 'リスト追加
        
            .AddItem MyArray(i)
        
        Next i
        
    End With

    .Show vbModeless

End With

End Sub

ループで複数のコンボボックスを追加するサンプルコード

コンボボックスのリストには同じリストを追加しています。

Sub Sample6()

Dim MyCtrl      As Object
Dim i           As Long
Dim n           As Long
Dim MyArray()   As Variant

ReDim MyArray(0 To 3)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"

With UserForm1

    For i = 1 To 4
    
        'コンボボックスの名前に番号を付ける
        Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
        
        With MyCtrl
            .Top = 24 * i                       'Top位置(表示位置を移動する)
            .Left = 18                          'Left位置
            .Height = 20                        '高さ
            .Width = 100                        '幅
            .BorderStyle = fmBorderStyleSingle  '枠線
            .ForeColor = RGB(0, 0, 0)           '文字色
            .Font.Name = "メイリオ"             'テキストのスタイル
            .TextAlign = 2                      'テキストの位置
            .FontSize = 10                      'テキストのサイズ
            .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
            .TabIndex = i                       'タブキーの移動の順番を指定する
            
            For n = 0 To 3 'リスト追加
                .AddItem MyArray(n)
            Next n
            
        End With
        
    Next i
    
    .Show vbModeless

End With

End Sub

設置済みコンボボックスを取得して詳細設定するサンプルコード

追加には「For Next」を使用していますが、取得には「For Each In Next」のループでコントロールを取得しています。

もちろん「For Next」でも取得可能です。

その場合はコンボボックスを取得するには「Controls(“コントロール名”)」で指定します。

Sub Sample7()

Dim MyCtrl      As Object
Dim i           As Long
Dim n           As Long
Dim MyArray()   As Variant
Dim GetCtrl     As Object

ReDim MyArray(0 To 3)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"


With UserForm1
    
    'コンボボックスを5個追加
    For i = 1 To 5
    
        'コンボボックスの名前に番号を付ける
        Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
            
    Next i
    
    .Show vbModeless
    
    'コンボボックスを取得して詳細設定する
    i = 1
    
    For Each GetCtrl In .Controls
        
        With GetCtrl
        
            If InStr(.Name, "MyCombo") <> 0 Then
                .Top = 24 * i                       'Top位置(表示位置を移動する)
                .Left = 18                          'Left位置
                .Height = 20                        '高さ
                .Width = 100                        '幅
                .BorderStyle = fmBorderStyleSingle  '枠線
                .ForeColor = RGB(0, 0, 0)           '文字色
                .Font.Name = "メイリオ"             'テキストのスタイル
                .TextAlign = 2                      'テキストの位置
                .FontSize = 10                      'テキストのサイズ
                .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
                .TabIndex = i                       'タブキーの移動の順番を指定する
            
                For n = 0 To 3 'リスト追加
                    .AddItem MyArray(n)
                Next n
            
            End If
            
            i = i + 1
        
        End With
        
    Next

End With

End Sub

設置済みコンボボックスのテキストの取得/入力するサンプルコード

コンボボックスを追加してリストの文字列を入力する

ループで5個のコンボボックスを追加するコードを使用して、それぞれのテキストに配列の文字列を入力したいと思います。

Sub Sample8()

Dim MyCtrl      As Object
Dim i           As Long
Dim n           As Long
Dim MyArray()   As Variant

ReDim MyArray(0 To 4)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"
MyArray(4) = "バナナ"

With UserForm1

    For i = 1 To 5
    
        'コンボボックスの名前に番号を付ける
        Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
        
        With MyCtrl
            .Top = 24 * i                       'Top位置(表示位置を移動する)
            .Left = 18                          'Left位置
            .Height = 20                        '高さ
            .Width = 100                        '幅
            .BorderStyle = fmBorderStyleSingle  '枠線
            .ForeColor = RGB(0, 0, 0)           '文字色
            .Font.Name = "メイリオ"             'テキストのスタイル
            .TextAlign = 2                      'テキストの位置
            .FontSize = 10                      'テキストのサイズ
            .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
            .TabIndex = i                       'タブキーの移動の順番を指定する
            
            For n = 0 To 3 'リスト追加
                .AddItem MyArray(n)
            Next n
            
            .Text = MyArray(i - 1)
            
        End With
    
    Next i
    
    .Show vbModeless

End With

End Sub
入力されている文字列を取得する
Sub Sample9()

Dim MyCtrl      As Object
Dim i           As Long
Dim n           As Long
Dim MyArray()   As Variant
Dim GetCtrl     As Object
Dim MyStr   As String

ReDim MyArray(0 To 4)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"
MyArray(4) = "バナナ"

With UserForm1

    For i = 1 To 5
    
        'コンボボックスの名前に番号を付ける
        Set MyCtrl = .Controls.Add("Forms.ComboBox.1", "MyCombo", True)
        
        With MyCtrl
            .Top = 24 * i                       'Top位置(表示位置を移動する)
            .Left = 18                          'Left位置
            .Height = 20                        '高さ
            .Width = 100                        '幅
            .BorderStyle = fmBorderStyleSingle  '枠線
            .ForeColor = RGB(0, 0, 0)           '文字色
            .Font.Name = "メイリオ"             'テキストのスタイル
            .TextAlign = 2                      'テキストの位置
            .FontSize = 10                      'テキストのサイズ
            .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
            .TabIndex = i                       'タブキーの移動の順番を指定する
            
            For n = 0 To 3 'リスト追加
                .AddItem MyArray(n)
            Next n
            
            .Text = MyArray(i - 1)
            
        End With
    
    Next i
    
    .Show vbModeless
    
    '入力されているテキストを取得する
    i = 1
    
    For Each GetCtrl In .Controls
        
        With GetCtrl
        
            If InStr(.Name, "MyCombo") <> 0 Then
            
                MyStr = MyStr & vbCrLf & .Text
            
            End If
        
        End With
        
    Next
    
    MsgBox MyStr

End With

End Sub
タイトルとURLをコピーしました