【本日のミッション】 Show コンボボックスに設定した複数列の値リストから、表示されていない列のデータを取得せよ。 目次
ミッションの概要コンボボックスに設定した複数列の値リストから、表示されていない列のデータを取得せよ、というのが今回のミッションです。 今まで紹介してきた、コンボボックスで選択しているデータを取得する方法のは下記2つです。今回はListプロパティを使ってデータを取得します。
今回のミッションには、コンボボックスにListプロパティを使って配列に格納した複数列のセルデータを値リストとして設定(Excel VBA) で作成したコンボボックスを利用します。 複数列のデータを、コンボボックスの値リストとして設定しています。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ TextColumnプロパティを「2」と設定しているため、値を選択すると2列目の「名前」が表示されます。 ComboBox1.TextColumn = 2 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Textプロパティで値を取得すると、コンボボックスに表示されている2列目のデータが取得されます。(参照:複数列の値リストから
コンボボックスに表示している列のデータを取得(Excel VBA)) 今回のミッションは、コンボボックスで選択しているデータの、表示されていない列のデータを取得することです。 選択しているデータ行の指定列の値を取得するコードを、コマンドボタンに設定ユーザーフォームにコマンドボタンを追加する方法は、コンボボックス 複数列ある値リストから表示されていない列のデータを取得する方法1(Excel VBA)をご参照ください。 [IDを取得]ボタンをダブルクリックすると、コードウィンドウが表示され、下記コードが追加されています。 「Private Sub 〇〇〇_Click()」に書いた処理は、〇〇〇をクリックした時に行われます。 Private Sub IDを取得_Click() End Sub ここに[IDを取得]ボタンをクリックした時の動作を追加します。
Private Sub UserForm_Initialize() Dim ary_d 'リストに設定するデータ用配列 ary_d = Worksheets("サザエさん").Range("A2:D9") With ComboBox1 .ColumnCount = 4 '表示列数 .TextColumn = 2 'Textプロパティで取得する値の列 .ColumnWidths = "30;35;30;35" '列幅 .List = ary_d '参照範囲 End With End Sub Private Sub IDを取得_Click() If ComboBox1.ListIndex = -1 Then MsgBox "データが選択されていません。" Else MsgBox ComboBox1.List(ComboBox1.ListIndex, 0) End Ifd If End Sub ■■■スポンサーリンク■■■ ユーザーフォームを表示して動作を確認このコード内にカーソルを置いたまま、[F5]キーをクリックすると(ユーザーフォームの実行)ユーザーフォームが表示されます。 配列に入れるデータの参照先にシート名が含まれていないと、アクティブになっているシートのセルデータが使用されるので注意が必要です。シート名を参照先に含めていない場合は、参照データのシートをアクティブにしてからマクロを実行してください。 ary_d = Worksheets("サザエさん").Range("A2:D9") 「配列」参照:セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA) メイン画面が表示されます。 コンボボックスの値リストから項目を選択すると、TextColumnプロパティで指定した列の値が表示されます。 [IDを取得]ボタンをクリックすると、Listプロパティで指定した行・列の値が表示されます。 今回は、[閉じる]ボタンを付けていないため[×]ボタンでユーザーフォームを閉じます。 ■■■スポンサーリンク■■■ ListIndex プロパティListIndex プロパティには「値リストで選択しているデータの行位置(インデックス値)の取得」「指定した行位置(インデックス値)のデータ選択」の機能があります。 値リストで選択しているデータの行位置(インデックス値)の取得コンボボックスで選択しているデータの行位置(インデックス値)を取得することができます。データを選択していない場合のインデックス値は「-1」になります。 インデックス値は、1つ目の「サザエ」さんを「0」として数えます。「マスオ」さんはインデックス値「3」になります。 指定した行位置(インデックス値)のデータ選択コンボボックスのリストから、指定した行位置(インデックス値)のデータを選択します。 インデックス値は、値リストの一番上のデータを「0」として数えます。 また、インデックスに「-1」を指定すると、項目の選択が解除されて空白になります。 Listプロパティ値リストの指定した「行」「列」のデータを取得Listプロパティと言えば、コンボボックスに値リストを設定するプロパティなのでは? その他にListプロパティには、設定した値リストから「行」「列」を指定してデータを取得する機能もあります。コンボボックスに表示されていないデータも取得できます。 コンボボックスオブジェクト.List(値を取得したい行,値を取得したい列) 値を取得したい行:値リストの1行目を「0」として数えます。 今回は「値を取得したい行」に「ComboBox1.ListIndex」を指定しています。 値を取得したい行=3 と指定しているので、結果はマスオさんの「ID04」となります。 TextColumnプロパティと併用することで、コンボボックスに表示する値と、データ取得する値を別々にすることが可能になります。 データが選択されていないときの値Listプロパティでデータを取得する際、値リストから何も選択されていないと下記エラーが表示されます。 実行時エラー '381': Listプロパティの値を取得できません。プロパティの配列のインデックスが 無効です。 値リストからデータが選択されていない場合、「ComboBox1.ListIndex」は「-1」を返します。値リストの行に「-1」は無いのでエラーになります。 下記コードで、エラー回避をする必要があります。 If ComboBox1.ListIndex = -1 Then
MsgBox "データが選択されていません。"
Else
MsgBox ComboBox1.List(ComboBox1.ListIndex, 0)
End If 【参考】VBA(マクロ)作成の前、リボンに開発タブを表示させる(Excel VBA) ■■■スポンサーリンク■■■ |