Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excel VBAを使ってセル範囲を配列に格納するには - 動的配列2 - (2次元配列の1次元目のインデックス範囲を変更したいとき)

はじめに

前回は、セル範囲を動的配列に格納する方法(2次元目のインデックス範囲を変更)について説明しました。

lbibouroku.hatenablog.com

今回はセル範囲を動的配列に格納する方法(1次元目のインデックス範囲を変更)について説明します。

◆目次◆

Transpose関数

先に今回の肝となる「Transpose関数」を紹介します。

  • Transpose関数:行と列を入れ替える関数

Excelのワークシート上で、右クリックで貼り付けするときに出てくる「行/列の入れ替え」と同じことができます。

f:id:lbibouroku:20210830210316p:plain

使い方は以下のとおりです。

WorksheetFunction.Transpose(行と列を入れ替えたいセル範囲や配列)

Transpose関数の実例は、次の節で説明します。

1次元目のインデックスの範囲の変更

さて、ここが山場です。

以前の記事で、動的配列について以下のように書きました。

ただし、ReDim Preserveステートメントを使って変更できるのは「配列の最後の次元のみ」ということに注意が必要です。

つまり、「2次元配列において、1次元目のインデックス範囲は変更できない」ということです。

でも、1次元目のインデックス範囲を変更したいことは多々あります。 そこで、先ほど紹介したTranspose関数が活躍します!

先に、マクロに記述する手順を説明をします。イメージは以下の画像を参照してください(立方体に書いている文字は、セルの位置を指します)。

  1. 変数:lastRowsを宣言し、Sheet1の最下行番号を代入する
  2. 配列の変数:sampleDataArrayを宣言する
  3. For Next構文でセルの値を変数:sampleDataArrayへ格納する(わざと行と列を入れ替えて値を格納します、画像を参照してください) f:id:lbibouroku:20210830210331p:plain
  4. 新しい配列の変数:sampleDataArray_2を宣言する
  5. 変数:sampleDataArrayを、Transpose関数で行と列を入れ替えて変数:sampleDataArrayArr_2に格納する(画像を参照してください) f:id:lbibouroku:20210830212308p:plain

つまり、手順の3と5の、計2回「行と列を入れ替え」が発生していることになります。

この流れをコードにすると、以下のとおりです(コメントアウトしている①と②は後ほど説明します)。

Sub dataArray2_3()

    '1. 変数:lastRowsを宣言し、Sheet1の最下行番号を代入する
    Dim lastRows As Long
    lastRows = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row

    '2. 配列の変数:sampleDataArrayを宣言する
    Dim sampleDataArray As Variant

    '3. For Next構文でセルの値を変数:sampleDataArrayへ格納する(わざと行と列を入れ替えて値を格納する)
    Dim i As Long
    For i = 1 To lastRows
        ReDim Preserve sampleDataArray(1 To 5, 1 To i)
        sampleDataArray(1, i) = Sheet1.Cells(i, 1).Value
        sampleDataArray(2, i) = Sheet1.Cells(i, 2).Value
        sampleDataArray(3, i) = Sheet1.Cells(i, 3).Value
        sampleDataArray(4, i) = Sheet1.Cells(i, 4).Value
        sampleDataArray(5, i) = Sheet1.Cells(i, 5).Value
    Next i
    
'    With Sheet2 '①
'        .Range(.Cells(1, 1), .Cells(UBound(sampleDataArray, 1), UBound(sampleDataArray, 2))).Value = sampleDataArray
'    End With

    '4. 新しい配列の変数:sampleDataArray_2を宣言する
    Dim sampleDataArray_2 As Variant

    '5. 変数:sampleDataArrayを、Transpose関数で行と列を入れ替えて変数:sampleDataArrayArr_2に格納する
    sampleDataArray_2 = WorksheetFunction.Transpose(sampleDataArray)
    
'    With Sheet3 '②
'        .Range(.Cells(1, 1), .Cells(UBound(sampleDataArrayArr_2, 1), UBound(sampleDataArrayArr_2, 2))).Value = sampleDataArrayArr_2
'    End With

End Sub

実際に上記のコードで配列がどのように変わっていくのかを確認したい方は①と②のコメントアウトを解除してください。

①のコメントアウトを解除したら、行と列が逆転した配列をSheet2に貼り付けできます。

f:id:lbibouroku:20210830212519p:plain

②のコメントアウトを解除したら、もう一度行と列を逆転させた配列をSheet3に貼り付けできます。

f:id:lbibouroku:20210830212531p:plain

おわりに

いかがでしょうか。

セル範囲を動的配列に格納する方法(1次元目のインデックス範囲を変更)は2回も、行と列を入れ替えているので、最初は違和感があると思います。しかし、何度かコードを書いていくうちに慣れていくので、ぜひ試してください。

次回は配列を使った時の可読性を上げるための方法を説明します。