[VBA]2次元配列の1次元目をRedim Preserveする

超まとめ

多次元配列のRedimは最終次元しか変更できないのですが、二次元配列に限っては、比較的簡単に一次元目の長さを変更することができます。

この「RedimPreserve2D」関数で、2次元配列の1次元目の長さを変更できます。Excelではなかなか有用なのではないでしょうか。

'2次元配列の1次元目の長さを変更する関数
'orgArray … 二次元配列
'legthTo … 1次元目の長さ
Function RedimPreserve2D(ByVal orgArray, ByVal lengthTo)
    Dim transedArray()
    transedArray = WorksheetFunction.Transpose(orgArray)
    ReDim Preserve transedArray(1 To UBound(transedArray, 1), 1 To lengthTo)
    RedimPreserve2D = WorksheetFunction.Transpose(transedArray)
End Function

'使い方
Sub test()
   Dim baseArray()
   ReDim baseArray(1 To 3, 1 To 2)     '開始インデックスは1にしておいたほうがよいです。
   
   'baseArrayの1次元目の長さを10に変更する
   baseArray = RedimPreserve2D(baseArray, 10)
End Sub

注意点

Transposeを使用している関係で、処理後の配列の開始インデックスは「1」になります。
(Option Base 1 を指定してしまうのがいいかも)

Transpose関数について

こちらをご参照下さい。

13 Replies to “[VBA]2次元配列の1次元目をRedim Preserveする”

  1. Hey! Someone in my Myspace group shared this site with us so I
    came to check it out. I’m definitely loving the information. I’m bookmarking and will be tweeting this to
    my followers! Outstanding blog and wonderful design.

  2. エンジニ屋さん

    1次元目をRedim Preserve、助かりました!!!!

    Transposeの着想、感服いたしております。

    Tagen

  3. VBAで2次元配列を動的に増やしたかったので大変助かりました。素晴らしいです!!ありがとうございました。

  4. このプログラムなかなか有用じゃなくて”かなり”有用でした。
    しがない事務屋ですが感服…(やはり本職は違う)

  5. いつも便利に使用させていただいております。
    この度、大きい配列に使用したところ、lengthToが65537以上を指定したら、1次元目が1に戻ってしまいました。
    Excel側の仕様でしょうか。
    なんとか大きい数値(80000くらい)で使えないでしょうか。

    1. 遅レスですみません。
      65537という数字から考えるとExcelの仕様っぽいですね。
      場当たり的ではありますが、配列を2つに分けるという方法も考えられます。ご検討ください。

  6. こんにちは。1次元目のReDim Preserveは出来ないものだと思ってダメ元で検索してみたらこちらに辿り着いた次第です。
    とても参考になりました。あり

  7. 1次元目の ReDim Preserve は出来ないと思ってダメ元で検索してみたらこちらに辿り着いた次第です。参考になりました。ありがとうございました。上記コメントにある大きい配列の箱を用意した際・・・については私はIF文で対策しました。30,000ぐらいまで膨らんだら値を一旦セルに吐き出してEraseで配列をリフレッシュ・・・という様なコードを書いた事があります。

コメントを残す