Vba 在Excel中禁用舍入函数
作为扩展,我正在尝试设计一些控件,以防止实验室中的用户使用Excel的Vba 在Excel中禁用舍入函数,vba,excel,rounding,Vba,Excel,Rounding,作为扩展,我正在尝试设计一些控件,以防止实验室中的用户使用Excel的舍入功能(操作过程要求我们使用舍入到偶数/银行家舍入方法) 我发现编写函数以获得正确的舍入值相当简单 Function RoundEven(num, precision) RoundEven = Round(num, precision) End Function 除此之外,我想做的是完全禁用ROUND功能。我试着加上 Function Round() Round = "Bad Rounding Technique"
舍入
功能(操作过程要求我们使用舍入到偶数/银行家舍入方法)
我发现编写函数以获得正确的舍入值相当简单
Function RoundEven(num, precision)
RoundEven = Round(num, precision)
End Function
除此之外,我想做的是完全禁用ROUND
功能。我试着加上
Function Round()
Round = "Bad Rounding Technique"
End Function
但这会重写RoundEven
中的舍入方法,因此我尝试的任何舍入最终都会返回“糟糕的舍入技术”消息
当仍然使用
RoundEven
pull VBA的默认舍入方法时,分配Round
一个新的局部值的正确方法是什么。我不确定这是否有效,但请尝试使用:Application.WorksheetFunction.Round
获取原始函数。(希望你所做的不会超越它)
为什么不简单地覆盖
Round
函数,忘记roundevent呢?这对您有用吗
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都显示在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模块或带有应用程序变量declare WithEvents的自定义类模块,具体取决于您需要的范围有多广
这对简单的东西肯定有用,但我很确定有些情况会破坏它
你可以做的另一件事是在关键时刻之前验证公式。不要实时解决问题,只需在提交工作表之前检查工作表中的每个单元格(或任何关键事件)。您可以使用ThisWorkbook BeforeSave事件来阻止用户保存,例如,如果存在任何带有
舍入的公式(
在其中。我意识到这可能不切实际,但在许多方面,你最好完全避免使用Excel。同意!这是一个权宜之计,直到数据库完成。我们将在明年逐步淘汰这些工作表。但合规性并没有那么耐心。如果我理解正确,Application.WorksheetFunction.Round
将调用Excel的舍入方法,这将有效地将VBA的舍入重新定义为Excel舍入。这种理解实际上就是我没有尝试它的原因,我的理解不正确吗?此外,我不想为了验证目的重写舍入
。如果重写舍入
,则很难判断rect例程已经就绪。禁用Round
并实现RoundEven
可以更轻松地确定电子表格是否使用了正确的舍入算法。现在就开始处理。按原样,它不起作用,但我可能能够解决。没错,Excel不会让我覆盖它的Round
功能。这很有道理,但也让我难过。