0

次のコードは正常に動作していますが、保存された値を最も近いペンスに丸めていません。

Public Function Fs_Update_AccInvoices_Nexum() As Boolean
    Dim adoRsInvoiceDCID As New ADODB.Recordset
    Dim adoRsNexumInvoices As New ADODB.Recordset

    On Error Resume Next
    adoRsInvoiceDCID.Open "SELECT * FROM [tInvoiceDCID] where Issued=0" _
        , CurrentProject.Connection, 2, 2
    While Not adoRsInvoiceDCID.EOF
        adoRsNexumInvoices.Open "SELECT * FROM [tPrintInvoiceNumbersNexum] " _
            & " WHERE InvoiceID=" & adoRsInvoiceDCID("InvoiceID") _
            , CurrentProject.Connection, 2, 2
        If Not adoRsNexumInvoices.EOF Then
            DoCmd.SetWarnings off
            DoCmd.RunSQL "Update [Acc Invoices t Nexum] " _
                & " SET [Total Due] = Round((Fees/0.8)+(VAT/0.8)+OutLays,2)" _
                & " Fees = Round(Fees/0.8,2), VAT = Round(Vat/0.8,2)" _
                & " WHERE Invoice=" & adoRsNexumInvoices("PrintingasINVOICE")
        End If
        adoRsNexumInvoices.Close

        adoRsInvoiceDCID.MoveNext
    Wend
    adoRsInvoiceDCID.Close
End Function

乾杯ロス

4

2 に答える 2

2

クイックノート:フォーマット関数が修正しないvbaの丸め関数のいくつかの不正確さに気づきました。私の特定のケースでは、数値3687.23486を丸めようとしていました

ラウンド(3687.23486)= 3687.23

format(3687.23486、 "#.00")= 3687.23

従来の最も近いルールへの丸めでは、これは3687.24になるはずです。丸めの問題に対処するためにさまざまなフォーラムにいくつかのカスタム関数が投稿されているのを見てきましたが、どれもうまくいかなかったので、自分で作成しました。

    Function trueRound(ByVal varNumber As Variant, ByVal intDecimals As Integer) As Double
    If IsNull(varNumber) Then
        trueRound = 0
        Exit Function
    End If
    Dim decimals As Integer, testNumber As Double
    decimals = 0
    If InStr(varNumber, ".") > 0 Then decimals = Int(Len(varNumber)) - Int(Len(Fix(varNumber)) + 1)
    If decimals = 0 Or intDecimals > decimals Then
        trueRound = varNumber
        Exit Function
    End If
    Do Until Len(varNumber) - Len(Fix(varNumber)) - 1 <= intDecimals
        testNumber = varNumber * 10 ^ (decimals - 1)
        varNumber = Round(testNumber, 0) / 10 ^ (decimals - 1)
        decimals = decimals - 1
    Loop
    trueRound = varNumber
End Function

私はそれをかなり迅速にハッシュしたので、エラー処理はなく、関数に渡されたnull値は0になります。これは、すべての状況に理想的ではない可能性があります。私はこれをかなり大きなクエリで定期的に使用しています。他の誰かに役立つことを願っています。

于 2012-10-12T19:17:56.010 に答える
1

"Round 関数は偶数への丸めを実行します。これは、より大きな丸めとは異なります。" --マイクロソフト

Debug.Print Round(19.955, 2)
'Answer: 19.95

Debug.Print Format(19.955, "#.00")
'Answer: 19.96

MS Access、VBA で丸める方法も参照してください。

于 2012-07-24T12:32:19.247 に答える