【Excel VBA】WorksheetFunction.Transpose関数でメモリ不足エラーが発生する

WorksheetFunction.Transpose関数で配列の行列を入れ替えた場合、メモリ不足エラーが発生して処理が失敗することがあります。

今回はエラーの回避方法について説明していきます。

対処方法

配列の要素数を減らす

配列の要素数を減らすとエラーが発生しなくなります。

Transposeを使用せずに行列を入れ替える

以下のコードを使用して行列を入れ替えると、エラーを回避できます。

''' <summary>
''' 二次元配列の行列を入れ替える
''' </summary>
''' <param name="arr">二次元配列</param>
''' <returns>入れ替え後の二次元配列</returns>
Function TransposeFix(ByRef arr As Variant) As Variant
    '開始インデックスを判定
    Dim startIndex As Long: startIndex = 1
    Dim offset As Long: offset = 1
    On Error Resume Next
    If arr(0, 0) <> "" Then startIndex = startIndex
    If Err.Number = 0 Then startIndex = 0
    offset = offset - startIndex
    Err.Clear: On Error GoTo 0
    '配列を入れ替え
    Dim i As Long
    Dim j As Long
    Dim returnData As Variant
    ReDim returnData(1 To UBound(arr, 2) + offset, 1 To UBound(arr) + offset)
    For i = startIndex To UBound(arr)
        For j = startIndex To UBound(arr, 2)
            returnData(j + offset, i + offset) = arr(i, j)
        Next
    Next
    TransposeFix = returnData
End Function

TransposeとTransposeFixの速度差

WorksheetFunction.TransposeとTransposeFixでどれだけ速度差があるか比較しました。

ランダムな英数文字列(10文字)が入ったセル100000万行×10列分を処理した際の処理速度です。

  • Transpose:約343.8ミリ秒
  • TransposeFix:約296.9ミリ秒

TransposeFixがTransposeより約1.16倍ほど速いようです。

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