【问题标题】:VBA function returns wrong decimal valuesVBA 函数返回错误的十进制值
【发布时间】:2025-12-22 16:50:07
【问题描述】:

底部的两个函数都返回错误的值。

示例:对于142.22 的员工部分,答案应该是165.64,而不是VBA 函数返回的165.39

同样,对于第二个函数,对于5048.94 - EmployerMPPportion,答案应该是50999.41,而答案是返回51000

我知道我使用了四舍五入函数,但它只能四舍五入到小数点后 2 位?

我刚刚在论坛中看到 “BCD 的空间效率不是很高,但在这种情况下,你必须为准确性做出权衡”,如果这是真的,那为什么Excel 的内置函数总是返回正确的值?它们不是用 VBA 设计的吗?

Function MPPemployer (EmployeeMPPportion As Long)
    Dim c As Double
    c = Round((EmployeeMPPportion / (8.5 / 100) * (9.9 / 100)), 2)
    MPPemployer = c
End Function

Function Grossmppsalary (EmployerMPPportion As Long)
    Dim g As Double
    g = Round((EmployerMPPportion / (9.9 / 100)), 2)
    Grossmppsalary = g
End Function

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您应该定义函数返回的内容并将参数的输入类型更改为双精度。原因的答案是该函数在计算之前将输入四舍五入为 Long。

    Function MPPemployer(EmployeeMPPportion As Double) As Double
        Dim c As Double
    
        c = Round((EmployeeMPPportion / (8.5 / 100) * (9.9 / 100)), 2)
    
        MPPemployer = c
    End Function
    
    Function Grossmppsalary(EmployerMPPportion As Double) As Double
        Dim g As Double
    
        g = Round((EmployerMPPportion / (9.9 / 100)), 2)
    
        Grossmppsalary = g
    End Function
    

    【讨论】:

    • @peter-感谢您的快速回复。 ,我只是复制粘贴您的代码进行测试,即不幸的是代码仍然给我同样的错误答案?
    • @CAAmanGhotra 如果您将这些用作 UDF(即从 Excel 中的单元格调用),仅更新代码不足以更新单元格中的值 - 您需要强制单元格为重新计算,以便它运行新代码。尝试编辑包含公式的单元格,然后按回车键(不做任何更改)——这将重新计算它。
    • ...或按 Ctrl+Shift+Alt+F9
    • @TimWilliams 我不记得哪个 F9 组合键做了什么:D
    • @CAAmanGhotra(不要忘记✓ Accept 一个有助于解决您问题的答案...您将获得 +2 评价,并且答案的作者得到 +15 代表!一旦达到 15 声望,你可以 ▲ Upvote任何有帮助的答案,这也会奖励作者,并使整个 Stack Overflow 社区受益!)