VBAで高速処理に欠かせない配列処理
ExcelVBAマクロは動作が遅いと言われがちです。それは大きな間違いです。
大体そういう方は、大量のデータをワークシート内のセルで、検索、代入、計算しており、
その処理方法が間違いです。
一次元配列もしくは二次元配列にデータを格納してから処理をすることで、
速度の改善が見込めます。
ただ、配列処理となると厄介だから勉強していない!という初心者の方も多いでしょう。
単純に、ワークシート内のセル範囲と配列は同様と考えると簡単かもしれません。
セル範囲を配列に格納
'■任意のセル範囲を動的配列(一次元配列or二次元配列)に格納する Public Sub test_arr() Dim arr() As Variant '■1次元配列に格納 arr = Range("A1:A5")'※実際には2次元化されます 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し、短い名前で利用する
コメント