• 締切済み

ExcelVBAのLISTBOXから複数行選択された項目を取得する方法

タイトルのとおりなのですが、 ListBoxで、MultiSelectのプロパティを設定後に、 実際の動作で選択された全ての項目を取得する方法を教えてください。 自分でも探してはおりますが、もしよろしければ ご指導いただけますと幸いです。 くれぐれも、~を見れば分かるでしょ…などといった 中傷的なご返答はご遠慮願います。 よろしくお願いいたします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

回答の簡単のために、ワークシートにリストボックスを1つ貼り付け プロパティで-1 fmMultiSelectMulti を選ぶ。 ListFilRangeにセル範囲を設定しておく。(注)1行空白行をしておく。 回答の簡単のために、リストボックスの DblClickイベント(注)に Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim lItem As Long For lItem = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(lItem) = True Then Sheet1.Range("A65536").End(xlUp).Offset(1, 0) = ListBox1.List(lItem) ListBox1.Selected(lItem) = False End If Next End Sub これで複数選択し、リストボックスの余白行(注)をダブルクリックすると、A列に選択したものが、累積入力される。 (注)あまり自然な設例ではなかったと反省するが、上記コードの回答がメインなので、このままにします。

tatapata
質問者

お礼

imogasiさん、ありがとうございました。 頂いた解答をもとに、いろいろ調べてみましたが、 やはりforでまわしながら、selectedで一つずつ見ていくしか ないみたいですね。 JavaでもgetSelectedValuesのような、配列で一気に取得できる 関数でもあれば…と思ったのですが。 今後も、何かありましたら宜しくお願いいたします。

回答No.1

気になったので一言。 > くれぐれも、~を見れば分かるでしょ…などといった > 中傷的なご返答はご遠慮願います。 考える力、調べる力をつけてもらいたいし、そうしたほうが tatapata さんにメリットがあると思うからこそ、調べ方を回答してくれる人がいるのですよ。 それを中傷ととってしまってはそこで終わってしまいますよ。 ----------------------------------------------- フォームのデザイン画面で ListBox を選択し、プロパティ ウィンドウの MultiSelect の項目を選択したら [F1] を押してヘルプを表示させます。 MultiSelect の説明の <解説> に MultiSelect プロパティが frmMultiSelectExtended または frmMultiSelectSimple に設定されている場合に、選択されている項目を調べるには Selected プロパティを使う必要があります。 と書いてあります。 ヘルプ上部の <関連項目> をクリックすると <該当するトピック> に「Selected」があるので選択して [OK] をクリック。 一通り目を通せば Listbox1.Selected() のカッコに項目のインデックス番号を与えればその項目が選択されているか True/False で取得できることがわかります。 <使用例> をクリックすると 選択されているか調べるには For i = 0 To 9  If ListBox1.Selected(i) = True Then   ListBox2.AddItem ListBox1.List(i)  End If Next i というサンプルが見つかります。 この事から、選択された項目を調べるには全項目をループさせながら Selected(インデックス番号) で調べる必要があり、項目の値は List(インデックス番号) で取得できることがわかります。 しかしこのサンプルでは 0~9 というように、ListBox1 の項目数が 10個であることが最初から決まっているので少々実践的ではありません。 汎用的にするためには「項目がいくつあるのか」を動的に取得したほうがよさそうです。 ListBox のプロパティを一通り眺めていると(コード画面で "ListBox1." と入力して出てくる入力候補一覧を眺めてみる) ListCount というプロパティが目に付きます。 ListCount のヘルプを見てみると 「コントロールのリストの項目数を返します」 とありますので、これが使えるのではないだろうか、と期待できるわけです。 もう少し読み進めてみると <解説> に「・・・インデックス番号が 0 から数えられるのに対して、項目数は 1 から数えるためです。」というような記述があるので、 ListBox の項目が 10個の場合、 ListCount の結果は 10だが、インデックス番号が 0 から始まるので 1番目の項目を示す場合は Selected(0) や List(0) とし、10番目の項目の場合は Selected(9) や List(9) とすれば良いんじゃないか、と考えられます。 で、For Next を改造することを考えた結果、 For i = 0 To ListBox1.ListCount -1  If ListBox1.Selected(i) = True Then   ListBox2.AddItem ListBox1.List(i)  End If Next i と書くことに行き着くと思います。 ----------------------------------------------- 「MultiSelect プロパティのヘルプを見れば?」と回答されたなら、それを「ひどい回答だ」と思わず、上記のような手順で考えていけば自分なりの正解にたどり着くわけです。 「ひどい回答だ」では技術者としての進歩は止まってしまいます。

tatapata
質問者

補足

気になったのでご返答いたします。 あの~、そもそも本当に相手の為…ということなのでしょうか。 どうしても早急に対応しなければならないことがあり、 自分でも調べてもなかなか見つからないため、他の方のご助力を 得ようとしているのであり、のんびりと答えを探している時間があれば、 そもそも質問なんか投げませんよ。 それに、私は助けてほしいとお願いしているわけであり、 一流の技術者になりたいから指導してくれといっているわけでは ないのですが…。どうもそのあたりがご理解いただけなかったようですね。 断っておきますが、私は技術者でなければ、技術者になる気もありません。 >「ひどい回答だ」では技術者としての進歩は止まってしまいます。 という意見自体、何か食い違っていると思われます。 このサイト自体、技術者の意見交換会のサイトではありませんし…。 私が言いたかったのは、同じく調べれば解る事ということであっても、 もっと違う言い方があるのでは…ということです。相手を罵るような 言い回しをして、 >考える力、調べる力をつけてもらいたいし なんていわれても、誰もそうは思わないというわけです。 temtecomai2さんは、かなりの技術者のようですが、是非とも相手の 立場の解る人間にもなっていただきたいと、切に思います。

関連するQ&A