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

时间:2013-12-11 08:54:08

标签: excel vba excel-vba excel-2010

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

当我向工作表添加一个函数时,在将控件返回到工作表之前,我无法使用它。

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

如何在创建后立即使用这些功能,而不先停止?

以下是代码中的示例 - 我在运行TestingWorkSheetFunctions时遇到错误,但在创建函数后运行TestWorkSheetFunction时却没有。

示例假设一个新工作簿至少有两个工作表(sheet1和sheet2)

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

2 个答案:

答案 0 :(得分:2)

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

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

Public Sub TestingWorksheetFunction()

    AddWorkSheetFunction
    Application.OnTime Now, "TestWorkSheetFunction"

End Sub

这样,vba将运行代码的第一部分并释放进程,然后执行" TestWorkSheetFunction"将立即被召唤。重要提示:这是针对您的问题的解决方法,这可能不是最佳解决方案,但它可能适用于您的具体情况。

答案 1 :(得分:0)

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

Public Function testFunc()

    Code here

End Function

现在您可以在工作表或其他程序中使用该功能。

您的函数可以在其代码块中调用其他Sub和Function类型的过程。