IF语句中的“和”和“或”问题

时间:2012-06-20 15:42:46

标签: vba excel-vba excel

我正在尝试使用“And”&在If语句中的“或”。我的语法错了。

当数据真实时,结果会返回false。这是代码:

ElseIf (origNum = "006260006" Or origNum = "30062600006") And creditOrDebit = "D" Then

'do things here

End If

- 当我调试并到达此行时,它会跳过它并且不会进入。

-origNum实际上等于“006260006”而creditOrDebit =“D”。

- 所以我假设我的“或”声明不起作用。

- 希望这是一个快速简单的问题。谢谢!

3 个答案:

答案 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 - 平均运行:125

     

20-Jun-2012 19:28:26
  nested_ifs(x1):156 - 上次运行:156 - 平均运行:156
  or_and(x1):125 - 上次运行:125 - 平均运行:125

     

20-Jun-2012 19:28:27
  nested_ifs(x1):140 - 上次运行:140 - 平均运行:140
  or_and(x1):125 - 上次运行:125 - 平均运行:125

     

20-Jun-2012 19:28:28
  nested_ifs(x1):140 - 上次运行:140 - 平均运行:140
  or_and(x1):141 - 上次运行:141 - 平均运行:141

     

20-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不太可能是目标值,我的程序将利用它来防止不必要地评估其他变量。