我正在尝试使用“And”&在If语句中的“或”。我的语法错了。
当数据真实时,结果会返回false。这是代码:
ElseIf (origNum = "006260006" Or origNum = "30062600006") And creditOrDebit = "D" Then
'do things here
End If
- 当我调试并到达此行时,它会跳过它并且不会进入。
-origNum实际上等于“006260006”而creditOrDebit =“D”。
- 所以我假设我的“或”声明不起作用。
- 希望这是一个快速简单的问题。谢谢!
答案 0 :(得分:19)
问题可能在其他地方。请尝试以下代码:
Sub test()
origNum = "006260006"
creditOrDebit = "D"
If (origNum = "006260006" Or origNum = "30062600006") And creditOrDebit = "D" Then
MsgBox "OK"
End If
End Sub
您会看到Or
按预期工作。你确定你的ElseIf
语句已被执行(如果以前的if / elseif中的任何一个为真,它将不被执行)吗?
答案 1 :(得分:2)
这不是答案,但评论时间太长。
在回复JP's answers / comments时,我运行了以下测试来比较两种方法的性能。 Profiler
对象是一个自定义类 - 但总的来说,它使用了相当准确的kernel32函数(Private Declare Sub GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
)。
Sub test()
Dim origNum As String
Dim creditOrDebit As String
Dim b As Boolean
Dim p As Profiler
Dim i As Long
Set p = New_Profiler
origNum = "30062600006"
creditOrDebit = "D"
p.startTimer ("nested_ifs")
For i = 1 To 1000000
If creditOrDebit = "D" Then
If origNum = "006260006" Then
b = True
ElseIf origNum = "30062600006" Then
b = True
End If
End If
Next i
p.stopTimer ("nested_ifs")
p.startTimer ("or_and")
For i = 1 To 1000000
If (origNum = "006260006" Or origNum = "30062600006") And creditOrDebit = "D" Then
b = True
End If
Next i
p.stopTimer ("or_and")
p.printReport
End Sub
5次运行的结果(1m循环的毫秒数):
20-Jun-2012 19:28:25
nested_ifs(x1):156 - 上次运行:156 - 平均运行:156
or_and(x1):125 - 上次运行:125 - 平均运行:12520-Jun-2012 19:28:26
nested_ifs(x1):156 - 上次运行:156 - 平均运行:156
or_and(x1):125 - 上次运行:125 - 平均运行:12520-Jun-2012 19:28:27
nested_ifs(x1):140 - 上次运行:140 - 平均运行:140
or_and(x1):125 - 上次运行:125 - 平均运行:12520-Jun-2012 19:28:28
nested_ifs(x1):140 - 上次运行:140 - 平均运行:140
or_and(x1):141 - 上次运行:141 - 平均运行:14120-Jun-2012 19:28:29
nested_ifs(x1):156 - 上次运行:156 - 平均运行:156
or_and(x1):125 - 上次运行:125 - 平均运行:125
注意强>
如果creditOrDebit
不是"D"
,则JP的代码运行得更快(大约60毫秒,而/和代码为125毫秒)。
答案 2 :(得分:1)
我喜欢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
这可能会节省一些CPU周期,因为如果creditOrDebit
为<> "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
我必须拥有一台速度慢的计算机,因为1,000 {00}}'测试时,1,000,000次迭代无法接近~200 ms。我必须将迭代限制为10,000 - 嘿,我还有其他事情要做:)
运行上述程序10次后,我的程序只有20%的时间更快。但是,当速度较慢时,表面速度较慢。然而,正如assylias指出的那样,当creditOrDebit
为<>"D"
时,我的程序至少快两倍。我能够在1亿次迭代中合理地测试它。
为什么我重构它 - 使逻辑短路,以便在origNum
时不需要评估creditOrDebit <> "D"
。
此时,其余部分取决于OP的电子表格。如果creditOrDebit
可能等于D,则使用assylias'过程,因为它通常会运行得更快。但是,如果creditOrDebit
具有各种可能的值,并且D
不太可能是目标值,我的程序将利用它来防止不必要地评估其他变量。