Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在Excel中禁用舍入函数_Vba_Excel_Rounding - Fatal编程技术网

Vba 在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"

作为扩展,我正在尝试设计一些控件,以防止实验室中的用户使用Excel的
舍入
功能(操作过程要求我们使用舍入到偶数/银行家舍入方法)

我发现编写函数以获得正确的舍入值相当简单

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
功能。这很有道理,但也让我难过。