
動画でExcel 自由自在に2次元配列から1次元配列を取得する
前回(103回)では、
2 次元配列 → 1 次元配列 に変換する方法を学びました。
今回はその続きとして、
「欲しい列を、もっと自由に取り出す方法」
にチャレンジします。
「配列ってむずかしそう…」と思うかもしれませんが、
Excel の世界そのものが 2 次元配列 なので、
ここが分かるとマクロが一気に強くなります。
(サンプルファイルは、こちらです。 自由自在に2次元配列から1次元配列を取得する、サンプル103_2回)
■ 2次元配列とは?
「行 × 列」でできた、表のようなイメージです。Excelの表そのものですね。

アクセス方法はこうです:配列(行番号, 列番号)
1次元配列とは?
まっすぐ一列に並んだデータです。Excelは、シートそのものが2次元配列の世界なんです。
配列(番号)
ただし……ここがポイント!

配列をシートに書き出した瞬間、Excelは自動的に
「行と列を持った2次元の並び」として扱ってしまう のです。
つまり:
取得するときは 1 次元配列にできる
シート上では必ず 2 次元構造として表現される
という仕組みになっています。

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
このコードのポイントは 2 つ:
① まず表全体を2次元配列として読み込む
two_arr = shlist.Range("A1").CurrentRegion
Excelは表をまとめて配列に入れるのが超得意です。
② Transpose で行列を入れ替える
two_arr = WorksheetFunction.Transpose(two_arr)
③ Index で欲しい列(=転置後の1行)を取り出す
これで、列を「1行として」取り出せる状態になります。
Sub get1次元配列_from2次元配列()を実行したのが、下図です。
上記コードで十分にシンプルで使いやすいと思いますが 、さらにその上をいくコードがあります。

「毎回、表全体をTransposeするのは大げさじゃない?」
と思う方も多いはずです。
そこで役立つのが…次のコードは、列が10列以上あるような大きな表のデータから、
欲しい列のデータを1列だけ取得したいという場合に、使いたいと思ってかんがえました。

Sub getrange_onearr2()
Set rng = shlist.Range("A1").CurrentRegion
' 表全体ではなく、1列目(A列)だけに絞る
one_arr = WorksheetFunction.Transpose(rng.Resize(, 1))
Debug.Print "one_arr = " & Join(one_arr, "-")
End Sub
■ ここがポイント
表をResizeして1列だけにするのです。
Resize(, 1) → 「列数を 1 にする」
Transpose すると 縦に並んだ列が、横並びの1次元配列になる
たとえば、3列目(カタカナ名)だけ取りたいときはこうします:
以下のコードで、Range("A1").CurrentRegionとして、表全体を取得するのはしかたないです。
Set rng = shlist.Range("A1").CurrentRegion
けれど、次のコードのカッコの中にある、rng.Resize(, 1) を見てください。
1列だけに絞り込んでいます。それをTransposeしたら1次元になります。

'==============================================================
'= 最初から1列目をTransposeしたらもっとシンプル
'==============================================================
Sub getrange_onearr_offset()
' CurrentRegion(表全体)から1列だけ取得し、さらに右へ2列ずらす
Set rng = shlist.Range("A1").CurrentRegion.Resize(, 1).Offset(, 2)
one_arr = WorksheetFunction.Transpose(rng)
Debug.Print "one_arr = " & Join(one_arr, ",")
End Sub
.Resize(, 1) → とりあえず1列にする
.Offset(, 2) → 右に2列動かして「3列目」に合わせる
こうすることで、
どの列でも簡単に1次元配列として取得できます。

Excelシートは「2次元配列の世界」
1次元配列として取り出すことはできるが、シートに書くと2次元の形になる
欲しい列だけ取りたいなら、
Resize + Offset + Transpose の組み合わせが最強
どの列でも、自由自在に1次元配列として取得できるようになる
配列が使えると、マクロの処理が圧倒的に速くなる

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