つらつら Excel VBA

私の備忘録です。

配列をそのままセルに出力

配列をセルに出力する際、一次元配列は横方向に出力される。

シート横方向の限界サイズで一次元配列を作成して出力してみた。
Excel2007以降では16,384列もあるが一瞬で終わる。

Option Base 0
Sub 一次元配列の出力テスト()
    
    Dim lastColumn As Long
    lastColumn = Cells.Columns.Count16,384ReDim myArray1(lastColumn - 1)
    
    Dim i As Long
    For i = LBound(myArray1) To UBound(myArray1)
        myArray1(i) = "test" & i
    Next
    
    Dim targetRange As Range
    Set targetRange = Range("A2").Resize(, UBound(myArray1) + 1)
    targetRange = myArray1
    
End Sub


縦方向に出力したい場合は少し書き換える。

For i = LBound(myArray1) To UBound(myArray1)
    Cells(i + 1, 1) = myArray1(i)
Next

この手の処理は出力に時間がかかるので、事前に配列をなんやかんやすると良い。
TRANSPOSE関数で行列を入れ替えたり、一次元配列を二次元配列にしたり、、、いろいろ方法がある模様。
ちな本記事のように膨大なサイズの配列を扱う場合、TRANSPOSE関数は非推奨、ダメ。他の方法で配列をなんやかんやしましょう。




シート縦方向の限界サイズで二次元配列を作成して出力してみた。
Excel2007以降では1,048,576行もあるが、数秒で終わった。

Option Base 0
Sub 二次元配列の出力テスト()
    
    Dim lastRow As Long
    lastRow = Cells.Rows.Count '1,048,576行
    ReDim myArray2(lastRow - 1, 2)
    
    Dim i As Long, j As Long
    For i = LBound(myArray2, 1) To UBound(myArray2, 1)
        For j = LBound(myArray2, 2) To UBound(myArray2, 2)
            myArray2(i, j) = i & "," & j
            'Cells(i+1, j+1) = i & "," & j ' 時間かかる
        Next
    Next
    
    Dim rowSize As Long, columnSize As Long
    rowSize = UBound(myArray2, 1) + 1
    columnSize = UBound(myArray2, 2) + 1
    
    Dim targetRange As Range
    Set targetRange = Range("A1").Resize(rowSize, columnSize)
    targetRange = myArray2
    
End Sub


配列のサイズとセルのサイズを合わせるのが肝心。
出力先のセル範囲が過不足でもエラーにならないので注意。

以上。