私はassyliasの答えが好きですが、次のようにリファクタリングします。
Sub test()
Dim origNum As String
Dim creditOrDebit As String
origNum = "30062600006"
creditOrDebit = "D"
If creditOrDebit = "D" Then
If origNum = "006260006" Then
MsgBox "OK"
ElseIf origNum = "30062600006" Then
MsgBox "OK"
End If
End If
End Sub
の値をチェックする意味がないcreditOrDebit
場合、これによりCPUサイクルを節約できる可能性があります。<> "D"
origNum
アップデート:
次の手順を使用して、手順が高速であるという理論をテストしました。
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub DoTests2()
Dim startTime1 As Long
Dim endTime1 As Long
Dim startTime2 As Long
Dim endTime2 As Long
Dim i As Long
Dim msg As String
Const numberOfLoops As Long = 10000
Const origNum As String = "006260006"
Const creditOrDebit As String = "D"
startTime1 = timeGetTime
For i = 1 To numberOfLoops
If creditOrDebit = "D" Then
If origNum = "006260006" Then
' do something here
Debug.Print "OK"
ElseIf origNum = "30062600006" Then
' do something here
Debug.Print "OK"
End If
End If
Next i
endTime1 = timeGetTime
startTime2 = timeGetTime
For i = 1 To numberOfLoops
If (origNum = "006260006" Or origNum = "30062600006") And _
creditOrDebit = "D" Then
' do something here
Debug.Print "OK"
End If
Next i
endTime2 = timeGetTime
msg = "number of iterations: " & numberOfLoops & vbNewLine
msg = msg & "JP proc: " & Format$((endTime1 - startTime1), "#,###") & _
" ms" & vbNewLine
msg = msg & "assylias proc: " & Format$((endTime2 - startTime2), "#,###") & _
" ms"
MsgBox msg
End Sub
assyliasのテストのように、1,000,000回の反復で約200ミリ秒もかからなかったため、低速のコンピューターが必要です。反復を10,000に制限する必要がありました-ねえ、他にやることがあります:)
上記の手順を10回実行した後、私の手順は20%の時間しか速くなりません。ただし、速度が遅い場合は、表面的にのみ遅くなります。しかし、 assyliascreditOrDebit
が指摘したように、の場合<>"D"
、私の手順は少なくとも2倍速くなります。1億回の反復で合理的にテストすることができました。
そしてそれが私がそれをリファクタリングした理由です-ロジックを短絡して、origNum
いつ評価する必要がないようにするためcreditOrDebit <> "D"
です。
この時点で、残りはOPのスプレッドシートに依存します。creditOrDebit
Dに等しい可能性が高い場合は、通常はより高速に実行されるため、 assyliasの手順を使用します。ただしcreditOrDebit
、可能な値の範囲が広くD
、ターゲット値になる可能性が低い場合、私の手順ではそれを利用して、他の変数を不必要に評価することを防ぎます。