VBA:带implements关键字的条件编译

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列为参考(即,在工具->参考…)中 我已成功地将该接口

如果接口位于外接程序中,是否可以将编译器条件常量与“implements”关键字一起使用

我的工作簿中的类模块中有以下内容,我们称之为book1:

#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,不,我没有,我在工作簿中更改了代码,因此我只在
中调用外接程序,而不是在
函数
中调用外接程序,这意味着,尽管关闭外接程序时它可能无法正确编译,我在尝试打开工作簿时没有遇到错误。如果我真的想办法解决问题(我现在没时间了),我会让你知道的。