VBA開発

ExcelVBAマクロ「二次元配列を動的に行数(一次元目)を増やす」をパーツ化する

パーツ化とは

ExcelVBAマクロ初級者からの脱却が、処理のパーツ化(プロシージャの分割)と考えています。
マクロを作る上で基本機能をパーツ化する事で、開発時間の削減に繋がります。

分かりやすく説明すると、エクセルの「関数」と同様です。
SUM関数であれば セル内に「=SUM(1+2+3)」と記載すれば、セルには「6」と表示されますよね。
値を渡せば正しい値で返ってくる動きです。

このコードをコピペでOK

Option Base 1
'■2次元配列の1次元目を増やすモジュール
Public Function Call_RedimPreserveArray(ByVal ExArray As Variant, ByVal sLen As Long)
    Dim temp() As Variant
    
    temp = WorksheetFunction.Transpose(ExArray)
    ReDim Preserve temp(UBound(temp, 1), sLen)
    
    Call_RedimPreserveArray = WorksheetFunction.Transpose(temp)
End Function

使い方

上記をコピペでお好きなモジュール内に記載してください。

    Dim ExArray As Variant
    Dim sLen As Long
    
    ReDim ExArray(5, 3)
    sLen = UBound(ExArray) + 1
    
    ExArray = Call_RedimPreserveArray(ExArray, sLen)

結果イメージ

下記のように行数が増えます。(上記サンプルでは配列にデータ格納はしてませんが、イメージです)

注意点

  • Transposeの仕様上、Option Base 1を設定します。
  • 二次元配列しか対応していません。(三次元配列などの多次元配列は対応できません。)

通常、最終次元しか増やせない

通常エクセルでは縦の列(行方向)で管理する事が多いですが、配列では横方向に増やすのが一般的です。しかしながら、二次元配列は通常配列を増やすRedim Preserveでは下記のように最終次元(列方向)しか増やせません。

    Dim ExArray As Variant
    
    ReDim ExArray(5, 3)
    
    '■(5,3)を(5,5)に変えることは出来るが、
    ReDim Preserve ExArray(5, 5)
    
    '■(5,3)を(10,3)に変えることは出来ない。※エラーが発生する
    ReDim Preserve ExArray(10, 3)

エラーが出る部分をTranspose関数を上手に使用する事で1次元目(行方向)と2次元目を一度入替して、1次元目を増やす動作が可能です。その為、二次元配列しか対応できません。

 

どんな時に使える?

配列内の要素を増やしたい時(商品マスタの差分チェックをして)差分のみ抽出する場合(配列を動的に管理したい)等、配列を使用して何かしらの計算をする場合によく使います。

コメント

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