VBA:带implements关键字的条件编译
如果接口位于外接程序中,是否可以将编译器条件常量与“implements”关键字一起使用 我的工作簿中的类模块中有以下内容,我们称之为book1:VBA:带implements关键字的条件编译,vba,excel,Vba,Excel,如果接口位于外接程序中,是否可以将编译器条件常量与“implements”关键字一起使用 我的工作簿中的类模块中有以下内容,我们称之为book1: #Const Condition1 = 0 ''will be replaced with 1 when add-in is opened #if Condition1 then Implements myAddIn.iInterfaceFoo #End if 我将外接程序myAddIn列为参考(即,在工具->参考…)中 我已成功地将该接口
#Const Condition1 = 0 ''will be replaced with 1 when add-in is opened
#if Condition1 then
Implements myAddIn.iInterfaceFoo
#End if
我将外接程序myAddIn列为参考(即,在工具->参考…)中
我已成功地将该接口与外接程序中的其他类一起使用,但现在我想直接在工作簿book1中调用该接口。只要外接程序处于打开状态,当我编译book1(即调试->编译VBAPProject)时,它就会成功编译
然而,当我试图在外接程序关闭的情况下编译book1时,我得到了错误
Compile error: User-defined type not defined
这正是我试图避免的——否则,如果外接程序丢失(例如在其他人的计算机上),电子表格本身仍然可以工作。我一直在寻找,没有找到解决该问题的好方法 因此,我在另一个文件中编写了有问题的函数,如果需要,我会这样激活它: 在模块中的sp.mdb上:
Public Function soap30object() As Object
Set soap30object = New SoapClient30
End Function
在主文件上:
Public Sub soap30object()
Dim ob As Object
Dim appAccess As New Access.Application
appAccess.OpenCurrentDatabase ("c:\sp\sp.mdb")
Set ob = appAccess.Run("soap30object")
End Sub
玩得开心
另一个解决方案 在运行时替换模块中的代码
Public Sub replacemodel(mdlname As String, fnd As String, cngto As String)
Dim toi As Long, oldlin As String, i As Long, firstchr As String, linnewnum As Long, last_ As Boolean
Dim frm As Form,mdl As Module
DoCmd.OpenForm mdlname, acDesign
Set mdl = Forms(mdlname).Module
toi = mdl.CountOfLines
With mdl
For i = 1 To toi
linnewnum = i
oldlin = .lines(i, 1)
If InStr(oldlin, fnd) <> 0 Then
oldlin = Replace(oldlin, fnd, cngto)
.ReplaceLine i, oldlin
goto nexx
End If
Next i
End With
nexx:
DoCmd.Close acForm, mdlname, acSaveYes
Set mdl = Nothing
'All variables reset when you edit modul on
msgbox "Program will restart now..."
DoCmd.Quit acQuitSaveAll
end Sub
Public Sub-replacemodel(mdlname作为字符串,fnd作为字符串,cngto作为字符串)
Dim toi为长,oldlin为字符串,i为长,firstchr为字符串,linnewnum为长,last_uu为布尔
Dim frm作为表单,mdl作为模块
DoCmd.OpenForm mdlname,acDesign
设置mdl=Forms(mdlname).Module
toi=mdl.countofline
使用mdl
对于i=1到toi
linnewnum=i
oldlin=.line(i,1)
如果仪表(奥尔德林,fnd)为0,则
oldlin=更换(oldlin、fnd、cngto)
1.奥德林
goto nexx
如果结束
接下来我
以
下一步:
DoCmd.关闭acForm、mdlname、acSaveYes
设置mdl=Nothing
'编辑模块打开时,所有变量都会重置
msgbox“程序将立即重新启动…”
DoCmd.退出收购所有
端接头
感谢您的反馈,我已尝试改进此问题。我已经实例化了这个类,但这是一个编译器错误而不是运行时错误。感谢implements
上的链接,但我对它的工作方式很满意:)好吧,当条件1
为false时,您的代码甚至不应该尝试编译implements myAddIn.iInterfaceFoo
。根据是否加载加载项,将条件1
设置为true/false是否有问题?可能看到,仅此而已-它确实尝试编译实现
行,即使条件1
为假
。我来看看这些链接的答案。这是一种相当奇怪的行为。我无法复制这个。对我来说,如果条件为false,则不会编译实现
。@MichaelChad,不,我没有,我在工作簿中更改了代码,因此我只在子
中调用外接程序,而不是在函数
中调用外接程序,这意味着,尽管关闭外接程序时它可能无法正确编译,我在尝试打开工作簿时没有遇到错误。如果我真的想办法解决问题(我现在没时间了),我会让你知道的。