• ベストアンサー

【VBA】for each文でListbox値取得

VBA7.1でfor each文を使い、Listbox(Lst1)の全ての値を 取得したいと思っています。 For Each 変数 In コレクションや配列 のコレクションや配列には何を指定したらよいでしょうか。 よろしくお願いいたします

noname#248391
noname#248391

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.1

これでいいのかどうか今ひとつわかりませんが Dim c As Variant With ListBox1 For Each c In .List If Not IsNull(c) Then Debug.Print c End If Next End With For Each ではなく普通にFor Next でいかがでしょう。 Dim i As Long With ListBox1 For i = 0 To .ListCount - 1 Debug.Print .List(i) Next End With

noname#248391
質問者

お礼

ありがとうございます。 おっしゃる通り普通にFor Nextでできました。

その他の回答 (1)

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

既に回答は出ていますが、 ーー 質問が荒っぽいように思う。特に下記の点。 ・.MultiSelect =が必要なはず。 ・選択決定がいつ終わったか、のタイミングを知らせる仕組み ーー Sheet1のA,B,C列にデータソースがあるとして 氏名 年齢 住所 山田 22 A 木村 34 B 今井 21 C 佐藤 31 D 岸田 46 E 河野 47 F 佃 51 G 君村 38 H 岡野 31 I 森 49 J ーーーー Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("Sheet1") With Me.ListBox1 .ColumnCount = 3 .ColumnWidths = "50;120;50" .ColumnHeads = True .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption .RowSource = sh.Range("A2", sh.Cells(Rows.Count, 2).End(xlUp)).Address End With End Sub のように、.MultiSelect = ・・が必要なはず。 ーー また、複数選択する仕組みを採る以上、選択決定が操作者側でいつ終わったか、知らせるために何か仕掛けが要るのでは。ここでは、コマンドボタンを1つ設けて使うことにする。 ーー Private Sub CommandButton1_Click() With UserForm1.ListBox1 k = 1 For i = 0 To .ListCount - 1 If .Selected(i) = True Then Cells(k, "D") = .List(i) k = k + 1 End If Next i End With End Sub D列セルに、選択されたリストを掲示することにした。 ーー WEB記事でもFor Each In XXXはあまり出てこないようだから、 上記 .ListCount でやった。

noname#248391
質問者

お礼

ありがとうございます。 複数選択はしません。 リストの内容を他のリストボックスに 全部表示することを考えていました。

