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

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

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

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

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

この記事で学べる内容

  • 2次元配列と1次元配列の根本的な違いを理解できる
  • Excelシートは「2次元配列の世界」である理由がわかる
  • 1次元配列をシートに表示すると2次元になる仕組みがわかる
  • Transposeを使って、欲しい列だけ1次元配列として取り出す方法を学べる
  • Resize・Offsetを使って「特定の列だけ」を取り出す実践的なテクニックが身につく

前回(103回)では、
2 次元配列 → 1 次元配列 に変換する方法を学びました。
今回はその続きとして、
「欲しい列を、もっと自由に取り出す方法」
にチャレンジします。
「配列ってむずかしそう…」と思うかもしれませんが、
Excel の世界そのものが 2 次元配列 なので、
ここが分かるとマクロが一気に強くなります。


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

1次元配列と2次元配列の違い

■ 2次元配列とは? 「行 × 列」でできた、表のようなイメージです。Excelの表そのものですね。

アクセス方法はこうです:配列(行番号, 列番号)

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

https://youtu.be/b7X1BwlKao8

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

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

NAMAE1
❗Excelのシート上には「1次元配列」という形で置けない

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

NAMAE2

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

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

NAMAE3

前回使った 1 次元配列のコード(復習)

次のようなコードを利用してデータの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

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

NAMAE5

もっと実務的に:本当に必要な列だけ取ってくる方法

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

NAMAE6
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次元配列になる

Offset で好きな列を指定する

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

NAMAE7
'==============================================================
'= 最初から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次元配列として取得できます。

NAMAE8

まとめ:今回のポイントはこれ!

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

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