2017-11-03 19 views
2

간단한 오류 검사 문제가 있습니다. 내 하위의 시작 부분에서 범위가 최대 100 %가되도록합니다. Range.value를 사용하여 셀 "F3"의 값을 가져 와서 double로 저장하여이 작업을 수행합니다. F3에는 다른 범위를 검사하는 SUM 수식이 포함되어 있습니다.이중 처리를 사용하여 오류 처리 - VBA Excel

지역 창에서 값이 100 %로 합쳐지기 때문에 double 값은 1이지만 코드는 여전히 아래의 If 문으로 넘어 가서 하위를 종료합니다.

Sub dataCollection() 

'Define sheets 
Dim ipt As Worksheet 
Set ipt = Sheets("Input form") 

'Check that allocation is 100% 
Dim alloc As Double 
alloc = ipt.Range("F3").Value 

If alloc <> 1 Then 
    MsgBox "Error, allocation does not equal 100%" 
    Exit Sub 
End If 

... 

End Sub 

이런 식으로 두 가지를 사용하면이 문제가 발생합니까?

답변

3

double 또는 컴퓨터 언어의 부동 소수점 숫자를 사용하는 것은 잘 알려진 문제입니다. 따라서 두 값을 절대로 비교해서는 안됩니다. 또는 그렇게 할 때 조심해야합니다. 귀하의 경우, 같은 것을 사용 :

If Abs(alloc-1) > 0.000000001 Then

여기

더 읽기 : 일반적으로 Floating point inaccuracy examples

, 새 Excel 통합 문서에 다음 코드를 시도, 무슨 일이 일어나고 있는지 이해하기 :

Option Explicit 

Public Sub TestMe() 

    Dim cntSum  As Double 

    Cells.Clear 

    Cells(1, 1) = 0.3 
    Cells(2, 1) = 0.2 
    Cells(3, 1) = 0.2 
    Cells(4, 1) = 0.2 
    Cells(5, 1) = 0.1 

    cntSum = Cells(1, 1) + Cells(2, 1) + Cells(3, 1) + Cells(4, 1) + Cells(5, 1) 

    Debug.Print cntSum 
    Debug.Print cntSum = 1 
    Debug.Print cntSum - 1 

End Sub 

콘솔에 다음과 같이 표시됩니다.

1 
False 
-1,11022302462516E-16 

cntSum1 (첫 번째 줄)이지만 1 (두 번째 줄)과 같지 않으며 그와 1의 절대 차이는 -1,11~E-16입니다.

Excel에서이 문제를 해결할 수있는 방법은 Currency 형식을 사용하는 것입니다. Cells.Clear 코드 뒤에

Range("A1:A5").Style = "Currency" 

하고 다시 실행 :이 줄을 추가합니다. 이제 결과가 달라집니다.