VBA開発

配列にセル範囲を格納/動的配列をセルに貼付【ExcelVBA】

VBAで高速処理に欠かせない配列処理

ExcelVBAマクロは動作が遅いと言われがちです。それは大きな間違いです。
大体そういう方は、大量のデータをワークシート内のセルで、検索代入計算しており
その処理方法が間違いです。

一次元配列もしくは二次元配列にデータを格納してから処理をすることで、
速度の改善が見込めます。

ただ、配列処理となると厄介だから勉強していない!という初心者の方も多いでしょう。

単純に、ワークシート内のセル範囲配列同様と考えると簡単かもしれません。

セル範囲を配列に格納

'■任意のセル範囲を動的配列(一次元配列or二次元配列)に格納する
Public Sub test_arr()
    Dim arr() As Variant
    
    '■1次元配列に格納
    arr = Range("A1:C1")
    
    Erase arr '■配列初期化
    
    '■2次元配列に格納
    arr = Range("A1:C5")
    
    Erase arr '■配列初期化
    
    '■変数を使って不特定の範囲を参照して、代入する事も可能
    Dim lastRow As Long
    Dim lastCol As Long
    
    lastRow = Call_LastRow(1) '■1列目(A列)の最終行を取得
    lastCol = Call_LastCol(1) '■1行目の最終列を取得
    
    arr = Range(Cells(1, 1), Cells(lastRow, lastCol))

End Sub

上記のコードのみでは動作しません。
最終行や最終列取得の処理はパーツ化された以下記事を参考にしてください。

ExcelVBAマクロ「最終行」「最終列」の判断処理をパーツ化する
ExcelVBAマクロ-他ブック他シートの「最終行」「最終列」取得処理をパーツ化する

配列をセル範囲に反映(貼付)

'■動的配列(一次元配列or二次元配列)をセルに貼付する
Public Sub test_arr()
    Dim arr() As Variant
    Dim arrMaxRow As Long
    Dim arrMaxCol As Long
    
    '■1次元配列に格納(行方向のデータを格納)
    arr = Range("A1:A5")
    Range("A10").Resize(UBound(arr)).Value = arr
        
    Erase arr
    '■1次元配列に格納(列方向のデータを格納→列方向に向かって貼付)
    arr = Range("A1:E1")
    Range("A20").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
    Erase arr
    
    '■1次元配列に格納(列方向のデータを格納→行方向に向かって貼付)
    arr = Range("A1:E1")
    arr = WorksheetFunction.Transpose(arr)
    Range("A30").Resize(UBound(arr)).Value = arr
    
    Erase arr
    
    '■2次元配列に格納
    arr = Range("A1:C5")
    
    '■1次元目の要素数を取得
    arrMaxRow = UBound(arr, 1) - LBound(arr, 1) + 1
    '■2次元目の要素数を取得
    arrMaxCol = UBound(arr, 2) - LBound(arr, 2) + 1
    
    Range("A40").Resize(arrMaxRow, arrMaxCol).Value = arr
    
End Sub

注意点

Rangeの表現をしていますが、本来は記載するブック名を記入しましょう。詳細は下記記事参照。
マクロ初級者必読-ワークシート名を変数にSetし、短い名前で利用する

 

コメント

タイトルとURLをコピーしました