速度比較決定版【Range,Cells,Do,For,ForEach】
何度も言っているのですが、
RangeとCellsでどっちが早いか、
とか、
DoとForとFor
Eachでどれが早いか
とか、
そもそも、その議論がナンセンスなんです。
以下のコードと結果を見て、各自で判断して下さい。
巷の議論が、
いかに無意味で、実は良く解っていないのだと言う事を、理解してもらいたい。
以下のテストコードでは、極力他の要素を排除するために、
余計なカウントアップ等を避ける為、
A列の10万行と100万行のセルに、全て1を入れています。
そして、毎回シートの全セルをクリア後に実行するようにしました。
さらに、タイム計測では、Timerを使用し、
(Timerは、午前0時から経過した秒数を表す単精度浮動小数点数型)
その開始と終了の差を使用しています。
テストでは、10通りのコードを使用しました。
(10という数字に意味はありません、きりが良いので適当に選びました。)
恐らく、早い遅いの議論をする多くの方は、
この10通りの書き方さえ理解していないでしょう。
コードの解説はしません。
議論の必要がないからです。
普通に、Forで、Cellsを使用すればよいのです。
どうしても、処理速度を上げたければ、配列を使う等の工夫をする。
これが、基本、鉄則です。
普通が一番良いのです。
では、コードと実行結果です。
(使用PCは、結構古いです、あしからず)
Sub test()
Const lngMax As Long = 100000
Application.ScreenUpdating =
False
Cells.Clear
Call test1(lngMax)
Cells.Clear
Call
test2(lngMax)
Cells.Clear
Call
test3(lngMax)
Cells.Clear
Call
test4(lngMax)
Cells.Clear
Call
test5(lngMax)
Cells.Clear
Call
test6(lngMax)
Cells.Clear
Call
test7(lngMax)
Cells.Clear
Call
test8(lngMax)
Cells.Clear
Call
test9(lngMax)
Cells.Clear
Call
test10(lngMax)
Application.ScreenUpdating = True
End
Sub
Sub test1(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1 To
max
Range("A" &
i).Select
Selection.Value = 1
Next
i
Debug.Print "test1:" & Timer - sngTime
End
Sub
Sub test2(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1 To
max
Range("A" & i) = 1
Next i
Debug.Print
"test2:" & Timer - sngTime
End Sub
Sub test3(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1 To
max
Range("A1").Offset(i) = 1
Next
i
Debug.Print "test3:" & Timer - sngTime
End
Sub
Sub test4(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1 To
max
Range("A1").Item(i) = 1
Next i
Debug.Print
"test4:" & Timer - sngTime
End Sub
Sub test5(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
i =
1
Do While i <= max
Cells(i, 1) =
1
i = i + 1
Loop
Debug.Print "test5:"
& Timer - sngTime
End Sub
Sub test6(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1
To max
Cells(i, 1) = 1
Next i
Debug.Print
"test6:" & Timer - sngTime
End Sub
Sub test7(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
For i = 1
To max
Cells(i, "A") = 1
Next i
Debug.Print
"test7:" & Timer - sngTime
End Sub
Sub test8(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim rng As Range
For Each
rng In Range(Cells(1, 1), Cells(max,
1))
rng.Value = 1
Next
rng
Debug.Print "test8:" & Timer - sngTime
End
Sub
Sub test9(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
Dim MyRng As
Range
Set MyRng = Range(Cells(1, 1), Cells(max,
1))
For i = 1 To max
MyRng.Item(i)
= 1
Next i
Debug.Print "test9:" & Timer - sngTime
End
Sub
Sub test10(max As Long)
Dim sngTime As
Single
sngTime = Timer
Dim i As Long
Dim MyAry
ReDim
MyAry(1 To max, 1 To 1)
For i = 1 To max
MyAry(i,
1) = 1
Next i
Range(Cells(1, 1), Cells(max, 1)).Value
= MyAry
Debug.Print "test10:" & Timer - sngTime
End
Sub
test1:11.76563
test2:5.65625
test3:5.984375
test4:5.671875
test5:4.125
test6:4.109375
test7:4.375
test8:4.046875
test9:4.03125
test10:0.34375
test1:119.9844
test2:56.70313
test3:59.95313
test4:56.625
test5:41.20313
test6:41.17188
test7:43.79688
test8:40.45313
test9:40.51563
test10:3.4375
同じテーマ「マクロVBA技術解説」の記事
VBAの配列まとめ(静的配列、動的配列)
最終行の判定、Rangeオブジェクトと配列、高速化の為に
記述による処理速度の違い
速度比較決定版【Range,Cells,Do,For,ForEach】
エクセルVBAのパフォーマンス・処理速度に関するレポート
VBAのFindメソッドの使い方には注意が必要です
マクロVBAの高速化・速度対策の具体的手順と検証
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
大量データで処理時間がかかる関数の対処方法(SumIf)
大量データにおける処理方法の速度王決定戦
遅い文字列結合を最速処理する方法について
新着記事NEW ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 速度比較決定版【Range,Cells,Do,For,ForEach】
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。