2014-03-05 2 views
4

VBA에서 셀에 오류 값이 들어 있는지 여부를 확인하려고합니다. 잘못된 기능으로 인해 기존 코드는 Excel.WorksheetFunction.IsError 메서드를 사용하지만 최근에 거짓 긍정을 유발 한 사례를 발견했습니다. 셀에 오류 값이 없지만 Excel.WorksheetFunction.IsError는 true를 반환합니다. 다른 방법 인 VBA.Information.IsError는이 동작을 나타내지 않습니다. 올바르게 false를 반환합니다.Excel VBA WorksheetFunction.IsError false positive

셀에 255자를 초과하는 값이있는 경우에만 문제가 발생한다고 판단 할 수있었습니다. 여기에 동작 확인하는 루틴 : 위의 루틴은 엑셀 2010 년에 작성 및 Excel 2007 대상 응용 프로그램에서 검증 된

Sub IsErrorBehavior() 
    Dim i As Long 
    Dim str As String 
    Dim r1 As Range, r2 As Range 
    Dim xlWSFuncCheck1 As Boolean, xlWSFuncCheck2 As Boolean 
    Dim vbaInfCheck1 As Boolean, vbaInfCheck2 As Boolean 

    str = WorksheetFunction.Rept("A", 255) 

    Set r1 = Range("A1") 
    r1.Value = str 
    xlWSFuncCheck1 = Excel.WorksheetFunction.IsError(r1) 
    vbaInfCheck1 = VBA.Information.IsError(r1) 

    str = str & "A" 

    Set r2 = Range("A2") 
    r2.Value = str 
    xlWSFuncCheck2 = Excel.WorksheetFunction.IsError(r2) 
    vbaInfCheck2 = VBA.Information.IsError(r2) 
End Sub 

현재 질문 1 엑셀 2007에서

실행 :인가 이 버그 또는이 경우 Excel.WorksheetFunction.IsError의 동작에 대한 합리적인 설명이 있습니까?

VBA.Information.IsError 메서드로 전환 할 예정입니다.하지만 이제는 버그가 발생할 수 있으므로 걱정이됩니다. 어느 날 나를 이끌어 ...

질문 2 : 특정 셀에서 오류를 확인하는 더 확실한 방법이 있습니까?

+0

ISERROR 작업을 할 때이 버그가

=1-NORM.S.VERT(42, TRUE) 

로,뿐만 아니라 같은 다른 Excel 함수에 존재하지만주의를 권합니다 여부를 몰라? – Ioannis

+0

죄송합니다. 모범생 오류입니다. 위에 버전 정보를 추가했습니다. –

+1

아래 답변은 @loannis입니다. 'WSF.IsError'를 사용할 때, 범위가 아닌 오류에 대해'.Value'를 검사해야합니다. 또한'VBA.Info.IsError'는'WSF.IsError' 라우트를 실행하는 것보다 훨씬 신뢰성이 높습니다. 왜냐하면 전자는 'Range'를 오류를 올바르게 확인할 수 있기 때문입니다. 예제는 [this] (http://picpaste.com/pics/Capture-vRy1sAD3.1394060144.GIF)를 참조하십시오. – Manhattan

답변

3

Excel 2007에 대한 완전한 대답은 아니지만 다른 동료가 후속 조치를 취할 수있는 몇 가지 아이디어를 제공 할 수 있습니다.

질문 1는 : Is this a bug or is there a reasonable explanation for the behavior of Excel.WorksheetFunction.IsError in this case?

최신 버전에서 수정 될 예정 된 255 character limit와 오래 알려진 버그가 수 있도록이 사용된다. 귀하의 이슈는 매우 유사한 성격을 가지므로 동일한 소스 일 수 있습니다. 물론 말할 수는 없습니다.

이 설정 이상 255 자 String 동일한 RangeValue 자체를 Range를 손상하고, 거짓 RangeIsError 검사를하게 보인다.

질문 2 : Is there a more reliable way to check for errors in a specific cell?

내가 즉 대신 r2r2.Value을 확인하고합니다 (VBAIsError 임) IsError 기능을 사용하여, CPearson's website에서로 할 것보다 안정적인 성능을 가지고있다. 일반적으로 Range 개체에 오류가 있는지 검사하는 것은 까다로운 작업 일 수 있습니다. this question에 얼마 전에 백그라운드에서 진행되는 유형 캐스팅 때문에 재미있는 결과를 얻었습니다. 나는 이것이 여기에서도 마찬가지일지도 모른다라고 생각한다. 어쨌든 명시 적 도움이되는 것입니다 (r2.value이 대신 사용되면 예상대로 작동합니다).

+0

+1 : 현장에서. – Manhattan

+1

[질문에 대한 답변] (http://stackoverflow.com/a/16743718/3385503)의 기본 속성과 관련된 내용은 매우 계몽 적이었습니다. 'Value'에 대한 검사를 명시 적으로 만드는 것은 기본 속성 메카니즘에 의존하는 것보다 낫습니다. –

0

이 오류가 발생했으며 우리의 경우 ".value"의 사용 또는 누락과 관련이 없습니다.

은 가정 A1 셀에, 당신은 Excel에서 셀 값으로 0.000000을 반환 있도록

=1-BINOM.DIST(35, 76, 0.1, TRUE) 

결과 확률, 소문자입니다 입력합니다.

그러나 다음 VBA를 사용할 때

IsError(ActiveSheet.Range("A1").Value) 

VBA가 TRUE를 반환합니다 테스트합니다. 아마도 이것은 Excel에서 수식의 반환 값이 정확하게 계산되도록 0에 가까워짐을 인식하는 내부 반올림 오류 검사 때문일 수 있습니다.

Excel은 오류 또는 경고없이 반환 값을 셀 값으로 표시하지만 VBA는 IsError()에서 TRUE를 반환하므로 불행한 상황입니다. 난 당신이 사용하는 엑셀 버전().