在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