如何在VBA中使用以编程方式创build的工作表函数

在使用编程创build的函数之前是否需要“注册”或“重新编译”function?

当我添加一个函数到工作表,我不能使用它,直到控制返回到工作表。

例如:如果我的代码将一个函数添加到工作表,然后尝试使用它我得到以下错误:运行时错误438 – 对象不支持此属性或方法当我看工作表的代码的function是那里,如果我运行的代码只使用创build的function,没有错误。

在创build它们之后,我怎样才能使用这些function,而不是先停下来?

下面是代码中的一个例子 – 当我运行TestingWorkSheetFunctions时出现错误,但在创build函数后运行TestWorkSheetFunction时出现错误。

示例假定至less有两张工作表(工作表1和工作表2)

Option Explicit Public Sub TestingWorksheetFunction() AddWorkSheetFunction TestWorkSheetFunction End Sub Public Sub AddWorkSheetFunction() 'Sheet1's Function Dim strFunctionCode As String strFunctionCode = _ "Public Function HelloWorld() as string" & vbCrLf & _ vbCrLf & _ vbTab & "HelloWorld = ""Hello World from Sheet 1""" & vbCrLf & _ vbCrLf & _ "End Function" ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet1").CodeName).CodeModule.AddFromString strFunctionCode 'Sheet2's Function strFunctionCode = _ "Public Function HelloWorld() as string" & vbCrLf & _ vbCrLf & _ vbTab & "HelloWorld = ""Hello World from Sheet 2""" & vbCrLf & _ vbCrLf & _ "End Function" ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet2").CodeName).CodeModule.AddFromString strFunctionCode End Sub Public Sub TestWorkSheetFunction() Dim wsWorksheet1 As Object Set wsWorksheet1 = ThisWorkbook.Sheets("Sheet1") Dim wsWorksheet2 As Object Set wsWorksheet2 = ThisWorkbook.Sheets("Sheet2") MsgBox wsWorksheet1.HelloWorld() MsgBox wsWorksheet2.HelloWorld() End Sub 

我认为这里的问题是你的vba被添加到工作表中,并且没有被编译,所以当你的代码的其余部分试图访问这个函数的时候,它们被写入,而不是程序的一部分。 这可以看到,当你再次运行代码,一切工作正常。

请尝试将以下过程中的代码切换到:

 Public Sub TestingWorksheetFunction() AddWorkSheetFunction Application.OnTime Now, "TestWorkSheetFunction" End Sub 

这样,vba将运行代码的第一部分并释放进程,然后立即调用“TestWorkSheetFunction”过程。 重要提示:这是解决您的问题的方法,这可能不是最好的解决scheme,但它可能适用于您的特定情况。

Excel无法在单元格公式中调用“子”例程。 您需要使用模块下的函数过程来创build它们,以确保它对整个文档是全局可用的。

 Public Function testFunc() Code here End Function 

现在,您可以使用表格或其他程序中的function。

您的函数可以在其代码块中调用其他子和函数types的过程。