Rounding in MS Access

后端 未结 12 705
夕颜
夕颜 2020-11-28 14:23

Whats the best way to round in VBA Access?

My current method utilizes the Excel method

Excel.WorksheetFunction.Round(...

But I am l

12条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-28 15:15

    To solve the problem of penny splits not adding up to the amount that they were originally split from, I created a user defined function.

    Function PennySplitR(amount As Double, Optional splitRange As Variant, Optional index As Integer = 0, Optional n As Integer = 0, Optional flip As Boolean = False) As Double
    ' This Excel function takes either a range or an index to calculate how to "evenly" split up dollar amounts
    ' when each split amount must be in pennies.  The amounts might vary by a penny but the total of all the
    ' splits will add up to the input amount.
    
    ' Splits a dollar amount up either over a range or by index
    ' Example for passing a range: set range $I$18:$K$21 to =PennySplitR($E$15,$I$18:$K$21) where $E$15 is the amount and $I$18:$K$21 is the range
    '                              it is intended that the element calling this function will be in the range
    ' or to use an index and total items instead of a range: =PennySplitR($E$15,,index,N)
    ' The flip argument is to swap rows and columns in calculating the index for the element in the range.
    
    ' Thanks to: http://stackoverflow.com/questions/5559279/excel-cell-from-which-a-function-is-called for the application.caller.row hint.
    Dim evenSplit As Double, spCols As Integer, spRows As Integer
    If (index = 0 Or n = 0) Then
        spRows = splitRange.Rows.count
        spCols = splitRange.Columns.count
        n = spCols * spRows
        If (flip = False) Then
           index = (Application.Caller.Row - splitRange.Cells.Row) * spCols + Application.Caller.Column - splitRange.Cells.Column + 1
         Else
           index = (Application.Caller.Column - splitRange.Cells.Column) * spRows + Application.Caller.Row - splitRange.Cells.Row + 1
        End If
     End If
     If (n < 1) Then
        PennySplitR = 0
        Return
     Else
        evenSplit = amount / n
        If (index = 1) Then
                PennySplitR = Round(evenSplit, 2)
            Else
                PennySplitR = Round(evenSplit * index, 2) - Round(evenSplit * (index - 1), 2)
        End If
    End If
    End Function
    

提交回复
热议问题