2012-07-24 2 views
0

다음 코드는 잘 작동하지만 저장된 값을 가장 가까운 펜스로 반올림하지는 않습니다. 예를 들어 8.025가 8.01 대신 올라오고 있습니다. 누구든지 수정 제안을 할 수 있습니까?액세스 반올림

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 

건배 로스

답변

1

"ROUND 함수는 라운드에도 큰 원형으로 상이하다 행한다." --Microsoft

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

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

How to Round in MS Access, VBA

+0

감사합니다. 가장 도움이됩니다. – Ross

+0

"# .00"을 입력하면 Round ((Fees/0.8) + (VAT/0.8) + OutLays, "# .00") 코드 오류가 발생합니다. ? – Ross

+0

# .00은 둥근이 아닌 형식으로되어 있습니다. "Format ((Fees/0.8) + (VAT/0.8) + OutLays,"# .00 ")' – Fionnuala

2

빠른 참고 사항을 참조하십시오 : 나는 포맷 기능이 해결되지 않는 기능을 반올림 VBA 년대에 일부 부정확 나타났습니다. 내 특정 경우에, 나는 가까운 규칙 전통적인 라운드에서 숫자를 3687.23486

라운드 (3687.23486) = 3687.23

형식 (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 

나는 꽤 빨리 그것을 해시, 그래서 오류 처리 및 모든 상황에 적합하지 않을 수 있습니다 0에서 함수 결과에 전달 null 값은 없습니다. 꽤 큰 쿼리에서 이것을 정기적으로 사용하여 다른 사람을 도울 수 있기를 바랍니다.

+0

반올림을위한 여러 가지 규칙이 있습니다 .. 저는 제로에서 반으로 반올림하는 방법을 특별히 찾고있었습니다 더 큰 수의 편향으로 나는 이것이 "둥근"의 가장 일반적인 방법이 아니기 때문에 "trueround"가 틀린 이름이라는 것을 알고 있습니다. 다른 어떤 것도 필요로하는 규칙에 맞게 자신의 반올림 기능을 조정하는 데 도움이 될 수는 없습니다. –