• 締切済み

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

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

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

  • リストボックスからの複数選択

    初心者です。 ListBoxで複数の項目を選択することは可能でしょうか? ListBoxのプロパティ MultiSelect を 標準or拡張 にすると 複数選択できることは分かりましたが、選択(強調表示)した 値のみを取得するにはどうしたらよいのでしょうか?

  • VB.NETのListBoxで指定した項目のValueを取得する方法

    ListBoxで現在選択している項目のValueを取得する方法はわかるのですが、X個目のValueの値を参照、設定する方法がわかりません。教えてくださいー

  • ListBoxの選択した項目を削除したら、DBの同じデータの行も削除を

    ListBoxの選択した項目を削除したら、DBの同じデータの行も削除をしたいです。 環境:XP-Pro/VB2005/SQLServer2005 簡単なSchedule管理ソフトを作成しています。 画面には左側にMonthCalendar、開始時間を表示するDomainUpDown、件名、内容を入力するTextBoxと登録ボタンがあり、左側にListBox、その下に修正ボタン、削除ボタンが配置してあります。 登録ボタンを押すとListBoxに内容が表示されると同時にDBにデータが保存されます。 DBのテーブル:Shortは startdate(日付) DateTime start(開始時間) varchar(50) subject(件名) varchar(50) contents(内容) varchar(50) *日付と開始時間は複合主キー 今回は登録した項目を選択して削除ボタンをクリックしたら、DB内の同じ内容も削除するという動作です。 分からない部分はDBに接続してコネクションを定義した後のSQLステートメントです。 現在は、 connection.Open() Command.CommandText = "DELETE FROM Short WHERE start = '" & ListBox1.SelectedIndex &"'" Command.ExecuteNonQuery connection.Close() となっています。が削除されませんでした。 SQLステートメントで"ListBoxの選択している項目と同じ行"というようにWHERE句で定義したいのですが分かりません。 ご指導よろしくお願いいたします。

  • [VB2008]リストボックス内の複数選択された項目を削除したい

    タイトルの通り、リストボックス内の複数選択された項目を削除したいのですが どうすればいいでしょうか? 下記のコードを組んでみましたが動作しませんでした。 Dim SelectItem As Object Dim ItemList As String = "" For Each SelectItem In Me.ListBox1.SelectedItems Me.ListBox1.Items.Remove(SelectItem.ToString()) Next ご回答お願いします。

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • BASIC ListViewの選択された行番号を取得

    ActiveBasic4.23.00を使用しています。 ListViewで、ボタンを押すと選択されている行の番号(ListBoxで言うところのLB_GETCURSEL) を取得したいのですが、それらしい項目が見当たりません。 ご存知の方がいらっしゃいましたら、ご教授ください

  • CListBoxで選択した順番で項目を取得

    Visual C++ 2013でMFCを利用しています。 CListBoxのSelectionプロパティを「拡張」にして、複数選択可能にしています。 Ctrl + マウスクリックで例えば項目番号0,2,1の順番に選択したとします。 GetSelItems()で選択されている項目リストを取得すると、昇順(例の場合は0,1,2)で返ってきてしまいます。 選択した順番どおりに項目番号を得るにはどういった方法がありますか?

  • FileListBoxでの複数ファイル選択

    FileListBoxコントロールのMultiSelectプロパティを「2-拡張」にして、 CtrlやShiftを併用することでファイルを複数選択できるようにしました。 とりあえず動作確認段階なので、ファイル選択状態でCommandButtonを押下することで、ファイル名を表示するようにしたいのですが、 Msgbox (File1.FileName) ※File1はFileListBoxコントロール名 では、当たり前の事ながら、(複数選択したうちの)1ファイルしか表示されません。FileNameプロパティにインデックスを付けるなど素人考えで色々当たってみたのですが、どうも上手くいきません。 選択した全てのファイル名をフルパスで取得したいのですが、何かいいテクニックはないでしょうか?

  • DataGridViewの、選択されている行を取り出したい

    いつもお世話になっております。 DataGridViewに関して、選択されているレコードをDataRow型で別フォームに渡してから、各項目をテキストボックスに表示したいのですがうまくいきません(DataRow型にこだわっているわけではないのですが、レコード1件丸ごと取得する型を他に知らないので例として挙げました)。 DataGridViewのCurrentRowプロパティや、SelectedRows(0)をDataRow型に代入する試みをしましたが、型変換できませんでした。 DataGridViewで選択されているレコード一件まるごと変数に渡す方法というのはあるのでしょうか? ちなみに、SelectionModeはSelectFullRowに、MultiSelectはFalseにしてあります。 ご存知の方ご教授いただけると助かります。 よろしくお願いします。

  • ListBoxを数字Keyで選択したい

    お世話になります。 OSはWin XP Home、Excel2002を使用しています。 EXCELのsheet1にCommandButton1とListBox1を貼り付けて以下のようにコーディングしています。 'Listbox1表示 Private Sub CommandButton1_Click() ListBox1.Visible = True End Sub '使用者はリストボックスのダブルクリックでリストボックスの入力ができる。 Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) ListBoxDataSet End Sub '使用者はリストボックスでマウスで選択後EnterKeyで入力ができる。 Private Sub ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = vbKeyReturn Then ListBoxDataSet KeyAscii = 0 '←これがないとなぜかEXCELが異常終了するので注意! End If End Sub 'リストボックスで選択したリストを、シートの選択セル(単一)に転記し、 'その後でリストボックスを非表示 Sub ListBoxDataSet() ActiveCell.Value = ListBox1.Text ListBox1.Visible = False End Sub さらにListBox1のプロパティのListFillRangeはA1:B100としており、A列は1から100の連番、B列は上から順に「中山」、「常盤」、「高島」・・・98番目には「吉岡」という名前があります。 現在A列の数字は表示以外の機能は持っておらず、ダブルクリックか、マウスで1クリックで項目選択をした後にEnterKeyで名前だけがActivecellに転記されるようになっています。 100件もの項目をひとつのリストボックスには表示しきれず、スクロールバーで探すのも大変なので、例えば数字Keyで1と打てばすぐに「中山」が選択され、さらにEnterKeyで転送される、98と打てば「吉岡」が選択され・・・という風に機能追加したいのです。 いろいろ調べましたが、方法が分かりませんでした。 よろしくお願いします。

専門家に質問してみよう