作为对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
分配新本地值的正确方法是什么。
答案 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