0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBAにおけるIF文の速度のお話

Posted at

モダンコードが書きたいなぁと思いを馳せつつ、客要望のシステムを粛々と書いています。ロックマンです。

今回はEXCELツール(VBAマクロ)の作成時の気付きについて忘備録として記事を挙げさせていただきます。

コードの概要

  • 条件2つが両方TRUEの場合処理をする
    • 条件1:数値の等しくない判定
    • 条件2:文字列の比較判定をする
  • 計測に必要な最低限の時間のため、1億回ループする
  • 処理の前後で時間を取得、差分を取り処理時間を出力する

試験コード

以下2種類のコードを用意しました。

コード1

条件1と条件2をANDでつなぎ、条件は常にTRUEとする。

Sub hoge()

Dim startTime As Double, endTime As Double
Dim v As Long
Dim ex1 As Long: ex1 = 100000001
Dim ex2 As String: ex2 = "テキスト"

startTime = Timer
For i = 1 To 100000000
    If (ex1 <> i and ex2 = "テキスト") Then
        v = i
    End If
Next i
endTime = Timer

MsgBox endTime - startTime & "秒"

コード2

条件1と条件2をネストする、条件は常にTRUEとする。

Sub hoge()

Dim startTime As Double, endTime As Double
Dim v As Long
Dim ex1 As Long: ex1 = 100000001
Dim ex2 As String: ex2 = "テキスト"

startTime = Timer
For i = 1 To 100000000
    If (ex1 <> i) Then
        If (ex2 = "テキスト") Then
            v = i
        End If
    End If
Next i
endTime = Timer

MsgBox endTime - startTime & "秒"

結果

試行 コード1 コード2
1 8.05078秒 6.03515秒
2 7.85937秒 5.93359秒
3 7.87109秒 6.02343秒

ANDにしたほうが早いのかな?と思ったらネスト(コード2)のほうが早いのは以外だったって話でした。

ちなみに

ネストしたほうが条件1の結果がFALSEなら条件2を見に行かないから、条件によっては更に早くなるかもしれない・・・?

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?