web-dev-qa-db-ja.com

VBA Excelは複数の列でリストボックスを作成します

これは安っぽい質問かもしれませんが、リストボックスへの入力方法について完全に混乱しています。

form with listbox

この行を使用して、以下に示すようにリストボックスを作成できます。
ListBox1.List = Sheets("Sheet1").Cells(1, 1).CurrentRegion.Value
または

Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
    For i = 1 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row Step 1
        If ws.Cells(i, 1).Value <> vbNullString Then Me.ListBox1.AddItem 
        ws.Cells(i, 1).Value
Next i

form with listbox 1 column output

以下は、リストボックスの作成に使用する予定のデータであり、プログレッシブです。列のみに修正カウントがあります。
Data

上記のコードに示すように、FOR LOOPを使用して、複数の列と行に対応するリストボックスを作成する方法について誰かに教えてください。助けてくれてありがとう。ありがとう。

4
Serversta

メソッド

  1. 範囲よりも配列をループする方が常に優れています-それははるかに速いです。
  2. Siddharth Routによって提案されているように、事前宣言された配列を再次元化して追加のループに埋め込む代わりに、one linerを使用してバリアントデータフィールド配列を作成する方が高速です(優れた方法:-)注:以下のコードは、違いを示すためだけに、上のコメントで参照されている彼のアプローチに基づいています。
  3. _ListBox1.List_に配列を入力します(同じ方法ですが、方向が逆です)。

コード

_Private Sub CommandButton1_Click()
' Purpose:  fill listbox with range values after clicking on CommandButton1
'           (code could be applied to UserForm_Initialize(), too)
' Note:     based on @Siddharth-Rout 's proposal at https://stackoverflow.com/questions/10763310/how-to-populate-data-from-a-range-multiple-rows-and-columns-to-listbox-with-vb
'           but creating a variant data field array directly from range in a one liner
'           (instead of filling a redimensioned array with range values in a loop)
Dim ws      As Worksheet
Dim rng     As Range
Dim MyArray                 ' variant, receives one based 2-dim data field array
'~~> Change your sheetname here
Set ws = Sheets("Sheet1")

'~~> Set you relevant range here
Set rng = ws.Range("A1:C" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

With Me.ListBox1
    .Clear
    .ColumnHeads = False
    .ColumnCount = rng.Columns.Count

    '~~> create a one based 2-dim datafield array
     MyArray = rng

    '~~> fill listbox with array values
    .List = MyArray

    '~~> Set the widths of the column here. Ex: For 5 Columns
    '~~> Change as Applicable
    .ColumnWidths = "50;50;50"
    .TopIndex = 0
End With
End Sub
_

追加のヒント

  • 配列メソッドのもう1つの利点-_.AddItem_メソッドを使用すると、組み込みの制限10列だけが克服されます。

  • さらに、リストボックスのインデックスはゼロベースであることを覚えておいてください。たとえば、最初のアイテム行(インデックス0)の電子メールアドレス(列3、インデックス2)を取得します。 ListBox1.List(0, 2)を使用しますが、データフィールド配列は自動的に1ベースの2次元配列になります。

  • _.List_メソッドを使用してリストボックスから情報を取得するように制限されていません。_ListBox1.Column" or even create a new array out of it, which remains a 2-dim object, even if there is only ONE item (note: the_ Application.Transpose`メソッドを使用して行の列の順序を逆にすることができます。 1次元配列への行)。

  • 最後のポイント:_rng = ListBox1.List_を使用してリストボックス全体を簡単にExcelシートに再度ダンプできますが、正しい範囲を定義するように注意してください。

8
T.M.

これはどう:

Sub foo()
Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
ListBox1.Clear
ListBox1.columnCount = 3
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 1 To LastRow
        If ws.Cells(i, 1).Value <> vbNullString Then ListBox1.AddItem ws.Cells(i, 1).Value
        If ws.Cells(i, 2).Value <> vbNullString Then ListBox1.List(i - 1, 1) = ws.Cells(i, 2).Value
        If ws.Cells(i, 3).Value <> vbNullString Then ListBox1.List(i - 1, 2) = ws.Cells(i, 3).Value
    Next i
End Sub
2
Xabier