自由自在に2次元配列から1次元配列を取得する

2次元配列から1次元配列を取得して業務に活用する動画編 103_2回
自由自在に2次元配列から1次元配列を取得する

動画でExcel 自由自在に2次元配列から1次元配列を取得する

自由自在に2次元配列から1次元配列を取得する

前回は2次元配列から1次元配列への変換という内容でお送りしました。
その際にそもそも 2次元配列と1次元配列の根本的な違いは何かというお話をしました。 2次元配列は行と列というように格子状になっていますから、指定するには行と列2つの引数が必要です。
1次元配列は 一直線に並んでいますから、 どのセルか どの箱かあるいはどの列かというような位置の指定だけでいいんです。

(サンプルファイルは、こちらです。 自由自在に2次元配列から1次元配列を取得する、サンプル103_2回

【マクロ中級】必見!まだある、らくらく2次元配列から1次元配列にする、Excel塾のエクセルマクロ講座中級編103回その2

https://youtu.be/b7X1BwlKao8

1次元配列を取得するということの意味

2次元配列は行と列の指定。1次元配列は 一直線なので、位置の指定だけでいい。
Excelは、シートそのものが2次元配列の世界なんです。

NAMAE1

そこで 1次元配列をExcel上に転記した途端に それはたとえ1次元配列のデータを反映していても Excel上に置いた時点で、再取得しようと思えば それはもう2次元配列のような形になってしまうか、 あるいは1個ずつ取り出して そして一直線に入れていくという方法になってしまうわけです。

NAMAE2

1列だけ取得して1行に配置した状態。このように配置しても2次元配列であることには変わりないのです。

Excelシート上では、1次元配列は表現することができません。しかし取得はできます。

NAMAE3

次のようなコードを利用してデータの1列だけを1次元配列として取得しました。

NAMAE4
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次元配列()を実行したのが、下図です。
上記コードで十分にシンプルで使いやすいと思いますが 、さらにその上をいくコードがあります。

NAMAE5

1次元配列に必要な列だけを取るという考え方

次のコードは、列が10列以上あるような大きな表のデータから、 欲しい列のデータを1列だけ取得したいという場合に、使いたいと思ってかんがえました。
というのも、表全体をそっくり配列に入れてトランスポーズすることが、何か大げさじゃないかと感じてしまいました。

NAMAE6
つまり何も全列じゃなくて、欲しい列だけを使う。
以下のコードでは、1列目だけを取るというわけです。
A列を取りたいですというわけなんですが、コードこんな内容です。

A列を1次元で取得するケース

そこで、どうするかというと、表をResizeして1列だけにするのです。
以下のコードで、Range("A1").CurrentRegionとして、表全体を取得するのはしかたないです。
Set rng = shlist.Range("A1").CurrentRegion
けれど、次のコードのカッコの中にある、rng.Resize(, 1) を見てください。
1列だけに絞り込んでいます。それをTransposeしたら1次元になります。

NAMAE7
'==============================================================
'= 最初から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を見ると、きちんと取得しているのを確認できますね。

NAMAE8

A列以外の列を1次元で取得するケース

たとえば、3列目のカタカナ名を取得したい場合には、上記のコードをちょっと変更すれば取得できます。

NAMAE9

実行すると、イミディエイトウィンドーに社員(カタカナ)が取得でき、
ローカルウィンドウには、one_arr の中身を見ることができます。

NAMAE10
'= 社員(カタカナ)は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次元配列を取得するという方法についてお話ししました。
これで取得さえできれば、もうこっちのものですよ配列は。 ぜひ実務に配列をどんどん取り入れてスピードアップ効率化していきましょう。