宮崎県延岡市 | スマイルカラーソフトウェア | ユーザースタイルに合わせたプログラミングでお客様に幸せをお届けします。

高速化:その2

Range()をなるべく使わない

通常は問題ありませんが、ループなどでセルの読み書きを行う場合は Range > Cells > Offset のようです。 それぞれ3回ほど実行して計測してみました。
※計測値はPCの環境に影響しますので、参考値としてとらえてくださいね♪

サンプル1 Range 35秒

Public Function ColString(ByVal Col As Integer) As String
' 列番号(1,2...)をExcelの列番号(A,B...)に変換して返す
'   Col : 数値の列番号
'
    Dim iDiv As Integer
    Dim iMod As Integer
    
    iDiv = Col \ 26
    iMod = Col Mod 26
    
    If iMod = 0 Then
        iDiv = iDiv - 1
        iMod = 26
    End If
    If iDiv = 0 Then
        ColString = ""
    Else
        ColString = Chr(&H40 + iDiv)
    End If
    ColString = ColString & Chr(&H40 + iMod)
End Function
    Dim intM As Integer, intC As Integer
    
    For intM = 1 To 1000
        For intC = 1 To 100     ' "A1"の文字列に変換
            ActiveSheet.Range(ColString(intC) & CStr(intM)) = (intM - 1) * 100& + intC
        Next
    Next

サンプル2 Cells 32秒

    Dim intM As Integer, intC As Integer
    
    For intM = 1 To 1000
        For intC = 1 To 100
            ActiveSheet.Cells(intM, intC) = (intM - 1) * 100& + intC
        Next
    Next

サンプル3 Offset 31秒

    Dim intM As Integer, intC As Integer
    
    With ActiveSheet.Cells(1, 1)
        For intM = 1 To 1000
            For intC = 1 To 100
                .Offset(intM - 1, intC - 1) = (intM - 1) * 100& + intC
            Next
        Next
    End With

《 同一カテゴリ内の前後の記事》