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 - 평균 실행: 12520-2012년 6월 19:28:26
중첩_ifs(x1): 156 - 마지막 실행: 156 - 평균 실행: 156
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 12520-2012년 6월 19:28:27
nested_ifs(x1): 140 - 마지막 실행: 140 - 평균 실행: 140
or_and (x1): 125 - 마지막 실행: 125 - 평균 실행: 12520-2012년 6월 19:28:28
nested_ifs(x1): 140 - 마지막 실행: 140 - 평균 실행: 140
or_and (x1): 141 - 마지막 실행: 141 - 평균 실행: 14120-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
'source' 카테고리의 다른 글
서로 다른 Oracle DB 연결 간의 공유 트랜잭션 (0) | 2023.06.19 |
---|---|
NOLOCK과 UNCOMMITED의 차이점은 무엇입니까? (0) | 2023.06.19 |
다중값 매개변수의 기본값으로 모두 선택 (0) | 2023.06.19 |
파이썬에서 1900년 이전 날짜에 대해 strftime 유사 함수를 사용할 수 있는 방법이 있습니까? (0) | 2023.06.19 |
Git 저장소에 있는 달링 커밋과 방울은 무엇이며 그것들은 어디에서 왔습니까? (0) | 2023.06.19 |