非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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]

スポンサーリンク

 - Excel, VBA