【发布时间】:2017-07-09 06:30:42
【问题描述】:
我正在编写一个 Excel VBA 项目,该项目在代码执行期间创建新函数。
新增的功能需要能够立即执行。
虽然我确实看到添加了新功能,但我在第一次执行时收到“1004”运行时错误。
以下代码将新函数testMethod 添加到现有DynamicFunctions 模块中(如果该函数不存在)并执行它。
取自Dynamic Code Generate & Execute@VBA 和Programming The VBA Editor 的代码sn-ps
错误信息: “运行时错误‘1004’: 无法运行宏“testMethod”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用"
(注意第二次执行,该函数已经在模块中,所以代码只是执行它并弹出消息框)
Dim code As String
code = "Public Function testMethod()" & vbNewLine & _
vbTab & "MsgBox """ & Time & """" & vbNewLine & _
"End Function"
Dim methodExist As Boolean
methodExist = checkProcName("testMethod")
If (methodExist = False) Then
Dim VBComp As VBIDE.VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents("DynamicFunctions")
Call VBComp.CodeModule.AddFromString(code)
End If
Application.Run "testMethod"
Function checkProcName(sProcName As String) As Boolean
' ===========================================================================
' Found on http://www.cpearson.com at http://www.cpearson.com/excel/vbe.aspx
' then modified
'
' USAGE:
' to check if a procedure exists, call 'checkProcName' passing
' in the target workbook (which should be open), the Module,
' and the procedure name
'
' ===========================================================================
Dim oVBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim ProcName As String
Dim ProcKind As VBIDE.vbext_ProcKind
checkProcName = False
Set VBProj = ThisWorkbook.VBProject
Set VBComp = VBProj.VBComponents("DynamicFunctions")
Set CodeMod = VBComp.CodeModule
With CodeMod
LineNum = .CountOfDeclarationLines + 1
Do Until LineNum >= .CountOfLines
ProcName = .ProcOfLine(LineNum, ProcKind)
If ProcName = sProcName Then
checkProcName = True
Exit Do
End If
Debug.Print ProcName
LineNum = .ProcStartLine(ProcName, ProcKind) + .ProcCountLines(ProcName, ProcKind) + 1
Loop
End With
End Function
【问题讨论】:
-
您上面的代码是在
DynamicFunctions模块中,还是在不同的模块中? -
checkProcName在DynamicFunctions内。其他人在不同的 -
我做了一些测试,只要 DynamicFunctions 模块只为动态代码保留,它就对我有用:如果你从那里执行任何其他东西(或者甚至引用存储在那里的全局),那么你会看到你描述的错误。
-
@TimWilliams:谢谢蒂姆,这确实是问题所在。如果您想添加您的评论作为答案,我会批准它
标签: vba excel excel-2010