リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得せよ。

ミッションの概要

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得せよ、というのが今回のミッションです。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックスにListプロパティを使って配列に格納した複数列のセルデータを値リストとして設定(Excel VBA)で作成したリストボックスの下に、

  • 値リストで選択しているデータを取得するコマンドボタン

を作り、選択しているデータをダイアログ表示します。

【その他 リストボックスからデータを取得する方法】
リストボックス 1列の値リストで選択しているデータをTextプロパティで取得(Excel VBA)
リストボックス 1列の値リストで選択しているデータをValueプロパティで取得(Excel VBA)
リストボックス 1列の値リストで選択しているデータをListプロパティで取得(Excel VBA)
リストボックス 複数列の値リストで選択しているデータを、列指定してTextプロパティで取得(Excel VBA)
リストボックス 複数列の値リストで選択しているデータを、列指定してValueプロパティで取得(Excel VBA)

ユーザーフォームにコマンドボタンを追加する

ユーザーフォームを表示させる

画面左のプロジェクトエクスプローラーから、ユーザーフォームをダブルクリックして表示させます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

ツールボックスを表示させる

ツールボックスを、下記方法で表示させます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

ツールボックスを表示する方法1

[表示]-[ツールボックス]

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

ツールボックスを表示する方法2

標準ツールバーの[ツールボックス]ボタンをクリックします。

標準ツールバーが表示されていない場合は、[表示]-[ツールバー]-[標準]で表示されます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

■■■スポンサーリンク■■■

ユーザーフォームにコマンドボタンを配置する

ツールボックスから「コマンドボタン」をクリックします。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックスの下にコマンドボタンを作成します。
リストボックス・コマンドボタンの位置は、程よく調整します。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

左のプロパティウインドウで確認すると、コマンドボタンのオブジェクト名が「CommandButton1」ということが確認できます。

この「CommandButton1」というオブジェクト名を「データを取得」、Captionも「データを取得」に変更します。Captionを変更することで、ボタンの表示名が「CommandButton1」から「データを取得」に変更されます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

値リストで選択しているデータを取得するコードを、コマンドボタンに設定

[データを取得]ボタンをダブルクリックすると、コードウィンドウが表示され、下記コードが追加されています。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

「Private Sub 〇〇〇_Click()」に書いた処理は、〇〇〇をクリックした時に行われます。

Private Sub データを取得_Click()

End Sub

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

ここに[データを取得]ボタンをクリックした時の動作を追加します。

  • 「ListBox1」でデータが選択されていない時のダイアログ表示
  • 「ListBox1」で選択しているデータをダイアログ表示
Private Sub UserForm_Initialize() 
    Dim ary_d                  'リストに設定するデータ用配列 
    ary_d = Worksheets("サザエさん").Range("A2:D9")
    With ListBox1
        .ColumnCount = 4                '表示列数
        .ColumnWidths = "40;45;40;40"   '列幅
        .List = ary_d                   '参照範囲
    End With
End Sub

Private Sub データを取得_Click()
    If ListBox1.ListIndex = -1 Then
        MsgBox "何も選択されていません。"
    Else
        MsgBox ListBox1.List(ListBox1.ListIndex, 1)
    End If
End Sub
■■■スポンサーリンク■■■

ユーザーフォームを表示して動作を確認

このコード内にカーソルを置いたまま、[F5]キーをクリックすると(ユーザーフォームの実行)ユーザーフォームが表示されます。

配列に入れるデータの参照先にシート名が含まれていないと、アクティブになっているシートのセルデータが使用されるので注意が必要です。シート名を参照先に含めていない場合は、参照データのシートをアクティブにしてからマクロを実行してください。

ary_d = Worksheets("サザエさん").Range("A2:D9")

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

「配列」参照:セル範囲を一気に変数(配列)に入れる ~バリアント型(Variant)変数を配列として使用する~(Excel VBA)

メイン画面が表示されます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

値リストから「マスオ」さんを選択し、<データを取得>ボタンをクリックします。
選択しているデータの2列目「マスオ」さんがダイアログ表示されます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

ListIndex プロパティ

ListIndex プロパティには「値リストで選択しているデータの行位置(インデックス値)の取得」「指定した行位置(インデックス値)のデータ選択」の機能があります。

値リストで選択しているデータの行位置(インデックス値)の取得

リストボックスで選択しているデータの行位置(インデックス値)を取得することができます。データを選択していない場合のインデックス値は「-1」になります。

インデックス値は、1つ目の「サザエ」さんを「0」として数えます。「マスオ」さんはインデックス値「3」になります。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

参考:リストボックスで選択しているデータがリストの上から何番目(インデックス値)かを取得(Excel VBA)

指定した行位置(インデックス値)のデータ選択

リストボックスのリストから、指定した行位置(インデックス値)のデータを選択します。

