在使用编程创建的函数之前是否需要“注册”或“重新编译”功能?
当我向工作表添加一个函数时,在将控件返回到工作表之前,我无法使用它。
例如:如果我的代码将一个函数添加到工作表,然后尝试使用它我得到以下错误:运行时错误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
答案 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类型的过程。