Sub sample9() > For c = LBound(vList, 1) To UBound(vList, 1) とありますが、なぜ1なのでしょうか? 2次元配列の場合は For c = LBound (vList, 2)To UBound(vList, 2) と2次元であることを表示するものと理解していました。
Sub Sample9_ref()
Dim vList As Variant
vList = Range("B4").CurrentRegion
Debug.Print UBound(vList, 1) '一次元目のインデックスの最大値を返す
Debug.Print UBound(vList, 2) '一次元目のインデックスの最大値を返す
End Sub
Sub Sample9_1() 'Modified by Hiroaki Tanaka
Dim vList As Variant
'タイトルを除いてデータのみ取得
' セルA1を含む表のセル範囲を1行下にOffsetし、
' セル範囲のサイズを「行数 - 1」行にResizeして範囲指定
With Range("B4").CurrentRegion
vList = .Offset(1).Resize(.Rows.Count - 1)
End With
Dim c As Long
'インデックスは1から!
'第一引数が行番号!
'二次元配列の中身にタイトルは含まれません。
For c = LBound(vList, 1) To UBound(vList, 1)
Debug.Print vList(c, 1), vList(c, 2), vList(c, 7)
Next
End Sub
三橋さんの投稿
(投稿ID: 5364)
Sub sample9()
> For c = LBound(vList, 1) To UBound(vList, 1)
とありますが、なぜ1なのでしょうか?
2次元配列の場合は
For c = LBound (vList, 2)To UBound(vList, 2)
と2次元であることを表示するものと理解していました。
確かに
For c = LBound (vList, 2)To UBound(vList, 2)
で試してみるとdebug.Printが
>No. 取引先名称 取引金額
> 1 愛知販売 100
>2 岐阜商会 200
>3 岐阜商船 300
> 4 愛媛不動産 400
> 5 横浜航空 500
>6 岡山百貨店 600
と途中で止まってしまうようです。
基本的な理解が足らないのか?と思いつつ
もやもやするため質問させていただきました。
よろしくお願いします。
田中 宏明さんのコメント
(コメントID: 7723)
私はオンライン受講生ですが、回答させていただきます。
UBound関数やUBound関数の第二引数は、どの次元の最小または最大の
インデックスを取得するか指定するものです。
>なぜ1なのでしょうか?
2次元配列の1次元を指定する場合1で、2次元を指定する場合2となります。
小川 慶一さんのコメント
(コメントID: 7724)
>For c = LBound(vList, 2)To UBound(vList, 2)
>と2次元であることを表示するものと理解していました。
ここが違います。
LBound関数の第2引数は、「○次元であることを表示する」ためのものではありません。
「多次元配列の、何次元について調べるか」を指定するためのものです。
動画の 1:23 のことろで、変数 vList に値を格納していますね。
そして、ウォッチウィンドウには、変数 vList の状態が見えています。
動画の 1:31 にかけて、 vList(1), vList(2), vList(3), ... の内容をさらに詳しく表示しています。
以下の、二次元配列 vList のそれぞれの要素が見えますね。そして、それぞれにどんな値が入っているかも確認できるかと思います。
vList(1, 1), vList(1, 2), vList(1, 3), vList(1, 4), vList(1, 5), vList(1, 6), vList(1, 7)
vList(2, 1), vList(2, 2), vList(2, 3), vList(2, 4), vList(2, 5), vList(2, 6), vList(2, 7)
...
vList(8, 1), vList(8, 2), vList(8, 3), vList(8, 4), vList(8, 5), vList(8, 6), vList(8, 7)
vList(9, 1), vList(9, 2), vList(9, 3), vList(9, 4), vList(9, 5), vList(9, 6), vList(9, 7)
(ご自身でも、サンプルコードを動かしつつ、ウォッチウィンドウで同様に確認してみてください)
これを改めて見ても分かるとおり、 vListは二次元配列です。
そして、インデックスのサイズ以下のとおり。
1次元: 最小値は1、最大値は9
2次元: 最小値は1、最大値は7
ここで、以下のコードを実行すると、それぞれ、 9, 7 を得られます。
なぜなら、上述したとおり、 Ubound 関数の第二引数は、「多次元配列の、何次元について調べるか」を指定するためのものなので、
第二引数に 1 を入れたときには、一次元目の最大値9を
第二引数に 2 を入れたときには、二次元目の最大値7を
返すからです。
まずは、この説明でいかがでしょうか。
以下で復習されると良いかと思います。
多次元配列の基本
https://forum.pc5bai.com/lesson/page/694/
多次元動的配列
https://forum.pc5bai.com/lesson/page/695/
多次元配列のサイズを調べる
https://forum.pc5bai.com/lesson/page/696/
三橋さんのコメント
(コメントID: 7764)
小川先生
返信ありがとうございます。
そして返信の返信が遅れてしまい申し訳ありません。
よくわかりました。
あー、やっぱり理解の仕方が間違っていたのですね。
田中さんと小川さんのコメントをもとに改めて確認をしてみて
自分の理解に何が足らないのかよくわかりました。
原則は理解できたものの、実際の運用の際に確実にコードが書けるように
発展2の講座で出てきたサンプルコードや演習問題を今一度やり直してみようと思います。
ありがとうございます。もやもやが晴れました。助かりました。
小川 慶一さんのコメント
(コメントID: 7766)
多次元配列は抽象度も高く、ハマりどころです。
理解を整理したうえで演習をこなすと実感高まると思います。
ひきつづき、よい学びを v(^^*
田中 宏明さんのコメント
(コメントID: 7767)
実務で使いこなせるようになると便利ですよ。
多次元配列の基本を復習し、もう一度ここに戻ってきてください。
少しコード足すと、タイトルを除いてデータ取得できます。
三橋さんのコメント
(コメントID: 7779)
田中様
コメントありがとうございます。
配列は分かった気になって演習をしてみると「あれ??」となることがあるため
時間がかかってもちゃんと運用できるように講義と演習をしつこく繰り返したいと思います。
田中様
貴重なコード有難うございます。
お宝コード集の中に追加させてもらいます。