ListBox1.ListIndex = 選択したいデータの行位置(インデックス値)

インデックス値は、値リストの一番上の項目を「0」として数えます。
「3」を指定すると、4つ目の「マスオ」さんが選択されます。

ListBox1.ListIndex = 3

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

また、インデックスに「-1」を指定すると、何も選択していない状態になります。

ListBox1.ListIndex = -1

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

Listプロパティ

値リストで指定した「行」「列」のデータを取得

Listプロパティと言えば、リストボックスに値リストを設定するプロパティなのでは?
(参照:リストボックスにListプロパティを使って配列に格納した複数列のセルデータを値リストとして設定(Excel VBA)

その他にListプロパティには、設定した値リストから「行」「列」を指定してデータを取得する機能もあります。

リストボックスオブジェクト.List(値を取得したい行,値を取得したい列

値を取得したい行:値リストの1行目を「0」として数えます。
値を取得したい列:値リストの1列目を「0」として数えます。

値を取得したい行値を取得したい列も、省略した場合は「0」が指定されます。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

今回は「値を取得したい行」に「ListBox1.ListIndex」を指定しています。
ListIndexプロパティは、リストボックスで選択しているデータの行位置(インデックス値)を取得します。インデックス値は、1行目を「0」として数えます。
(参照:リストボックスで選択しているデータがリストの上から何番目(インデックス値)かを取得(Excel VBA)

値を取得したい行=3
値を取得したい列=1

と指定しているので、結果は「マスオ」さんになります。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

データが選択されていないときの値

Listプロパティでデータを取得する際、値リストから何も選択されていないと下記エラーが表示されます。

実行時エラー '381':
Listプロパティの値を取得できません。プロパティの配列のインデックスが
無効です。

リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

値リストからデータが選択されていない場合、「ListBox1.ListIndex」は「-1」を返します。値リストの行に「-1」は無いのでエラーになります。

下記コードで、エラー回避をする必要があります。

If ListBox1.ListIndex = -1 Then
    MsgBox "データが選択されていません。"
Else
    MsgBox ListBox1.List(ListBox1.ListIndex, 1)
End If

【参考】

VBA(マクロ)作成の前、リボンに開発タブを表示させる(Excel VBA)
ユーザーフォームの作成方法 準備(Excel VBA)
ユーザーフォームのオブジェクトの名前を「UserForm1」から変更する方法(Excel VBA)
ユーザーフォームの上のバー(タイトルバー)の名前を「UserForm1」から変更する(Excel VBA)
ユーザーフォームのオブジェクトウィンドウとコードウィンドウを表示切替させる方法(Excel VBA)
「オブジェクト名が不正です」を出さないようにユーザーフォームオブジェクト名を命名規則に従って変更(Excel VBA)
エクセルファイルが開いた時にユーザーフォームを表示させる方法(Excel VBA)
エクセル フォームのラベルのテキストを縦書きにする方法(Excel VBA)
AddItemメソッドを使ってリストボックスの値リストを設定する(Excel VBA)
RowSourceプロパティを使ってセル範囲とリストボックスの値リストをリンク設定させる(Excel VBA)
RowSourceプロパティでリンク設定したリストボックス値リストにデータを追加・削除する(Excel VBA)
リストボックスにListプロパティを使って 配列に格納したセルデータを値リストとして設定する(Excel VBA)
既存のリストボックスの値リストにAddItemメソッドでデータを追加する(Excel VBA)
既存のリストボックスの値リストのデータを、Clearメソッドで全て削除して初期化する(Excel VBA)
既存のリストボックスの値リストの項目を1件 RemoveItemメソッドで削除する(Excel VBA)
リストボックス リストから初期値としてはじめに選択しておく値を設定する(Excel VBA)
リストボックスの値リストに設定された項目の件数を取得する(Excel VBA)
RowSourceプロパティを使って 複数列のセル範囲とリストボックスの値リストをリンク設定(Excel VBA)
リストボックスにListプロパティを使って配列に格納した複数列のセルデータを値リストとして設定(Excel VBA)
リストボックス 複数列の値リストの列幅を変えたり非表示にしたりする設定(Excel VBA)
リストボックスで選択しているデータがリストの上から何番目(インデックス値)かを取得(Excel VBA)
リストボックス 1列の値リストで選択しているデータをTextプロパティで取得(Excel VBA)
リストボックス 1列の値リストで選択しているデータをValueプロパティで取得(Excel VBA)
リストボックス 1列の値リストで選択しているデータをListプロパティで取得(Excel VBA)
リストボックス 複数列の値リストで選択しているデータを、列指定してTextプロパティで取得(Excel VBA)
リストボックス 複数列の値リストで選択しているデータを、列指定してValueプロパティで取得(Excel VBA)
リストボックス 複数列の値リストで選択しているデータを、列指定してListプロパティで取得(Excel VBA)

■■■スポンサーリンク■■■