関連するQ&A

  • for each の現在の配列ポインタ VBA

    for each で配列内の値をいじるマクロを組んでいるのですが 「今 配列内のどこを見ているのか」を取りだすにはどうすればよいのでしょうか for each c in range(~ の時には「今 range内のどこを見ているのか」は c.address をすればわかったのですが、配列となるとどうすればよいのか… お分かりになるかたいらっしゃったらよろしくお願いします

  • VBA For Eachの使い方

    For Each x In Range("A1:G1") このようなコードにおいて、A1からG1の全てに対して処理を行うのではなく、A1とC1とE1とG1に対して処理を行い、B1とD1とF1は飛ばして処理をしないようにするにはどうすれば良いですか?

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • For Each ~ Next の動作

    コレクションの操作をするときなどに、 For tmp in testCol   List1.Add tmp Next ってな感じでFor Each文をつかいますよね。 あれって、 For i = 0 To testCol.Count   List1.Add testCol.Item(i) Next i と書くのに比べ、びっくりするほど処理が速いですよね。 いったい、どんな違いがあるのでしょうか。

  • ACCESS listboxで選択した値を取得

    access2010のVBAでlistboxで選択した値を取得したいと思っています。 https://docs.microsoft.com/ja-jp/office/vba/api/access.listbox.itemdata を参考に、 Debug.Print  listbox1.ItemData(listbox1.ItemsSelected) としましたが、うまくいきません。 どのようにしたらよいでしょうか。 listboxは複数選択は特に許可していません。 よろしくお願いします。

  • For Each文内でのコレクションの変更について

    VB.Net/C# .NET Framework2.0で開発しております。 下記コード例のように、イテレータループ内(For Each文)でのコレクションの変更(要素の削除)ができないため、苦肉の策として下のように削除する予定のものを格納するバッファ(removeList)に一度登録し、その後もう一度ループをまわして実際に削除する、というコードを書いておりますが、分量も多くなり、一時変数なども出てくるため、あまりよいコードとは言えないと思います。 コレクションから特定の条件を満たした要素を削除するための、もうすこしスマートな書き方はないものでしょうか? 宜しくお願いいたします。 Dim removeList as new List(Of TestClass) For Each e as TestClass in targetList If e.IsDummy Then '直接targetList.Remove(o) とはできない removeList.Add(o) End If End For For Each e as TestClass in removeList targetList.Remove(e) End For

  • VBAのFor Eachのセル読み込み順番について。

    こんにちは。 VBAのFor Eachのexcelセル読み込み順番について お伺いします。 for each MjObj in range("A1:D10") ********** next とした場合にセルはA1を先頭に左から右列へ、 上から下行へと順次読み込まれますが、 この順番を変更することは出来るのでしょうか。 また、運用で誤って変更される可能は あるでしょうか。 以上、2点お伺い致します。 宜しくお願い致します。

  • VB.Net データ読み取りの For Each

    お世話になります。 .Net 駆け出しの者です。 下記のような場合(全く違う記述でもいいです)、SQLDr("項目名")で値を取得できると思うのですが、直に項目名を書かず変数で値を取得したいのと、While と For Each 文なんかを組み合わせて全レコード、全フィールドの値を取得したいのです。 下記で言いますと例えば2レコード 3項目 合計で6つの値があるとすると データ座標 1,1 が A 1,2 が B 1.3 が C 2,1 が D 2,2 が E 2,3 が F 結果的に A,B,C D,E,F このような形でデータを取得したいのです 何卒よろしくお願いいたします。 Dim SQLCon As SqlConnection = New SqlConnection(接続文字列) Dim SQLCmd As SqlCommand = New SqlCommand(SQL文, SQLCon) SQLCon.Open() Dim SQLDr As SqlDataReader = SQLCmd.ExecuteReader Dim value As Boolean value = SQLDr.HasRows 'True と仮定します     ’***********************************************************     ここからが質問です。 SQLDr("項目名")と記述すれば値を取得することは     わかるのですが、     直に項目名を書かず編集ですべての値を取得する記述の仕方をお教えくださいませ。     たとえば     Dim Cnt as Integer = 0     Dim CntField as Integer = 0     While SQLDr.Read()         For Each o As Read In SQLDr.Read             こんな感じで全データを抽出したいのです             こんな記述はないと思いますが             SQLDr(CntField) 変数で値を取得したいのです             2つの変数の値が座標データ             SQLDr(CntField)が値データになります。             CntField = CntField + 1 'フィールドの位置         Next       Cnt = Cnt + 1 'レコードの位置       CntField = 1     End While     ’*********************************************************** SQLDr.Close() SQLCon.Close()

  • フォーム上の全てのコントロールを取得したい

    フォーム上の全てのコントロールを取得したいです。 (サブフォームも含め) 自分なりにVBAで考えてみたのがこれです。 Sub test() Dim 数 As Long For Each 数 In Form_フォーム1.Controls.Count ’Debug.Print ? End If Next End Sub でもこれだけでもデバックしてみると 「コンハ゜イルエラー for Eachは、コレクション オブジェクトまたは配列でのみ繰り返しを実行します。」 となります。 答えを教えてください! よろしくお願いします。 (アクセス2003です)

  • エクセルVBAで For Each をまとめる方法

    ワークシート上にフォームで作成したチェックボックス、グループボックス、オプションボタンだけをまとめて削除するVBAです。 以下のように、種類ごとに分けて記述することは出来るのですが、3種類まとめて書く方法がわかりません。 CheckBoxes,GroupBoxes,OptionButtons と並べてもだめのようです。 ご教示ください。 Sub delete_test() With ActiveSheet For Each cb In .CheckBoxes cb.Delete Next For Each gb In .GroupBoxes gb.Delete Next For Each ob In .OptionButtons ob.Delete Next End With End Sub

専門家に質問してみよう