リストボックスの複数選択された値を取得するには?

Question 49.11 Previous Next
500連発・第2弾No396について。
詳細は こちら ListBoxでの選択の仕方なんですが、 ListBox1.MultiSelect = fmMultiSelectSingle のような複数選択の場合、その後の処理の仕方で返された値をどのように格納して、SelectCaseなどの方法でふり分けるのでしょうか。
単数選択の場合は簡単なのでしょうが、手間取っています、教えていただけないでしょうか。 Excel2000を使っています。
Answer   Copyright (C) 2001.11.15 永井善王
500連発・第2弾をご活用いただき、ありがとうございます。
ご質問の 396番のサンプルは「リストボックスで複数選択の可否を設定する」と題する昆野憲一氏の作品です。
その内容は、
リストボックスに表示されたデータから選択する場合、希望のものを 1件だけクリックする方式が広く使われています。しかし、これと これと… と任意に複数件、あるいは、ここから ここまで と連続して何件かを選択したい場合もあります。そうゆうニーズに応えるために、MultiSelectプロパティの設定を変更することによって、リストボックスの選択方法を切り替えています。

リストボックス MultiSelectプロパティ
リストボックスで複数選択を許可するかどうかを設定します。
定数 内容
fmMultiSelectSingle 0 1つだけ選択できる (既定値)
fmMultiSelectMult 1 複数選択を許可する
fmMultiSelectExtended 2 拡張(連続)選択を許可する
拡張(連続)選択の操作方法は、説明の必要はないかも知れませんが、Shiftキーを押しながら始点行と終点行をクリック、または、始点行をクリックしておいてから Shiftキーを押しながら矢印キーを押すと、一連の項目を連続的に選択できます。項目の選択や選択解除を個別に行いたければ、Ctrlキーを押しながらクリックします。

あなたから監修担当の私宛に寄せられたご質問は、「その後の処理の仕方が知りたい」というもので、ご苦労されているようですのでサービスしちゃいます。
なお、右図は 396番に倣って以下の解説用に製作したものです。

1つだけ選択と複数または拡張選択とのマクロの違い
質問文には「単数選択の場合は簡単なのでしょうが・・」とありますが、複数選択ならば特別に難しくなる訳ではありません。要は 1つだけ処理するか、複数を反復処理するかの違いであって、こういう違いはマクロとしては日常的なことと言えましょう。
例えば、選択された値を取り出す場合、1つだけ選択ならば次のようなコードになります。
10  Range("D10").Value = ListBox1.List(ListBox1.Value, 0) '氏名
20  Range("E10").Value = ListBox1.List(ListBox1.Value, 1) '住所
複数選択ならば次のようです。
30  格納行 = 9                                  'ワークシートの9行目
40  For 選択行 = 0 To ListBox1.ListCount - 1    'リストボックスの0行から最終行まで反復
50      If ListBox1.Selected(選択行) Then       '選択されている行ならば
60          格納行 = 格納行 + 1                  'ワークシートへの格納順をカウントアップ
70          Range(Cells(格納行, 4), Cells(格納行, 4)).Value = _
                ListBox1.List(選択行, 0)        '氏名
80          Range(Cells(格納行, 5), Cells(格納行, 5)).Value = _
                ListBox1.List(選択行, 1)        '住所
90      End If
99  Next                                        '繰り返す
選択された値の取得と格納方法
リストボックスのような ActiveXコントロールを扱う場合、要望をかなえてくれるのは、どのプロパティ等かという思考が必要になります。
上記のコードは、わかり易くするために、いちいち
ListBox1 というオブジェクト名を付けて記述しています。その直後のピリオドの後の List とか Value とかがプロパティ等です。ListBox1.Value で「リストボックス1の値」となります。

リストボックスの主なプロパティ
機能 名称 構文
複数の列がある場合にデータソースを設定する BoundColumn object.BoundColumn [= Variant]
コントロール内の 1つまたは複数の項目を設定する Column object.Column( column, row ) [= Variant]
表示する列の数を設定する ColumnCount object.ColumnCount [= Long]
列の見出しを表示するかどうかを設定する ColumnHeads object.ColumnHeads [= Boolean]
各列の幅を設定する ColumnWidths object.ColumnWidths [= String]
リストの項目を設定したり、リストの値を取得する List object.List( row, column ) [= Variant]
リストの項目数を取得する ListCount object.ListCount
現在選択されている項目を取得する ListIndex object.ListIndex [= Variant]
複数選択を許可するかどうかを設定する MultiSelect object.MultiSelect [= fmMultiSelect]
リストのソースを設定する RowSource object.RowSource [= String]
各項目の選択状況を設定する、値を取得する Selected object.Selected( index ) [= Boolean]
選択されている行を変更する Text object.Text [= String]
選択されたときに Textプロパティに格納する列を設定する TextColumn object.TextColumn [= Variant]
コントロールの状態またはその内容を設定する Value object.Value [= Variant]
この表と、マクロコードの各行のコメントを参考にしながら、10行目から順に「そのコードは何をしているのか」を考えてみましょう。For...Next文、If文は、このページでは解説しませんが、必要ならば Search ページで簡単に見つかるはずですから、参考にしてください。

サンプルブック(xlsファイル 56KB)を用意しておきました。
ダウンロード して実際の動きを見ることができます。 ※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

Excel VBA Macro