Sub Hairetu_Sample1() Dim Arry(1, 12) As Variant Dim cnt As Long For cnt = LBound(Arry, 2) To UBound(Arry, 2) Arry(0, cnt) = Range("C3").Offset(cnt).Value Arry(1, cnt) = Range("D3").Offset(cnt).Value Next
For cnt = LBound(Arry, 2) To UBound(Arry, 2) Range("J3").Offset(cnt).Value = Arry(0, cnt) Range("K3").Offset(cnt).Value = Arry(1, cnt) Next End Sub
Sub Hairetu_Sample2() Dim Arry(12, 1) As Variant Dim cnt As Long For cnt = LBound(Arry, 1) To UBound(Arry, 1) Arry(cnt, 0) = Range("C3").Offset(cnt).Value Arry(cnt, 1) = Range("D3").Offset(cnt).Value Next
For cnt = LBound(Arry, 1) To UBound(Arry, 1) Range("J3").Offset(cnt).Value = Arry(cnt, 0) Range("K3").Offset(cnt).Value = Arry(cnt, 1) Next End Sub
平吹 敦史さんの投稿
(投稿ID: 2931)
好みの問題なのか、理由があるのか教えてください。
以下2つのsampleがあります。
結果はどちらも同じです。
違いは、配列変数の次元をどっちを先に書くかだけです。
先生の説明ですとsample1です。
個人的に理解しやすいのはsample2です。
理由は、行列のイメージに合うからです。
先生がsample1で指導される理由があり、今後の発展性も
踏まえて考えたときにどちらがベターか教えていただけると
助かります。
Sub Hairetu_Sample1()
Dim Arry(1, 12) As Variant
Dim cnt As Long
For cnt = LBound(Arry, 2) To UBound(Arry, 2)
Arry(0, cnt) = Range("C3").Offset(cnt).Value
Arry(1, cnt) = Range("D3").Offset(cnt).Value
Next
For cnt = LBound(Arry, 2) To UBound(Arry, 2)
Range("J3").Offset(cnt).Value = Arry(0, cnt)
Range("K3").Offset(cnt).Value = Arry(1, cnt)
Next
End Sub
Sub Hairetu_Sample2()
Dim Arry(12, 1) As Variant
Dim cnt As Long
For cnt = LBound(Arry, 1) To UBound(Arry, 1)
Arry(cnt, 0) = Range("C3").Offset(cnt).Value
Arry(cnt, 1) = Range("D3").Offset(cnt).Value
Next
For cnt = LBound(Arry, 1) To UBound(Arry, 1)
Range("J3").Offset(cnt).Value = Arry(cnt, 0)
Range("K3").Offset(cnt).Value = Arry(cnt, 1)
Next
End Sub
ゲストさんのコメント
(コメントID: 4401)
たしかに、興味深いですね。
こういう質問も大歓迎です。
二次元配列にデータを格納する際、僕は、意識して、以下のようにしています。
[a-1] 第一引数は、評価項目数に基づいて設定する
[a-2] 第二引数は、データ数に基づいて設定する
これには、第二引数のほうをデータ数にしたほうが良いという前提があるからです。
その前提は、VBAの以下の性質に示されています。
[b-1] ReDim ステートメントでは、配列の引数のうち、最後の部分のサイズしか変更できない。
[b-2] そもそも、ReDim ステートメントは、プログラム実行前に評価項目数が不明な場合ではなく、プログラム実行前にデータ数が不明な場合のための機能である
まずは、ここまで、いかがでしょうか。
ゲストさんのコメント
(コメントID: 4402)
説明が、あまり上手ではなかったな。。反省しました。
ということで、補足の投稿です。
「評価項目数に基づいて」というのは、エクセルシートで言えば、横方向に何列分だろうか?ということです。
「データ数に基づいて」というのは、エクセルシートで言えば、縦方向に何行分だろうか?ということです。
通常、エクセルでデータベースを作ると、項目数が増えれば増えるほど表は右方向に大きくなります。
また、データが増えれば増えるほど表は下方向に大きくなります。
ここで、マクロ実行前に項目数が分からないということは滅多にありません。
一方、データ数が分からないということは普通にあります。
ここで、データ数が分からないときのために、 ReDim があります。
そして、この ReDim は、配列サイズの、(二次元配列であれば)第ニ引数の値しか変更できません。
そのことが何を意味するのか?
僕は、「第二引数は、データ数を指定するために使え」という、VBの仕様を規定した人の暗示的な要求を感じるのです。
ということで、二次元配列を使って課題解決しようとするとき、僕は、配列の要素が展開されたエクセルシートのような表をイメージし、その表の横方向の列数を第一引数、縦方向の行数を第二引数にするよう意識します。
この考え方話は、 ReDim を使う必要のない局面では対して重要ではありません。というか、 ReDim が登場しない限り、配列変数の次元をどっちを先に書いても問題ない(*)です。
でも、 ReDim を使う局面ではとても重要です。
そして、ReDim を使うときのパターンを自分の中で決めているなら、前述のとおり、ReDim を使わないときには「配列変数の次元をどっちを先に書いても問題ない(*)」わけですから、「どっちを先に書くか?」といちいち考える手間を省くために、 ReDim を使う場合と同じやり方で行く、と決めています。
...という説明でどうでしょう。
(*) 厳密にはデータがメモリに格納されるときのメモリ内での順番が変わるので、パフォーマンスには微細な影響はあるかもしれません。でも、人間が知覚できるほどの差ではないです。
平吹 敦史さんのコメント
(コメントID: 4403)
なるほど、すっきりしました。
いろいろと疑問を持ち、思考錯誤することで知識の幅が広がるんですね。
丁寧にありがとうございました。
>平吹 敦史 さん:
説明が、あまり上手ではなかったな。。反省しました。
ということで、補足の投稿です。
「評価項目数に基づいて」というのは、エクセルシートで言えば、横方向に何列分だろうか?ということです。
「データ数に基づいて」というのは、エクセルシートで言えば、縦方向に何行分だろうか?ということです。
通常、エクセルでデータベースを作ると、項目数が増えれば増えるほど表は右方向に大きくなります。
また、データが増えれば増えるほど表は下方向に大きくなります。
ここで、マクロ実行前に項目数が分からないということは滅多にありません。
一方、データ数が分からないということは普通にあります。
ここで、データ数が分からないときのために、 ReDim があります。
そして、この ReDim は、配列サイズの、(二次元配列であれば)第ニ引数の値しか変更できません。
そのことが何を意味するのか?
僕は、「第二引数は、データ数を指定するために使え」という、VBの仕様を規定した人の暗示的な要求を感じるのです。
ということで、二次元配列を使って課題解決しようとするとき、僕は、配列の要素が展開されたエクセルシートのような表をイメージし、その表の横方向の列数を第一引数、縦方向の行数を第二引数にするよう意識します。
この考え方話は、 ReDim を使う必要のない局面では対して重要ではありません。というか、 ReDim が登場しない限り、配列変数の次元をどっちを先に書いても問題ない(*)です。
でも、 ReDim を使う局面ではとても重要です。
そして、ReDim を使うときのパターンを自分の中で決めているなら、前述のとおり、ReDim を使わないときには「配列変数の次元をどっちを先に書いても問題ない(*)」わけですから、「どっちを先に書くか?」といちいち考える手間を省くために、 ReDim を使う場合と同じやり方で行く、と決めています。
...という説明でどうでしょう。
(*) 厳密にはデータがメモリに格納されるときのメモリ内での順番が変わるので、パフォーマンスには微細な影響はあるかもしれません。でも、人間が知覚できるほどの差ではないです。
ゲストさんのコメント
(コメントID: 4404)
それは、良かったです。
ということで、当初の質問に対してさらに、ひとつ追加で。
>個人的に理解しやすいのはsample2です。
>理由は、行列のイメージに合うからです。
僕にとっては、僕のスタイルのほうがより行列のイメージにあっているのです。
参考までに数学で扱う「行列」は、英語では、「matrix」と言います。
日本語では「行→列」という順番で文字が組み合わさるので、行列を扱うとき、日本語話者は、インデックスの先に登場するもののほうが行、あとのほうが列についての指示かな?という予断を無意識に持ちがちです。
ですが、本来、どっちが先でどっちが後、というようなことはないわけです。
また、「他言語でも配列のサイズ変更にかかる仕様は同じだろう」という予断も禁物です。
プログラミング言語の実装は、その言語を開発したプログラマーの好みや開発当時の流行りに大きく影響を受けます。