「やたらと処理に時間がかかる」事件

先日 Excel について、ある調査を依頼されました。
マクロを用いた処理に、やたら時間がかかるというのです。

Sub Sample()
    Dim Tb  As ListObject
    Dim r   As Range    
    Set Tb = ActiveSheet.ListObjects(1)
    For Each r In Tb.DataBodyRange.Columns(1).Cells
        rを用いた何某かの処理
    Next
End Sub

データを見てみると、300行 × 10列 程度の表で、通常であれば一瞬で処理が終わるはずのものです。私も実行してみましたが、確かに、処理完了まで数分を要しました。
そこで、For Each ~ にブレークポイントを設けて実行し、イミディエイトウィンドウでテーブルの行数を表示させてみました。

f:id:Infoment:20180705214305p:plain

処理行数が100万行!なぜこんなことに?そこでテーブルのサイズを確認したところ、「A列~J列」で指定されていました。

f:id:Infoment:20180705214604p:plain

これは時間がかかるはずです。むしろ、数分で終わったことに凄さを感じたぐらいです。テーブルサイズを修正することで、期待通りの処理時間(ほぼ瞬殺)に改善されました。

今回のまとめ
現象:処理時間がやたらと掛かる
調査:処理範囲は適切か?
原因:テーブルのサイズが列単位で指定されていた
処方:テーブルのサイズを適切な範囲に変更
結果:処理時間が短縮された

参考まで。