source

IF 문 내의 "및" 및 "또는" 문제

manysource 2023. 6. 19. 21:43

IF 문 내의 "및" 및 "또는" 문제

If 문 안에서 "And" & "Or"를 사용하려고 합니다.제가 구문을 잘못 알고 있는 것 같습니다.

데이터가 참으로 만들어야 하는 경우 결과가 거짓으로 반환됩니다.코드는 다음과 같습니다.

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

'do things here

End If

-디버깅을 하고 이 줄에 올 때, 그것은 그것을 뛰어넘어 들어가지 않습니다.

-origNum은 실제로 "006260006"이고 creditOrDebit = "D"입니다.

- 그래서 제 "Or" 진술이 작동하지 않는 것 같습니다.

-이 질문이 쉽고 빠르게 진행되기를 바랍니다.감사합니다!

문제는 아마도 다른 곳에 있을 것입니다.예를 들어 이 코드를 사용해 보십시오.

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/filename 중 하나라도 참이면 실행되지 않습니다.)

이것은 답변이 아니라 댓글을 달기에는 너무 깁니다.

JP의 답변/댓글에 답하여 아래 테스트를 실행하여 두 방법의 성능을 비교하였습니다.Profiler객체는 사용자 정의 클래스이지만 요약하면 상당히 정확한 커널32 함수를 사용합니다.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 루프의 경우 ms):

20-2012년 6월 19:28:25
중첩_ifs(x1): 156 - 마지막 실행: 156 - 평균 실행: 156
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 125

20-2012년 6월 19:28:26
중첩_ifs(x1): 156 - 마지막 실행: 156 - 평균 실행: 156
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 125

20-2012년 6월 19:28:27
nested_ifs(x1): 140 - 마지막 실행: 140 - 평균 실행: 140
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 125

20-2012년 6월 19:28:28
nested_ifs(x1): 140 - 마지막 실행: 140 - 평균 실행: 140
or_and (x1): 141 - 마지막 실행: 141 - 평균 실행: 141

20-2012년 6월 19:28:29
중첩_ifs(x1): 156 - 마지막 실행: 156 - 평균 실행: 156
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 125

메모

한다면creditOrDebit아닙니다"D"JP의 코드는 더 빨리 실행됩니다(또는 코드의 경우 약 60ms 대 125ms).

는 아시리아의 답변이 마음에 들지만, 다음과 같이 리팩터링하고 싶습니다.

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,000번의 반복이 아시리아의 테스트와 마찬가지로 200ms 가까이 걸리지 않았기 때문에 느린 컴퓨터가 필요합니다.저는 반복 횟수를 10,000회로 제한해야 했습니다 -- 이봐요, 저는 다른 할 일이 있어요 :)

위의 절차를 10회 실행한 후, 나의 절차는 그 시간의 20%만 더 빠릅니다.하지만, 그것이 더 느릴 때는 표면적으로 더 느릴 뿐입니다.하지만 아시리아가 지적했듯이, 다음과 같은 경우.creditOrDebit이라<>"D"내 절차는 적어도 두 배는 빠릅니다.저는 그것을 1억번의 반복으로 합리적으로 테스트할 수 있었습니다.

그리고 그것이 제가 그것을 리팩터링한 이유입니다 - 논리를 단락시키기 위해.origNum다음의 경우 평가할 필요가 없습니다.creditOrDebit <> "D".

이 시점에서 나머지는 OP의 스프레드시트에 따라 달라집니다.한다면creditOrDebit일반적으로 더 빨리 실행되기 때문에 D와 같을 가능성이 높습니다.하지만 만약에creditOrDebit가능한 값의 범위가 광범위합니다.D더 이상 목표값이 될 가능성이 없으므로 다른 변수를 불필요하게 평가하지 않도록 이를 활용합니다.

언급URL : https://stackoverflow.com/questions/11123191/and-and-or-troubles-within-an-if-statement