Excel/VBAでFor Eachループが速いらしいので速度比較してみた
2017/07/06
前回、シート内の検索でループ文で探すより、Match関数を組み合わせて使った方が検索速度が格段に速くなることを紹介しました。※前回の例ではDo~Loop。
このブログをGoogle+で紹介したところ、知らない外人から突っ込みが入りました。
No…. the best tool for do this operation is the for each sentence, looking for cells in the worksheet.
セルを探すにはfor eachが”ベストツール”なんだそうです。そういや、VBAでfor eachって使ったことないですね。
[ad#top-1]
なので、試してみた
前回と同じく、124155のデータから探すプログラムです。
前回は、Do~Loopで探すと16.5秒だったものが、Match関数を併用することで0.04秒と爆速になりました。そこを突っ込んできたのだから、For Eachはさぞかし速いんでしょうな~( ̄ー ̄)
作ったプログラムはこんな感じ
以下がFor Eachを使ったプログラムです。
Sub 検索3() t1 = Timer() For r = 4 To 10 For Each c In Range("A14:A124128") If c = Cells(r, 1) Then r2 = c.Row Cells(r, 2) = Cells(r2, 2) Cells(r, 3) = Cells(r2, 3) Cells(r, 4) = Cells(r2, 4) Exit For End If r2 = r2 + 1 Next c Next r t2 = Timer() Range("C1") = t2 - t1 End Sub
ポイントは5行目の以下の構文です。
For Each c In Range(“A14:A124128”)
Rangeで示した範囲を順繰り変数cに格納してくれます。
速度測定結果
こちらが結果です。前回のDo~LoopとMatch関数併用も併記しておきます。
条件 | 処理時間(秒) |
Do~Loop | 16.47 |
Match関数併用 | 0.04 |
For Each | 8.21 |
結果は8.21秒。たしかに、単純なDo~Loopループよりは速かったです。倍の速度でした。
しかし、Match関数との併用には足元にも及ばず。ケタが2つも開きがありますね。
まあ、関数との組み合わせが気持ち悪い場合は、Do~LoopやFor~Nextを使うよりもFor Each使った方がいいですね。
でも、せっかくのExcel/VBAなので、僕は関数と組み合わせる方が良いと思います。
Match関数との組み合わせの方法についてはこちらをご覧ください。
[ad#ad-1]
スポンサーリンク