在 Excel 中禁用 ROUND 函数
Disable ROUND function in Excel
作为 的扩展,我正在尝试设计一些控件来防止我实验室中的用户使用 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
新局部值的正确方法是什么,同时仍然 RoundEven
提取 VBA 的默认舍入方法。
我不确定这是否可行,但请尝试使用:Application.WorksheetFunction.Round
获取原始函数。 (希望您所做的不会覆盖它)。
为什么不简单地覆盖 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
我认为您无法编写自己的 ROUND
函数并用它替换 Excel 的函数。我刚刚在 2010 年尝试过。我的和 Excel 都出现在智能感知中,但无论我选择哪个,它都评估为内置 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
如果您只关心一个 sheet,这在 sheet 的模块中。您需要 ThisWorkbook 模块或带有 Application 变量声明 WithEvents 的自定义 class 模块,具体取决于您需要的范围有多广。
这肯定适用于简单的东西,但我很确定在某些情况下会破坏它。
您可以做的另一件事是在关键时刻之前验证公式。不是实时修复问题,而是在提交工作之前检查工作sheet 中的每个单元格(或任何关键事件)。您可以使用 ThisWorkbook BeforeSave 事件来阻止用户保存,例如,如果其中有任何带有 ROUND(
的公式。
作为 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
新局部值的正确方法是什么,同时仍然 RoundEven
提取 VBA 的默认舍入方法。
我不确定这是否可行,但请尝试使用:Application.WorksheetFunction.Round
获取原始函数。 (希望您所做的不会覆盖它)。
为什么不简单地覆盖 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
我认为您无法编写自己的 ROUND
函数并用它替换 Excel 的函数。我刚刚在 2010 年尝试过。我的和 Excel 都出现在智能感知中,但无论我选择哪个,它都评估为内置 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
如果您只关心一个 sheet,这在 sheet 的模块中。您需要 ThisWorkbook 模块或带有 Application 变量声明 WithEvents 的自定义 class 模块,具体取决于您需要的范围有多广。
这肯定适用于简单的东西,但我很确定在某些情况下会破坏它。
您可以做的另一件事是在关键时刻之前验证公式。不是实时修复问题,而是在提交工作之前检查工作sheet 中的每个单元格(或任何关键事件)。您可以使用 ThisWorkbook BeforeSave 事件来阻止用户保存,例如,如果其中有任何带有 ROUND(
的公式。