使用VBA功能清洁细胞

时间:2013-04-28 12:36:51

标签: excel-vba vba excel

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

2 个答案:

答案 0 :(得分:6)

  

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

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

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

作为最佳实践,使用子例程来操作对象,并使用函数来返回值 - 无论是表单还是子例程。

  

我该如何解决这个问题?

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

答案 1 :(得分:4)

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

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

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

有关详细信息,请阅读前面提供的链接。 enter image description here