Excel VBA自己的function在工作表中改变工作表上的值

我试图在一个Excel工作表中使用我自己的VBA函数,并使用相同的函数处理同一个或另一个工作表上的单元格,但结果是#VALUE! 一个最小的工作示例(Office Prof Plus 2010,32位):

 Function abc() As Integer Dim i% i = 0 Sheet1.Cells(1, 2).Value = 2 abc = i End Function 

当我执行Debug.Print abc它显然写了一个2到单元格B2 ,打印结果是0 。 我现在要做的是在Sheet1上的Sheet1A1 =abc() ,但是我只获得#VALUE! 。 顺便说一句,它不工作,如果Application.EnableEventsApplication.Calculation被禁用, 设置为手动。

两个问题:为什么? 而任何想法如何解决? 谢谢。

众所周知,您不能用UDF更新工作表(UDF中的单元除外)。 但是,有一个非常糟糕的解决方法,每次在工作表上进行更改时都会检查,如果函数碰巧是=abc()则在B1放置一个2

在一个标准模块中有你的虚拟function

 Public Function abc() As Integer abc = 0 End Function 

然后在Sheet1模块中放置下面的代码

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Target.Formula = "=abc()" Then Me.Cells(1, 2).Value = 2 End If End Sub 

这种types的用户定义函数(从单元格内调用)不能修改单元格值,而不是将值返回给包含UDF的单元格。