2次元配列さんとRedim_VBA
こんばんは!
いつかと思っていた、いつかが来てくれました☆
VBAの2次元配列での、失敗談からの~解消話、どなたかの参考になれば、
範囲選択で一括で、配列に放り込むと、さくっと、 2次元配列を作ってくれます!
これは本当~に便利ですよね(^^♪
◆ arr = Range("A1:C3") ← Dim arr as variant
Range("A1") ⇒ arr(1,1)
Range("A2") ⇒ arr(1,2)
Range("A3") ⇒ arr(1,3)
Range("B1") ⇒ arr(2,1)
Range("B2") ⇒ arr(2,2)
Range("B3") ⇒ arr(2,3)
Range("C1") ⇒ arr(3,1)
Range("C2") ⇒ arr(3,2)
Range("C3") ⇒ arr(3,3)
VBAの1つの壁と思われることのある、配列ですが、
入門書で、配列の説明がされるときは、「箱&ボール」 が使われることが多いようです。
まず、1つの箱にボールが入れられます。
そして、次の絵では、横にいくつか並べた箱に、 それぞれボールが入れられます。
そして、それを、1次元配列として説明されます。
そして続いて、多次元配列の説明の最初の2次元の説明として、 その横並びの箱が、
縦に複数並べられます。
そして、2次元がその箱の縦横セットとして、 その1段の箱を重箱のように重ねていくと、
3次元の配列と言えますが、
通常、紙面の都合上等大人の事情で、 3次元以上の多次元配列は使わないから考えても無駄、
と説明はここで終わるところです。
ある時まで、なるほど、そうだよね、としてきました。
配列が使えると、 動作がとても軽くなることを教えてもらいましたので、
どんどん使っていこうとしていましたが、
しかし、毎回、つまずくところがありました。
冒頭の範囲選択でね一括で配列に投入するテクニック前に出てくる話と して、
「for next ⇒Redim Preserve」がありますが、
この時に、どうしても、 「最終行」を可変にして、データを入れようとしていました。
「おお、『Redim Preserve』って便利なのがあるんだ!これで、 どんどん配列使えるぞ」
と思ったのでした。
そのため、最初は、配列へのデータ追加でループで扱うとき、
for r = 1 to XX ⇒ redim preserve arr(r-1,columns("F:F"))
として、『XX』を「『最後の次元』の要素数」として、 扱おうとしていました。
しかし、みなさんお察しのとおり、見事エラーになります6(^^; )
そして、エラーになる都度、ネットで調べた原因は、「『 最後の次元』の要素数しか変えられない」
と言うことでしたが、
これが、いま一つ分からずに、 何回も同じエラーコードを作ってしまっていました。
そこで、ある時、考えてみました。
『表』を扱うとき、配列に「データを入れたい」と思ったら、 まず行の1レコードを
順番に入れたいと思います。
どうもこの1レコ-ドを、観念的に、『1次元』 としてとらえていたようでした。
そして、このレコード単位を、加えて使っていきたい、 と言うことを、
(無)意識としてあったため、
この行方向の「レコード単位の追加こそ」を『2次元目』 として捉えていたように思います。
つまり、「行の縦方向」を、2次元目=『最後の次元』 と言う風に認識していたようです。
その結果、「『最後の次元』 のハズの行の要素数を変えられないのはなぜ??」
と思っていたために、 エラーの意味を理解できていなかったように思いました。
実際は、「列方向の項目数」が、「2次元目( 最後の次元)」の要素数
なのですが、
通常一旦作られたリストでは、「実態として」、 行方向のレコードの変動よりも、
列方向の項目数の変動は、少ないところです。
ですので、「あまり変えないもの(列)の方」が、「変えられる( 要素数が)」と
言うことになり、混乱は続いていました。
この「Redimの罠」から、抜け出すのが、最初、 配列の大きな壁となっていました。
横に並んだ箱の絵、その同じ数の箱が、縦に並べられる。
これを「2次元配列のイメージ」として見てきました。
それを重箱のように、重ねていくと、3次元と思えました。
ただ、この箱の例ですと、膨らましても、「4次元、5次元、・・ ・」の概念(抽象概念)が、
分からなくなっていきます。
「『最後の次元』のみ要素数が変更可能」と言われるものの、
そもそも、4次元配列の4次元目の要素数で、「『2』 以上が存在するの?」
存在しないものについて、「変更可能」 と言う言葉の意味はあるの?
と思われていました。
「使わないから、考えなくて良い」とはあるかもしれませんが、
つながりが分からないこそ、2次元についてさえも「最後の次元」 の捉え方が、
あいまいのままになり、毎回混乱しているように思われました。
そこで、テーブルに置いた、 箱とボールでの配列の絵を少し忘れてみると、
次のようなことイメージされてきました。
「縦方向」が、1次元と言うことですので、
「鉛筆ビル」⇒「1階につき、 1部屋」の「5階建てアパート」が、思い浮かびました。
建築基準で、5階が「最大限」です
この各部屋が、「箱」に当たり、各部屋に「住んでいる人」が、「 ボール」に当たります。
つまり、(1to5)の1次元の配列で、「住んでいる人」 の『表札』をゲットできます♪
そして、売れ行きが好調なので、その鉛筆ビルAの、真横に、
「新たに」、「同じ高さ」 の鉛筆ビルを幾つか建てることにしました。
土地の買収の関係で、「最大限」の6本建てることにしました。
でも、折角なので、安く作るために、「1棟」 として建築することにしました。
そうすると、(1to5,1to6)の窓のある、『 2次元配列アパート』ができました!
同じ規格の市営住宅と同じですね。
その市営住宅の敷地に、「新たに」、 何棟か建てることにしました。
同じ高さ・部屋数の規格の棟を建てるのが経済的ですよね?
そして、平行に立てるのが「最大限」土地を効率的に使えて合理的です。
結果4棟建てられることが分かりました。
これで、(1to5,1to6,1to4)の「 3次元配列の『市営住宅区域A』」が
できました。
「市営住宅区域G」まで作ることにしました。
この結果、Z市は、(1to5,1to6,1to4,1to7) の
「4次元配列の資産管理」をすることになりました。
こうして考えていきますと、
県単位 ⇒ 国単位 ⇒ 地球単位 ⇒ 宇宙単位
と、次元数を膨らませて考えていけそうです。
「地球単位」は、「生物の住む星が、いくつもある」 と言うことで、
「宇宙単位」は、ドラゴン●ール超のように、「第1宇宙」「 第2宇宙」・・・
と考えられなくもなくもなくもない、みたいな(笑)
市の規模が、後からの県の方が、多い場合もあるかもしれないし、
建築基準の緩い県も登場するかもしれませんが、
穴のありまくりなお話ではありますが、何はともあれ結果、
今は、『 2次元配列』の時は、
「横方向(列方向)」が『最後の次元』
と認識できるようになりました\(^▽^)/
余談ですが、配列のインデックスは、通常、「0」 から始まるのに、
冒頭のように範囲を丸っと配列に放り込むと、「1」から始まり、
Split関数を使うと、「0」から始まる、
これの使い分けを気を付けたいですね~~☆