« Vine Linuxと仮想環境(VM Play... Main AndroidでのPCページ表示時の... »

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列目の値が得られている。

参考:

Leave a comment

Your comment