VBA: コンボボックスでHTMLセレクトボックス風
VBAのコンボボックスを使っていて、選択候補を設定するのはいいのだが、そのままだと表示した文字列をそのまま選ぶだけになってしまって、その候補に対応したシリアル値などがある場合に、いちいち選択後にif文や配列でその対応関係を与え直す処理をしないといけないことがある。
HTMLのセレクトボックスのように「<option value="1">太郎</option>
」のように、表示する項目名と、システム側に与える値とを先に対応付けておいて自動で設定できるようにしたかった
のだが、それにけっこう手間取った。
結論としては、複数列(2列)のコンボボックスで、一方の列を非表示にして表示を1列にし、非表示側の列を値用に指定した(コンボボックス 項目名と取得値の選り分けサンプル.xlsm)。
フォームを用意して、コンボボックス(ComboBox1)とコマンドボタン(CommandButton1)を適当に貼りつける。
元データは、ここではSheet1!A1:B4として用意した。A列に番号、B列に項目名(ここでは名前)が入っている。
コンボボックスの初期化は、フォームのコードで下記のように指定した。
Private Sub UserForm_Initialize() With ComboBox1 .ColumnCount = 2 '表示列数 .TextColumn = 2 'テキストボックスと.Textに割り当てる列の指定 .BoundColumn = 1 '.Valueに割り当てる列の指定 .RowSource = "Sheet1!A1:B4" 'シート範囲を値に指定 .ColumnWidths = "0;-1" '列幅を0(非表示)と-1(幅自動調整) End With End Sub Sub CommandButton1_Click() MsgBox "値=" & ComboBox1.Value '.Valueを取得すると.BoundColumnの列が得られる End Sub
ここで、「.TextColumn」の指定がなかなか把握しにくく、解説サイトによると「表示列」となっていて、ずっとドロップダウンするときに表示する列の指定かと思っていたのだが、そうではなく、単に選択後のテキストボックスへの表示と.Text属性で得られる列の指定で、ドロップダウン時の表示(幅の)指定は.ColumnWidthで行なう必要があった(幅0で非表示、幅-1か空白で自動調整の指定)。
通常のそのまま複数列にしただけだと、次のような表示となる。
項目を選択した場合は、1列目の値がテキストボックスに入り、.Valueで取得される値も同じ値となる。
一方、上記のコードを使って、複数列でも表示幅を指定して2列目だけの表示にした場合だと次の表示となる。
項目を選択した場合は、.TextColumnで指定した2列目の値がテキストボックスに入り、.Text属性でもこちらが使われる。
コマンドボタンで処理では.Valueを得るようにしていて、ここでは.BoundColumnで指定した1列目の値が得られている。
参考:
- 複数列のリストボックスを作成する – リストボックス – Excelフォーム
- 複数の列を利用する場合に列毎の幅を設定するには「ColumnWidths」プロパティを使います。
- 空白にするか、-1 を指定したときには列幅が算出されます。幅が 0 に設定された列は表示されません。
- 複数の列の幅を同時に指定するときは、セミコロン (;) を区切り記号に使います。
- IT工務店 店主のつぶやき日記:(エクセルVBA)コンボボックスに複数列を表示する
- コンボボックスのリストを複数列表示する:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
- ※上記のリストはこちらのサイトのものをベースにさせて頂きました。