Excel 使用VBA功能清洁电池

Excel 使用VBA功能清洁电池,excel,vba,Excel,Vba,我想创建一个VBA函数,myFunction(),,它将内容写入单元格,计算完成后,它将清除它写入的所有数据。(我想从带有=myFunction()的单元格中调用它)要清除内容,我将这一行放在末尾,以便在完成之前进行清理: ActiveSheet.Range("$A$1:$B$9").ClearContents 问题是,它不能清除任何内容。但是,我注意到,如果我将该行放在子例程的上面,然后将该子例程指定给按钮,那么当我单击该按钮时,内容将被清除 当我从程序“MicrosoftVisualBas

我想创建一个VBA函数,
myFunction(),
,它将内容写入单元格,计算完成后,它将清除它写入的所有数据。(我想从带有
=myFunction()
的单元格中调用它)要清除内容,我将这一行放在末尾,以便在完成之前进行清理:

ActiveSheet.Range("$A$1:$B$9").ClearContents
问题是,它不能清除任何内容。但是,我注意到,如果我将该行放在子例程的上面,然后将该子例程指定给按钮,那么当我单击该按钮时,内容将被清除

当我从程序“MicrosoftVisualBasic”的窗口(使用“播放”按钮)运行代码时,代码工作正常(内容被清除),但当我从单元格调用函数时,清理部分不再工作。 代码如下:

Function myFunction()
  ActiveSheet.Range("$A$1:$B$9").Clear
End Function
当我在单元格中单击并键入
=myFunction()
时,$a$1:$B$9范围内的内容不会被清除。 但是,如果我创建一个子例程(而不是函数),并用按钮调用它,则内容将被清除


为什么被myFunction()调用时它不能工作?如何解决此问题?

您可以使用事件而不是UDF。请在任何工作表代码部分填写以下代码

上面的代码类似于一种变通方法。当excel界面更改范围(“A1:B9”)中的值时,将触发此事件

由工作表单元格中的公式调用的用户定义函数无法更改Microsoft Excel的环境。这意味着该函数不能执行以下任何操作:

  • 在电子表格上插入、删除或格式化单元格
  • 更改另一个单元格的值
  • 将工作表移动、重命名、删除或添加到工作簿中
  • 更改任何环境选项,例如计算模式或屏幕视图
  • 向工作簿中添加名称
  • 设置属性或执行大多数方法
有关更多详细信息,请阅读前面提供的链接。

为什么被myFunction()调用时它不能工作

从工作表调用的函数无法操作工作表上的对象,它只能向调用该函数的单元格返回值。我相信这是为了防止循环引用和无限循环

漏洞在于从子例程中调用的函数可以操作工作表对象,但这可能不是一个好习惯

作为最佳实践,使用子例程来操作对象,而函数仅返回值——无论是返回到工作表还是返回到子例程

我怎样才能解决这个问题


@上述桑托什的回答应该可以解决问题。

这是一个非常常见的问题。搜索Google:)使用ActiveSheet.Range($A$1:$B$9)。Clear@Santosh:不能从excel公式执行此操作/UDF@Santosh它不起作用。请看我的编辑2;p@user1493046你能粘贴MyFunction的代码吗?我粘贴了代码,但是我该怎么处理它呢?我需要它从一个单元格运行,但既然它是一个子程序,我想它不能?好吧,但我需要在某个地方调用它,不是吗?因为简单地粘贴它没有任何作用。@user1493046它是一个工作表_更改事件,当范围(“A1:B9”)中的值更改时,以及您可以在该更改事件中写入的任何逻辑时,会触发该事件。很遗憾,事件没有触发。谢谢你的帮助;p@user1493046我用截图更新了答案。我希望有帮助。
 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