在 Excel 中禁用 ROUND 函数

Disable ROUND function in Excel

作为 的扩展,我正在尝试设计一些控件来防止我实验室中的用户使用 Excel 的 ROUND 功能(操作程序要求我们使用 round-to-even/banker 的舍入方法。

我发现编写获得正确舍入的函数相当简单

Function RoundEven(num, precision)
  RoundEven = Round(num, precision)
End Function

除此之外我还想做的是完全禁用 ROUND 功能。我尝试添加

Function Round()
  Round = "Bad Rounding Technique"
End Function

但这覆盖了 RoundEven 中的舍入方法,因此我尝试的任何舍入最终都会返回 "Bad Rounding Technique" 消息。

分配 Round 新局部值的正确方法是什么,同时仍然 RoundEven 提取 VBA 的默认舍入方法。

我不确定这是否可行,但请尝试使用:Application.WorksheetFunction.Round 获取原始函数。 (希望您所做的不会覆盖它)。


为什么不简单地覆盖 Round 函数而忘记 RoundEven?

这对你有用吗?

dim callingFunctionName as string ' we need a global variable to let Round know who is calling it

Function RoundEven(num, precision)
  callingFunctionName  = "RoundEven"
  RoundEven = Round(num, precision)
End Function

   '' Disable Round function from callers other than RoundEven (In fact you can have a safelist of functions that can call this function now)
Function Round()
  if callingFunctionName   = "RoundEven" then 
    '' allow Round here
  else
     Round = "Bad Rounding Technique"
  end if
End Function

我认为您无法编写自己的 ROUND 函数并用它替换 Excel 的函数。我刚刚在 2010 年尝试过。我的和 Excel 都出现在智能感知中,但无论我选择哪个,它都评估为内置 ROUND.

您可以使用更改事件将 ROUND 的任何实例更改为 `ROUNDEVEN'

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rCell As Range

    For Each rCell In Target.Cells
        Application.EnableEvents = False
            rCell.Formula = Replace$(rCell.Formula, "ROUND(", "ROUNDEVEN(")
        Application.EnableEvents = True
    Next rCell

End Sub

如果您只关心一个 sheet,这在 sheet 的模块中。您需要 ThisWorkbook 模块或带有 Application 变量声明 WithEvents 的自定义 class 模块,具体取决于您需要的范围有多广。

这肯定适用于简单的东西,但我很确定在某些情况下会破坏它。

您可以做的另一件事是在关键时刻之前验证公式。不是实时修复问题,而是在提交工作之前检查工作sheet 中的每个单元格(或任何关键事件)。您可以使用 ThisWorkbook BeforeSave 事件来阻止用户保存,例如,如果其中有任何带有 ROUND( 的公式。