質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

12048閲覧

vbaのリストボックスとListCoutの動作

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/11/21 00:48

お疲れ様です。pipiでございます。
vbaとexcelの連携が頭の中でごちゃごちゃの状態でございます。

.ListCountはリスト内の単純に行数を求めるとのことですが、いきなりリストボックス内の合計行数が求められるわけではないのでしょうか?

以下、エクセルの各行の値をリストボックスに反映させる部分のプログラムですが、

LastRow = Range("A600").End(xlUp).Row For i = 2 To LastRow .AddItem Cells(i, 1).Value Debug.Print i Debug.Print .ListCount .List(.ListCount - 1, 1) = Cells(i, 2).Value .List(.ListCount - 1, 2) = Cells(i, 3).Value .List(.ListCount - 1, 3) = Cells(i, 4).Value .List(.ListCount - 1, 4) = Cells(i, 5).Value .List(.ListCount - 1, 5) = Cells(i, 6).Value .List(.ListCount - 1, 6) = Cells(i, 7).Value Next End With

debug.print で.ListCountを見てみたとき、
i=2のときは、ずっと1
i=3のときは、ずっと2
i=4のときは、ずっと3
i=7のときは、ずっと6となり、リストボックス内の行数6行と一致しております。

.ListCountでリスト内の行数を求めるといっても、結局はfor文でループさせて求める
ものなのでしょうか?.ListCountは、一発でリストボックス内の行数が求められると
思っていたもので・・・・。

イメージ説明

どなたかご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

.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プロパティのそれぞれの意味は理解できませんか?

投稿2015/11/21 03:58

hatena19

総合スコア34064

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

.ListCountでリスト内の行数を求めるといっても、結局はfor文でループさせて求める
ものなのでしょうか?.ListCountは、一発でリストボックス内の行数が求められると
思っていたもので・・・・。

Forループでやってる

vba

1.AddItem Cells(i, 1).Value

を忘れていませんか?

AddItemで今回追加されたListItemを指すために
.ListCount-1
を使っているだけです

今回のコードでは**.ListCount-1**行目が新しく追加された行を指し

vba

1 .List(.ListCount - 1, 1) = Cells(i, 2).Value 2 .List(.ListCount - 1, 2) = Cells(i, 3).Value 3 .List(.ListCount - 1, 3) = Cells(i, 4).Value 4 .List(.ListCount - 1, 4) = Cells(i, 5).Value 5 .List(.ListCount - 1, 5) = Cells(i, 6).Value 6 .List(.ListCount - 1, 6) = Cells(i, 7).Value

の一連のコードで新しく追加された行の各列に値を設定している

余談ですが

vba

1 i=1 '何個目のListItemを処理しているか/A1から何行目のセルを見ているか 2 Do While Range("A1").Offset(i,0)<>"" 'A列になにか値がある間は実行 3 'ListItemを1個(1行)追加 4 .AddItem Range("A1").Offset(i,0).Value 5 6 '追加した行の各列に値を設定 7 .List(i, 1) = Range("A1").Offset(i,1).Value 8 .List(i, 2) = Range("A1").Offset(i,2).Value 9 .List(i, 3) = Range("A1").Offset(i,3).Value 10 .List(i, 4) = Range("A1").Offset(i,4).Value 11 .List(i, 5) = Range("A1").Offset(i,5).Value 12 .List(i, 6) = Range("A1").Offset(i,6).Value 13 14 i=i+1 '次のListItem/A1から何行目のセルを見ているかを次の行にする 15 Loop

ちゃんと書けているかわかりませんが...

投稿2015/11/21 01:05

編集2015/11/21 01:40
dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/11/21 01:21

.AddItem Cells(i, 1).Valueは、エクセルの行と列を見ているだけではないのですか? 2行目1列目、3行目1列目と・・・・ .addItemはリストボックス内にリストを追加するとは、ありますが、結局どのように追加しているのかまったくわかりません。 色々と調べていますが、addItemはリストボックス内にリストを追加するというていどしか記載されておらず・・・ 結局、addItemとListCountが全く動作が分からん状態で、さらに混乱してきてしまっています。
dojikko

2015/11/21 01:43

- AddItem:アイテムを増やす(ListBoxの選択肢を増やす) - ListCount:アイテムの数を数える(ListBoxの選択肢を数える)
退会済みユーザー

退会済みユーザー

2015/11/21 13:15

結局、 .AddItem Cells(i, 1).Valueっていうのが、リストボックス内にリストを追加するだけであれば、.AddItem iとか、.AddItemだけでもようのではないでしょうか? なぜ .AddItem Cells(i, 1).Valueとしているのでしょうか? セルの2行1列目を追加をリストボックス内に1行追加するためでしょうか? 今日一日考えましたが、全くわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問