ユーザーフォームにコンボボックスを追加する方法、リストの作成と詳細設定の方法をご説明します。
コンボボックスはリスト機能を持ったテキストボックスです。
文字列を入力したり、入力された文字列を取得もできます。
また、登録されたリストを選択して表示したり、入力された値をリストに登録が可能です。
追加するにはツールボックスから追加する方法と、VBAから追加する方法がありますので、順にご説明します。
また、サンプルコードではループを使用して複数のコントロールの追加や、詳細設定するコードも記載したいと思います。
その他のコントロールの操作については下記記事をご覧ください。
- ユーザーフォームにコントロールを追加する方法
- コンボボックスのリストの追加と削除する方法
- ラベルを追加と詳細設定する方法
- テキストボックスを追加と詳細設定する方法
- チェックボックスを追加と詳細設定する方法
- リストボックス追加とリスト作成、詳細設定の方法
- オプションボタンの追加と詳細設定する方法
- コマンドボタンの追加と詳細設定する方法
- フレームの追加と詳細設定する方法
1.ツールボックスでコンボボックスを追加する
まずは、ツールボックスでコンボボックスを追加する方法です。
ユーザーフォームの作成がまだの方は、VBE→挿入タブ→ユーザーフォームを選択してUserFormを作成してください。
ツールボックスが表示されていない方は、メニューの実行ボタンや停止ボタンの並びにあるツールボックスボタンをクリックしてください。
もしくは表示タブのツールボックスを選択する事で表示出来ます。
ツールボックスのコンボボックスを選択します。
選択したら、ユーザーフォーム上の設置したい位置でユーザーフォームをクリックします。
すると下記図のように、コンボボックスが追加されます。
2.プロパティウィンドウで詳細設定する
コンボボックスを大まかな位置に設置したら、次はプロパティウィンドウで詳細設定をします。
詳細設定と言ってもプロパティの種類が多すぎますので、一覧で簡単に説明します。
プロパティ一覧
定数の説明があるプロパティは赤字になっています。
プロパティ名 | 説明 |
オブジェクト名 | コントロールの名前を指定します。 |
AutoSize | 文字列に合わせて文字列の表示領域を自動で調整するか指定します。 |
AutoTab | MaxLengthに設定された入力できる最大文字数が入力されたとき、 フォーカスを自動的に次のコントロールに移動するか指定します。 |
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 | コンボボックスにフォーカスをあてる順番を指定します。 |
TabStop | TabIndexの有効/無効を指定します。 |
Text | 表示する文字列を指定します。 |
TextAlign | テキストボックス部分の文字列の位置を指定します。 |
TextColumn | 表示されている複数列の値のTextプロパティに格納する列を指定します。 |
Top | 位置をフォームの上端を0としてポイント単位で指定します。 |
TopIndex | リストの先頭に表示される項目を指定します。 |
Value | 文字列を指定します。 |
Visible | 表示/非表示を切り替えます。 |
Width | 幅をポイント単位で指定します。 |
BackStyleの定数一覧
「fmBackStyleOpaque」が既定値となります。
定数名 | 値 | 説明 |
fmBackStyleTransparent | 0 | 背景を透明に指定します。 |
fmBackStyleOpaque | 1 | 背景を不透明に指定します。 |
BorderStyleの定数一覧
「fmBorderStyleNone」が既定値となります。
定数名 | 値 | 説明 |
fmBorderStyleNone | 0 | 枠線を表示に指定します。 |
fmBorderStyleSingle | 1 | 枠線を非表示に指定します。 |
DragBehaviorの定数一覧
「fmDragBehaviorDisabled」が既定値となります。
定数名 | 値 | 説明 |
fmDragBehaviorDisabled | 0 | ドラッグ&ドロップを許可しません。 |
fmDragBehaviorEnabled | 1 | ドラッグ&ドロップを許可します。 |
EnterFieldBehaviorの定数一覧
「fmEnterFieldBehaviorSelectAll」が既定値となります。
定数名 | 値 | 説明 |
fmEnterFieldBehaviorSelectAll | 0 | 文字列をすべて選択します。(既定値) |
FmEnterFieldBehaviorRecallSelection | 1 | 文字列を選択しません。 |
IMEModeの定数一覧
「fmIMEModeNoControl」が既定値となります。
定数名 | 値 | 説明 |
fmIMEModeNoControl | 0 | IMEのモードを変更しません。 |
fmIMEModeOn | 1 | IMEをオンにします。 |
fmIMEModeOff | 2 | IMEをオフにして英語モードにします。 |
fmIMEModeDisable | 3 | IMEをオフにし、キー操作によってIMEをオンにできません。 |
fmIMEModeHiragana | 4 | 全角ひらがなモードでIMEをオンにします。 |
fmIMEModeKatakana | 5 | 全角カタカナモードでIMEをオンにします。 |
fmIMEModeKatakanaHalf | 6 | 半角カタカナモードでIMEをオンにします。 |
fmIMEModeAlphaFull | 7 | 全角英数モードでIMEをオンにします。 |
fmIMEModeAlpha | 8 | 半角英数モードでIMEをオンにします。 |
ListStyle の定数一覧
定数名 | 値 | 内容 |
fmListStylePlain | 0 | 標準のリストボックスを表示します。 |
fmListStyleOption | 1 | 各項目の先頭にオプションボタンが表示されます。 |
MatchEntryの定数一覧
定数名 | 値 | 説明 |
fmMatchEntryFirstLetter | 0 | 入力した文字と1文字目が一致する候補を検索します。 |
fmMatchEntryComplete | 1 | 入力した文字とすべて一致する項目を検索します。 |
fmMatchEntryNone | 2 | マッチングを行いません。 |
MousePointerの定数一覧
「fmMousePointerDefault」が既定値となります。
定数名 | 値 | 内容 |
fmMousePointerDefault | 0 | 標準ポインター |
fmMousePointerArrow | 1 | 矢印 |
fmMousePointerCross | 2 | 十字ポインター |
fmMousePointerIBeam | 3 | Iビーム |
fmMousePointerSizeNESW | 6 | 右上と左下を指し示す両端矢印 |
fmMousePointerSizeNS | 7 | 上と下を指し示す両端矢印 |
fmMousePointerSizeNWSE | 8 | 左上と右下を指し示す両端矢印 |
fmMousePointerSizeWE | 9 | 左と右を指し示す両端矢印 |
fmMousePointerUpArrow | 10 | 上向き矢印 |
fmMousePointerHourglass | 11 | 砂時計 |
fmMousePointerNoDrop | 12 | ドラッグされているオブジェクトに重なった不可シンボル無効なターゲット。 |
fmMousePointerAppStarting | 13 | 矢印と砂時計 |
fmMousePointerHelp | 14 | 矢印と疑問符 |
fmMousePointerSizeAll | 15 | サイズ変更カーソル (上下左右を指し示す矢印) |
fmMousePointerCustom | 99 | MouseIcon プロパティで指定されたアイコンを使用します。 |
ShowDropButtonWhenの定数一覧
定数名 | 値 | 説明 |
fmShowDropButtonWhenNever | 0 | ボタンは表示しません。 |
fmShowDropButtonWhenFocus | 1 | フォーカスがあたったときボタンを表示します。 |
fmShowDropButtonWhenAlways | 2 | ボタンを常に表示します。 |
Styleの定数一覧
定数名 | 値 | 説明 |
fmStyleDropDownCombo | 0 | 値を入力とリストから値を選択することができます。 |
fmStyleDropDownList | 2 | リストの値のみ入力可能です。 |
TextAlignの定数一覧
「fmTextAlignLeft」が既定値となります。
定数名 | 値 | 位置 |
fmTextAlignLeft | 1 | 左揃え |
fmTextAlignCenter | 2 | 中央揃え |
fmTextAlignRight | 3 | 右揃え |
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