2017-02-23 1 views
5

3 주 전부터 VBA를 배우기 시작 했으므로 언제든지 내 코드를 비판 해보십시오.VBA - IIF 문 (CDate 포함)

나는 If 문 안에 무엇을 할 IIF 문을 사용하고 싶습니다 :

Dim rng_ModPlanStart as range 
Dim QueryDate as Variant 

Set rng_ModPlanStart = ThisWorkbook.ActiveSheet.Range("AH2:AH" & LastCell) 
rng_ModPlanStart(1).Offset(-1, 0).Value = "Module Planned Start" 

    For Each cl In rng_ModPlanStart 
     QueryDate = Application.VLookup(ActiveSheet.Range("E" & cl.Row), Sheets("Chamber Schedule").Range("B:U"), 20, False) 
     If Not ((IsError(QueryDate))) Then 
     cl.Value = DateDiff("d", CDate(QueryDate), Date) 
     End If 
    Next cl 

하지만 VBA가 QueryDate을 생각하기 때문에

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

처럼 IIF를 사용하려고 오류가 날짜가 아니에요 ... CDate 기능에 의해 올바른 것이어야합니까? 내가 뭘 놓치고 있니?

+0

변형은 모든 것이 될 수 있습니다. 콘텐츠를 확인 했습니까? – RuDevel

답변

6

IIf을 (또는 거의 모든 IMHO) 사용하고 싶지는 않습니다. 문제는 IIf이 "진술"이 아니며, 기능입니다. 즉, 모든 매개 변수가 으로 계산되고 전에 IIf 함수로 전달됩니다. 그래서, (순서대로) 평가 : 관계없이 QueryDate 오류 여부 DateDiff를 호출 할 것이기 때문에 당신이 런타임 오류가 발생합니다 의미

IsError(QueryDate) 
"" 
DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True. 

합니다.

IIf은 다른 언어의 삼항 식과 같지 않으므로 guard 절에 사용할 수 없습니다.

+0

흥미 롭다. 나는 그것을 몰랐다. 철저한 설명에 감사드립니다! –

5

VBA의 논리 연산자와 마찬가지로 IIF에는 short-circuiting semantic (C 및 제품군과 다름)이 없습니다. 따라서 오류 사례는 If Then else 문과 같은 방식으로 처리되지 않습니다. 여기

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

IsError 반환 true의 경우, CDate(QueryDate)런타임 오류의 결과로,을 평가됩니다 포함하는 두 번째 경우.

+1

감사합니다. 나는 그것이 효율적으로 보였다고 생각하지만, 나는 틀렸다! –