如何防止VBA函数在代码内部重新执行

如何防止VBA函数在代码内部重新执行,vba,excel,Vba,Excel,我正在从Excel工作表调用VBA函数。当我在VBA函数的代码中更改一个单元格时,Excel会再次尝试重新执行该函数(在第二次迭代中再次执行,然后……) 示例:如果您有代码: Function test() As Variant Range("A1") = 1 test = "test" End Function 当您在任何地方使用“=test()”时,它将返回#值。调试将显示,当您更新A1时,它将尝试重新执行test() 你能阻止Excel这样做吗?例如,说“在我完成此功能之

我正在从Excel工作表调用VBA函数。当我在VBA函数的代码中更改一个单元格时,Excel会再次尝试重新执行该函数(在第二次迭代中再次执行,然后……)

示例:如果您有代码:

Function test() As Variant
    Range("A1") = 1
    test = "test"
End Function
当您在任何地方使用
“=test()”
时,它将返回
#值。调试将显示,当您更新A1时,它将尝试重新执行test()

你能阻止Excel这样做吗?例如,说“在我完成此功能之前,不要更新我的任何号码”?我尝试了
应用程序.Calculation
标志,或者做了一些外部并发检查,但似乎不起作用…

尝试:

Function test() as Variant
test="test"
End Function

回答您的具体问题,即当您更改A1或函数时,如何停止函数重新执行,并停止它返回#Value:
1。使用Excel用户界面(公式-->计算选项)将计算模式更改为手动
2。像这样在函数中添加一些错误捕获

Function test() As Variant
    On Error Resume Next
    Range("A1") = 1
    test = "test"
End Function

正如已经说过的那样,该函数不会改变A1的值,正如Gary的学生在他的评论中所说:UDF应该只改变调用该函数的单元格的工作表条目,并且该值应该作为函数的结果返回,而不是通过改变显式地址的单元格值

换句话说,这不起作用:

Function test() As Variant
    Range("A1") = 1
    test = "test"
End Function
而是从单元格A1调用
test()
,并执行以下操作:

Function test() As Variant
    test = 1
End Function

如果所需的行为是编辑多个单元格(函数和另一个单元格的返回值),则应通过
而不是
函数

来实现。不要试图从自定义项更改工作表单元格,只能通过其标题返回值。@Gary的学生有效点。通常,除了从中调用函数的单元格外,不能修改其他单元格。将其更改为Sub,您就可以了。它返回错误是因为@Gary的学生提到了什么。不允许自定义项操作工作表,并且行
范围(“A1”)=1
会导致工作表终止。调试将显示这一行失败。Gary上面提到的是您的#Value错误的原因<代码>调试将显示,当您更新A1时,它将尝试重新执行test()。
现在我很好奇为什么您的代码会再次被重新执行。您的工作簿中是否有
工作表\u Change
代码?目标不是返回“test”,这只是我能想到的更改函数内值的最简单示例。正如我所说:我已经尝试了应用程序.Calculation标志,或者做了一些外部并发检查(我想这就是错误捕获的意思),但这似乎不起作用。您是否有一些工作代码可以显示您的意思?这不起作用,OP正在尝试实现明确禁止执行的代码。OP的问题是如何在每次更改函数或其引用的单元格时停止函数返回#值并执行。这就是我的回答。