在Excel

时间:2015-07-07 20:19:24

标签: excel vba excel-vba rounding

作为对this question的延伸,我尝试设计一些控制措施,以防止我实验室中的用户使用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拉出VBA默认舍入方法的同时,为RoundEven分配新本地值的正确方法是什么。

3 个答案:

答案 0 :(得分:1)

我认为您不能编写自己的ROUND函数并将其替换为Excel。我在2010年尝试过它。我和Excel都出现在intellisense中,但无论我选择哪一个,它都会被评估为内置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

如果你只关心一张纸,这是在工作表的模块中。您需要ThisWorkbook模块或带有Application变量的自定义类模块声明WithEvents,具体取决于您需要的范围。

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

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

答案 1 :(得分:0)

我不确定这会有效,但请尝试使用:Application.WorksheetFunction.Round来获取原始功能。 (并希望你做的事情不会超越它)。

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

答案 2 :(得分:0)

这对你有用吗?

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