自由自在に2次元配列から1次元配列を取得する
動画でExcel 自由自在に2次元配列から1次元配列を取得する
自由自在に2次元配列から1次元配列を取得する
前回は2次元配列から1次元配列への変換という内容でお送りしました。
その際にそもそも 2次元配列と1次元配列の根本的な違いは何かというお話をしました。
2次元配列は行と列というように格子状になっていますから、指定するには行と列2つの引数が必要です。
1次元配列は 一直線に並んでいますから、
どのセルか どの箱かあるいはどの列かというような位置の指定だけでいいんです。
(サンプルファイルは、こちらです。 自由自在に2次元配列から1次元配列を取得する、サンプル103_2回)
【マクロ中級】必見!まだある、らくらく2次元配列から1次元配列にする、Excel塾のエクセルマクロ講座中級編103回その2
1次元配列を取得するということの意味
2次元配列は行と列の指定。1次元配列は 一直線なので、位置の指定だけでいい。
Excelは、シートそのものが2次元配列の世界なんです。
そこで 1次元配列をExcel上に転記した途端に それはたとえ1次元配列のデータを反映していても Excel上に置いた時点で、再取得しようと思えば それはもう2次元配列のような形になってしまうか、 あるいは1個ずつ取り出して そして一直線に入れていくという方法になってしまうわけです。
1列だけ取得して1行に配置した状態。このように配置しても2次元配列であることには変わりないのです。
Excelシート上では、1次元配列は表現することができません。しかし取得はできます。
次のようなコードを利用してデータの1列だけを1次元配列として取得しました。
Option Explicit Dim two_arr As Variant, one_arr As Variant, i As Long Dim rng As Range '=========================================== 'shlistはコード名であり、シート名です。コード名はコードとしてそのまま使えます。 '2次元配列から1次元配列にする '=========================================== Sub get1次元配列_from2次元配列() two_arr = shlist.Range("A1").CurrentRegion two_arr = WorksheetFunction.Transpose(two_arr) one_arr = WorksheetFunction.Index(two_arr, 5) '取得したい行のインデックス Debug.Print "one_arr = " & Join(one_arr, ",") End Sub
Sub get1次元配列_from2次元配列()を実行したのが、下図です。
上記コードで十分にシンプルで使いやすいと思いますが 、さらにその上をいくコードがあります。
1次元配列に必要な列だけを取るという考え方
次のコードは、列が10列以上あるような大きな表のデータから、
欲しい列のデータを1列だけ取得したいという場合に、使いたいと思ってかんがえました。
というのも、表全体をそっくり配列に入れてトランスポーズすることが、何か大げさじゃないかと感じてしまいました。
以下のコードでは、1列目だけを取るというわけです。
A列を取りたいですというわけなんですが、コードこんな内容です。
A列を1次元で取得するケース
そこで、どうするかというと、表をResizeして1列だけにするのです。
以下のコードで、Range("A1").CurrentRegionとして、表全体を取得するのはしかたないです。
Set rng = shlist.Range("A1").CurrentRegion
けれど、次のコードのカッコの中にある、rng.Resize(, 1) を見てください。
1列だけに絞り込んでいます。それをTransposeしたら1次元になります。
'============================================================== '= 最初から1列目をTransposeしたらもっとシンプル '============================================================== Sub getrange_onearr2() 'Betterなやり方 Set rng = shlist.Range("A1").CurrentRegion one_arr = WorksheetFunction.Transpose(rng.Resize(, 1)) 'まだ2次元なのでTranspose Debug.Print "one_arr = " & Join(one_arr, "-") End Sub
シートに転記したら2次元になってしまいますので、Debug.Printしています。
Debug.Printしなくても、ローカルウィンドーでOne_arrを見ると、きちんと取得しているのを確認できますね。
A列以外の列を1次元で取得するケース
たとえば、3列目のカタカナ名を取得したい場合には、上記のコードをちょっと変更すれば取得できます。
実行すると、イミディエイトウィンドーに社員(カタカナ)が取得でき、
ローカルウィンドウには、one_arr
の中身を見ることができます。
'= 社員(カタカナ)は3列目なので今の位置1列から2列移動 '============================================================== Sub getrange_onearr_offset() Set rng = shlist.Range("A1").CurrentRegion.Resize(, 1).Offset(, 2) one_arr = WorksheetFunction.Transpose(rng) 'まだ2次元なので Debug.Print "one_arr = " & Join(one_arr, ",") End Sub
今回は前回から引き続き
Transpose関数を使ってさらにはResize関数やOffset関数まで動員して
自由自在に2次元配列から1次元配列を取得するという方法についてお話ししました。
これで取得さえできれば、もうこっちのものですよ配列は。
ぜひ実務に配列をどんどん取り入れてスピードアップ効率化していきましょう。