11.1 SelectやSelectionは使わない
???.Selectでセルやワークブックやワークシートを選択しSelection.???でコピーや貼付け・セルの書式設定・セルにデータを入れるなどを行う方法は、5.2 セルの選択と選択されているセルで取り上げました。マクロの記録(7.7)でも、例えばコピー・貼付けを記録すると、この間接的に指定する方法のマクロが記録されます。

しかし、この方法は基本的に効率が悪いため、大量のデータを処理しようとすると何分経っても処理が終わらないなんてことがあるので、特別な理由があるとき以外は、ワークシート・ワークブックへのアクセス、コピペ、セルへデータを入れるときは直接やりましょう。
事例/セルにデータを入れる
かなり極端ですが最初に遅い例です。例では、A1〜J30までの範囲にそれぞれ1〜300までの値を入れる処理を10回繰り返していますが、セルにデータを入れるときは最初に対象のセルをRange(???).Selectで選択し、その後Selection.Value=???でデータを入れています。

ちなみに、おいらのPCでは平均で8秒ぐらいでした。

Sub prcSlowSample1()

    '遅い例1

    Dim lngCount As Long
    Dim rngCell As Range
    Dim i As Long

    Debug.Print "START=" & Time

    For i = 1 To 10

        lngCount = 1

        For Each rngCell In Range("A1:J30")
            rngCell.Select
            Selection.Value = lngCount
            lngCount = lngCount + 1
        Next

    Next

    Debug.Print "END =" & Time

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです


次に、上のコードを改善した例です。セルにデータを入れるときはRange(???).Valueで直接入れています。セルを選択→値を入れるという2段階で行っていた処理を1撃で行う分処理が速くなります。それに、見た目もスッキリしているでしょう。

ちなみに、おいらのPCでは平均で5秒ぐらいでした。たったの3秒ですが、この差は大きいです(笑)

Sub prcFastSample1()

    '速い例1

    Dim lngCount As Long
    Dim rngCell As Range
    Dim i As Long

    Debug.Print "START=" & Time

    For i = 1 To 10

        lngCount = 1

        For Each rngCell In Range("A1:J30")
            rngCell.Value = lngCount
            lngCount = lngCount + 1
        Next

    Next

    Debug.Print "END =" & Time

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです
Copyright(C) 1999-2006 結城圭介。 All rights reserved