2017-02-21 3 views
0

私はBOL番号を計算し、最初の10桁だけを取る関数を持っています。この計算では小数点はどこですか?

ここにコードがあります。

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 

ここに私が渡している値があります。 iYearSuffixは7、sFromZipcodeは78224、sToZipCodeは78224、iWeightは410、iShowIDは1です。これは3098352701017600と計算されるので、最後の文字列は7309835270でなければなりません。これは7桁目と7桁目の9桁です。

どこから来た小数はありますか?私が得ている答えは:73.0983527です。

+1

あなたは書式設定を確認しましたこのコードに取り込まれている各セルに?私が考えることができるのは、あなたが意図していない7オーダーで、1未満と見なされる値を引っ張っているということです。 – Cyril

+1

数値がExcelで大きくなりすぎると科学的な表記法に切り替わりますので、おそらく3.0983527E + 10かそのようなものでしょう –

+0

とにかくそれを科学的に変換するには?私はExcelの数式と同じ数式を使用する場合、私は私のカスタム関数を使用するまでそれが間違って行うまで、それは正しいと計算されます。 –

答えて

2

文字列の処理、数値操作、文字列と数字の間の暗黙のキャスト、VBA、WorksheetFunction、および巨大な数値を混在させています。おそらく何がうまくいかないでしょうか?

VBAでUDFを作成する場合は、VBAで記述します。あなたはVariantとしてそれを宣言して、明示的に強制することを強制するために、計算をキャストする必要がありますので、あなたの結果を格納するのに十分な大きさだけデータ型は、Decimalになるだろう:

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

ありがとう!また、関数呼び出しでドル記号は何を意味しますか? 「右$」?私はそれをグーグルしようとしましたが、セル参照の数式にドル記号を使用した結果しか表示されません。 –

+1

@JozemiteApps - 関数の型ヒントです。文字列処理関数の束は 'String'を返すバージョンと' Variant'を返すバージョンを持っています。 '$'はそれを返す 'String'を指定します。 [ドキュメントの追加情報](http://stackoverflow.com/documentation/vba/877/declaring-variables/2960/type-hints)があります。 – Comintern

関連する問題