2

我想创建一个 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() 调用时它不起作用?我该如何解决这个问题?

4

2 回答 2

6

为什么在 myFunction() 调用时它不起作用?

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

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

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

我该如何解决这个问题?

上面@Santosh 的回答应该可以解决问题。

于 2013-04-28T13:12:52.553 回答
4

您可以使用事件来代替 UDF。请将以下代码放在任何工作表代码部分。

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 的环境。这意味着这样的函数不能执行以下任何操作:

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

有关更多详细信息,请阅读前面提供的链接。 在此处输入图像描述

于 2013-04-28T12:52:40.920 回答