.AddItem Cells(i, 1).Valueは、エクセルの行と列を見ているだけではないのですか?
2行目1列目、3行目1列目と・・・・
エクセルのワークシートとリトスボックスは同じようなものであると誤解しているのでは。
エクセルのワークシートは開いた直後から、最大行数、最大列数が確保されていて、どこにも入力できます。
が、リストボックスはそうではありません。開いた直後は、行数は0です。列数は、ColumnCountプロパティで設定した数だけです。
初期状態の行数0のリストボックスに、行(データ)を追加する方法はいろいろあります。
addItem は1行ずつ追加していきます。
vba
1With ListBox1
2 Debug.Print .ListCount '0
3
4 .AddItem "データ1"
5 Debug.Print .ListCount '1
6
7 .AddItem "データ2"
8 Debug.Print .ListCount '2
9
10 .AddItem "データ3"
11 Debug.Print .ListCount '3
12End With
一度にデータを追加する方法もあります。
Listプロパティは配列なので、それに配列を代入できます。
vba
1 With ListBox1
2 ListBox1.List = Array("配列1", "配列2", "配列3")
3 Debug.Print .ListCount '6
4 End With
上記は、Array関数で配列を生成して代入してますが、Range も配列なので、それを一気に代入することもできます。今回の質問のコードなら、下記のコードでも同じ結果になります。
vba
1 With ListBox1
2 ListBox1.List = Range("A2:G7").Value
3 Debug.Print .ListCount '6
4 End With
データ(行)を追加した後、その行の列を更新, 参照する場合は、Listプロパティを使用します。
vba
1With ListBox1
2 Debug.Print .ListCount '0
3
4 .AddItem "" '1行追加
5 .List(0,0) = "1行目1列目"
6 .List(0,1) = "1行目2列目"
7 .List(0,2) = "1行目3列目"
8 Debug.Print .ListCount '1
9
10 .AddItem "" '1行追加
11 .List(1,0) = "2行目1列目"
12 .List(1,1) = "2行目2列目"
13 .List(1,2) = "2行目3列目"
14 Debug.Print .ListCount '2
15
16End With
Listプロパティは2次元配列になっていて、インデックスは0から始まります。
行を追加せずに、行数以上の範囲をListで参照すると「インデックスは無効です」というエラーになります。
vba
1With ListBox1
2 Debug.Print .ListCount '0
3
4 .AddItem "" '1行追加
5 .List(0,0) = "1行目1列目"
6 .List(0,1) = "1行目2列目"
7 .List(0,2) = "1行目3列目"
8 Debug.Print .ListCount '1
9
10' .AddItem "" '1行追加 'ここをコメントアウトすると
11 .List(1,0) = "2行目1列目" 'ここでインデックス無効エラー
12 .List(1,1) = "2行目2列目"
13 .List(1,2) = "2行目3列目"
14 Debug.Print .ListCount '2
15
16End With
これらのコードの意味が理解できたら、 AddItemメソッド、List、ListCountプロパティのそれぞれの意味は理解できませんか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。