在Excel中禁用ROUND函数

作为这个问题的延伸,我试图devise一些控制,以防止我实验室的用户使用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”消息。

什么是正确的方法来分配一个新的本地价值,同时还有RoundEven拉VBA的默认舍入方法。

我不认为你可以编写自己的ROUND函数,并取代Excel。 我刚刚在2010年尝试过。我和Excel都以智能感知forms出现,但无论我select哪一个,它都是作为内置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模块或具有Applicationvariables的自定义类模块声明WithEvents,具体取决于您需要的范围有多大。

这对于简单的东西肯定会起作用,但是我相信有一些情况会打破它。

你可以做的另一件事是在一些关键时刻之前validation公式。 而不是实时解决问题,只需在提交之前检查工作表中的每个单元格(或任何关键事件)即可。 您可以使用ThisWorkbook BeforeSave事件来防止用户保存,例如,如果有任何具有ROUND(公式ROUND(在其中)。

我不确定这会工作,但尝试使用: Application.WorksheetFunction.Round获取原始function。 (并希望你所做的不会覆盖它)。


你为什么不简单地重写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