2017-11-03 6 views
2

Ich habe eine einfache Fehlerprüfung Problem. Zu Beginn meines Subs sorge ich dafür, dass ein Bereich 100% ergibt. Ich tue das, indem ich den Wert einer Zelle "F3" benutze, indem ich Range.value benutze und es als ein Doppeltes speichere. F3 enthält eine SUM-Formel, die einen anderen Bereich überprüft.Fehlerbehandlung mit Doppel funktioniert nicht - VBA Excel

Ich kann sehen, dass im lokalen Fenster der Wert der Doppel 1 ist (weil die Werte zu 100% addieren), jedoch der Code immer noch in die If-Anweisung unten und verlässt die Sub.

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 

Ist das ein Problem mit einem Doppel auf diese Weise oder etwas?

Antwort

3

double oder eine Fließkommazahl in Computersprachen ist ein bekanntes Problem. Daher sollten Sie niemals doppelte Werte vergleichen. Oder Sie sollten vorsichtig sein, wenn Sie das tun. In Ihrem Fall verwenden so etwas wie:

If Abs(alloc-1) > 0.000000001 Then

Mehr lesen hier: Floating point inaccuracy examples

Im Allgemeinen zu verstehen, was geschieht, versuchen Sie den folgenden Code in einer neuen Excel-Arbeitsmappe:

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 

Sie werden Folgendes in der Konsole haben:

1 
False 
-1,11022302462516E-16 

Es bedeutet, dass cntSum ist 1 (erste Zeile), aber es ist nicht gleich 1 (zweite Zeile) und der absolute Unterschied zwischen ihm und 1 ist -1,11~E-16.

In Excel verwenden Sie das Format Currency. Fügen Sie diese Zeile:

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

nach dem Cells.Clear Code und führen Sie es erneut. Jetzt ist das Ergebnis anders.

Verwandte Themen