Я не знаю версию вашего Access, но у VBA, да и у VB есть сложности с обычной функцией Round.
Сперва определитесь, какой из основных видов округления вам нужен (симметричный, асимметричный, банковский).
Вот типовые функции.
Код:
Private Function fnADownDigits(ByVal X As Double, Optional ByVal Digits As Integer = 0) As Double
fnADownDigits = fnAsymDown(X, 10 ^ Digits)
End Function
Private Function fnAsymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
fnAsymDown = Int(X * Factor) / Factor
End Function
Private Function fnSymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
fnSymDown = Fix(X * Factor) / Factor
' Alternately:
' SymDown = AsymDown(Abs(X), Factor) * Sgn(X)
End Function
Private Function fnAsymUp(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
Dim Temp As Double
Temp = Int(X * Factor)
fnAsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor
End Function
Private Function fnSymUp(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
Dim Temp As Double
Temp = Fix(X * Factor)
fnSymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor
End Function
Private Function fnAsymArith(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
fnAsymArith = Int(X * Factor + 0.5) / Factor
End Function
Private Function fnSymArith(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
fnSymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor
' Alternately:
' SymArith = Abs(AsymArith(X, Factor)) * Sgn(X)
End Function
Private Function fnBRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
' For smaller numbers:
' BRound = CLng(X * Factor) / Factor
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special manner
If Temp - Int(Temp) = 0.5 Then
If FixTemp / 2 <> Int(FixTemp / 2) Then ' Is Temp odd
' Reduce Magnitude by 1 to make even
FixTemp = FixTemp - Sgn(X)
End If
End If
fnBRound = FixTemp / Factor
End Function
Private Function fnRandRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
' Should Execute Randomize statement somewhere prior to calling.
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special manner.
If Temp - Int(Temp) = 0.5 Then
' Reduce Magnitude by 1 in half the cases.
FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X)
End If
fnRandRound = FixTemp / Factor
End Function
Private Function fnAltRound(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
Static fReduce As Boolean
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special manner.
If Temp - Int(Temp) = 0.5 Then
' Alternate between rounding .5 down (negative) and up (positive).
If (fReduce And Sgn(X) = 1) Or (Not fReduce And Sgn(X) = -1) Then
' Or, replace the previous If statement with the following to
' alternate between rounding .5 to reduce magnitude and increase
' magnitude.
' If fReduce Then
FixTemp = FixTemp - Sgn(X)
End If
fReduce = Not fReduce
End If
fnAltRound = FixTemp / Factor
End Function
К данному коду в модуле добавляете публик функцию того округления, что вам нужно, например
Код:
Public Function fnRoundDigits(ByVal X As Double, Optional ByVal Digits As Integer = 0) As Double
fnRoundDigits = fnSymArith(X, 10 ^ Digits)
End Function
Потом связываете лист Excel с Access через связанную таблицу, названную допустим tbl_FromExcel , и создаете простой запрос:
SELECT fnRoundDigits([tbl_FromExcel].[Сумма, грн],2) AS fld_RoundedSum FROM tbl_FromExcel;
Социальные закладки