Kの備忘録(仮)

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

Excel VBAを使ってセル範囲を配列に格納するには - 動的配列1 -

はじめに

前回は、セル範囲を静的配列に格納する方法を説明しました。

lbibouroku.hatenablog.com

今回は、配列のインデックス範囲を求める関数と、セル範囲を動的配列に格納する方法を説明します。

◆目次◆

Lboud関数とUbound関数

配列のインデックス範囲を求める関数、「Lboud関数」と「Ubound関数」を紹介します。

  • Lbound関数:配列のインデックスの範囲の下限を求める関数
  • Ubound関数:配列のインデックスの範囲の上限を求める関数

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

 LBound(配列の変数, インデックス範囲の下限を求めたい次元)
 UBound(配列の変数, インデックス範囲の上限を求めたい次元)

前回作成したdataArray1_4プロシージャを引用して、使用例をお見せします。

Sub dataArray1_4()

    Dim sampleDataArr As Variant
    sampleDataArr = Sheet1.Cells(1, 1).CurrentRegion.Value
   
End Sub

このコードは、CurrentRegionプロパティを使って「セルA1を含むデータ有効範囲」を指定し、セルの値を配列に格納しています。

この配列に対して追加の処理を行いたい場合、配列のインデックス範囲を指定する必要があります。

Lboud関数とUboud関数を使うと配列のインデックス範囲がわかります。

例として、イミディエイトウィンドウを使って、配列sampleDataArrのインデックス範囲を出力します。

Sub dataArray1_4_1()

    Dim sampleDataArr As Variant
    sampleDataArr = Sheet1.Cells(1, 1).CurrentRegion.Value
    
    '1次元目のインデックス範囲を求める
    Debug.Print "1次元目のインデックス範囲は" & LBound(sampleDataArr, 1) & "から"; UBound(sampleDataArr, 1) & "まで"
    '出力結果:1次元目のインデックス範囲は1から619まで

    '2次元目のインデックス範囲を求める
    Debug.Print "2次元目のインデックス範囲は" & LBound(sampleDataArr, 2) & "から" & UBound(sampleDataArr, 2) & "まで"
    '2次元目のインデックス範囲は1から5まで

End Sub

ローカルウィンドウで配列sampleDataArrの範囲を調べても、上記のコードの結果と一致しますね。

f:id:lbibouroku:20210830193403p:plain

では、今回の本題である動的配列でセル範囲を指定して配列に格納する方法を説明します。

動的配列でセル範囲を指定して配列に格納する

前回と同じサンプルデータを使用します。この表は619行目まで記入されています。

f:id:lbibouroku:20210830193415p:plain

動的配列でセルの値を取得する場合は、For Next構文でループを使って配列の大きさを変更します。

1次元配列の場合

では、サンプルデータの1行目の値を、配列に格納します。

Sub dataArray2_1()
      
    Dim lastColumns As Long
    lastColumns = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
    
    Dim sampleDataArray() As Variant
    Dim i As Long
    For i = 1 To lastColumns
        ReDim Preserve sampleDataArray(1 To i)
        sampleDataArray(i) = Cells(1, i).Value
    Next i
     
End Sub

手順は、配列の変数をVariant型で宣言して、カウント用の変数iをFor~Next関数ににへ配列に格納したいセル範囲を指定します。 今回はColumns.countを使って一番右の列番号を取得して、セルの範囲指定します

2次元配列の場合

2次元配列の場合は、「1次元目のインデックスの範囲」「2次元目のインデックスの範囲」のどちらを変更するかで、書き方が変わります。

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

列方向のインデックスの範囲を変更する方法は、 さすがに619行目まで書くのは大変なので、3行目までを配列に入れたいと思います。

Sub dataArray2_2()
    
    Dim lastColumns As Long
    lastColumns = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
    
    Dim sampleDataArray() As Variant
    Dim i As Long
    For i = 1 To lastColumns
        ReDim Preserve sampleDataArray(1 To 3, 1 To i)
        sampleDataArray(1, i) = Cells(1, i).Value
        sampleDataArray(2, i) = Cells(2, i).Value
        sampleDataArray(3, i) = Cells(3, i).Value
    Next i
     
End Sub

変数iの範囲は、1次元目の時と同じで一番右の列までとします。

ローカルウィンドウを見ても、サンプルデータの3行の値が配列に格納されています。

f:id:lbibouroku:20210830193430p:plain

行方向(1次元目)のインデックスの範囲を変更する方法は長くなるため、次回説明します。

さいごに

実務では2次元目のインデックスの範囲を変える機会は少ないと印象です。

1次元目のインデックスの範囲の変更の方が多いと思いますが・・・少しコードの書き方にクセがあるので、できるだけわかりやすく説明できるよう、善処いたします。