2017-02-21 2 views
0

Ich habe eine Funktion, die eine BOL-Nummer berechnet und nur die ersten 10 Ziffern nimmt.Woher kommt die Dezimalstelle in dieser Berechnung?

Hier ist der Code.

Public Function GENERATEBOLNUMBER(iYearSuffix As Integer, _ 
           sFromZipcode As String, _ 
           sToZipCode As String, _ 
           iWeight As Integer, _ 
           iShowID As Integer) As String 

    Application.ScreenUpdating = False 

    GENERATEBOLNUMBER = VBA.Left(7 & _ 
    WorksheetFunction.RoundUp(VBA.Right(sFromZipcode, 5) _ 
    * VBA.Right(sToZipCode, 5) * iWeight * (iShowID + 1234), 0), 10) 

    Application.ScreenUpdating = True 
End Function 

Und hier sind die Werte, die ich es übergeben. 7 für den iYearSuffix, 78224 für sFromZipcode und 78224 für sToZipCode, 410 als iWeight und 1 als iShowID. All dies berechnet sich zu 3098352701017600, so dass die endgültige Zeichenfolge 7309835270 sein sollte, die die 7 als erste Ziffer und die folgenden 9 Ziffern enthält.

Woher kommt die Dezimalzahl? Die Antwort lautet: 73.0983527.

+1

Haben Sie die Formatierung überprüfen auf jede Zelle, die in diesen Code gezogen wird? Alles, was ich denken kann, ist, dass Sie Werte in weniger als 1, 7 Bestellungen weniger als beabsichtigt ziehen. – Cyril

+1

Wenn Zahlen in Excel zu groß werden, wechselt es in wissenschaftliche Notation, also ist es wahrscheinlich 3.0983527E + 10 oder so ähnlich. –

+0

Wie auch immer, um es von wissenschaftlichen konvertieren? Wenn ich die gleichen Formeln wie eine Excel-Formel verwende, wird sie korrekt berechnet, bis ich meine benutzerdefinierte Funktion benutze, wird sie es falsch machen. –

Antwort

2

Sie mischen String-Handling, numerische Manipulation, implizite Umwandlungen zwischen Strings und Zahlen, VBA, WorksheetFunction und gigantische Zahlen. Was könnte möglicherweise falsch laufen?

Wenn Sie eine UDF in VBA schreiben, schreiben Sie sie in VBA. Der einzige Datentyp groß genug, um Ihr Ergebnis zu speichern, wird ein Decimal sein, so dass Sie es als Variant erklären müssen und werfen explizit die Berechnung sie zu zwingen, zu zwingen:

Public Function GENERATEBOLNUMBER(yearSuffix As Integer, fromZip As String, _ 
            toZip As String, weight As Integer, _ 
            showId As Integer) As String 
    Dim result As Variant 
    'Calculate intermediary result. 
    result = CDec(Right$(fromZip, 5)) * CDec(Right$(toZip, 5)) * weight * (showId + 1234) 
    'Shift the decimal place 7 places to the left: 
    result = result/10^7 
    'Skip the RoundUp call - it wasn't doing anything because your result was an integer. 
    'Strip the non-integer portion: 
    result = Fix(result) 
    'Cast to a string an concatenate the "7" onto the start: 
    GENERATEBOLNUMBER = "7" & CStr(result) 
End Function 
+0

Danke! Was bedeutet das Dollarzeichen im Funktionsaufruf? 'Richtig $'? Ich habe es googlen versucht, aber es zeigen sich nur Ergebnisse über die Verwendung der Dollarzeichenformel für Zellreferenzen. –

+1

@JozemitApps - Es ist ein Tipp für die Funktion. Einige der Funktionen für die Zeichenfolgenbehandlung haben eine Version, die 'String' zurückgibt und eine Version, die eine' Variante' zurückgibt. Das '$' gibt den 'String' an und gibt eins zurück. Es gibt einige [zusätzliche Informationen in der Dokumentation] (http://stackoverflow.com/documentation/vba/877/declaring-variables/2960/type-hints). – Comintern