我想创建一个VBA函数myFunction(),
,它在单元格中写入内容,当计算完成时,它将清除它所写的所有数据。 (我想从=myFunction()
的单元格中调用它来清除内容,我将这行放在最后,在完成之前进行清理:
ActiveSheet.Range("$A$1:$B$9").ClearContents
问题在于它不会清除任何内容。但是,我注意到如果我将该行放在子程序中,然后将该子程序分配给一个按钮,则单击该按钮时将清除该内容。
当我从程序“Microsoft Visual Basic”的窗口运行代码(使用播放按钮)时,代码完美运行(内容被清除)但是当我从单元格调用该函数时,清洁部分不会不再工作了。 这是代码:
Function myFunction()
ActiveSheet.Range("$A$1:$B$9").Clear
End Function
当我在单元格中单击并键入=myFunction()
时,$ A $ 1:$ B $ 9范围内的内容不会被清除。
但是,如果我创建一个子例程(而不是函数),并用一个按钮调用它,则清除内容。
当myFunction()调用时,为什么它不起作用?我该如何解决这个问题?
答案 0 :(得分:6)
当myFunction()调用时,为什么它不起作用?
从工作表调用的函数无法操作工作表上的对象,它只能将值返回到调用函数的单元格。我相信这是为了防止循环引用和无限循环。
漏洞是在子例程中调用的函数可以操作工作表对象,但这可能不是一个好习惯。
作为最佳实践,使用子例程来操作对象,并使用函数来返回值 - 无论是表单还是子例程。
上面的@Santosh的答案应该可以解决问题。我该如何解决这个问题?
答案 1 :(得分:4)
您可以使用事件代替UDF。请将以下代码放在任何表格代码部分。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
If Not Intersect(Target, Range("$A$1:$B$9")) Is Nothing Then
' your code here
Range("$A$1:$B$9").Clear
End If
Application.EnableEvents = True
End Sub
上面的代码就像一个解决方法。范围(“A1:B9”)中的值从excel界面更改时将触发。
工作表单元格中的公式调用的用户定义函数无法更改Microsoft Excel的环境。这意味着这样的功能不能执行以下任何操作:
有关详细信息,请阅读前面提供的链接。