2015-03-02 7 views
5

क्या "उपकरण" कीवर्ड के साथ कंपाइलर सशर्त स्थिरांक का उपयोग करना संभव है, जहां इंटरफ़ेस एक ऐड-इन में है?वीबीए: उपकरण के साथ सशर्त संकलन कीवर्ड

मैं अपने कार्यपुस्तिका में एक वर्ग मॉड्यूल में निम्नलिखित है, चलो यह Book1 कॉल:

#Const Condition1 = 0 ''will be replaced with 1 when add-in is opened 
#if Condition1 then 
    Implements myAddIn.iInterfaceFoo 
#End if 

मैं ऐड-इन के लिए एक संदर्भ के रूप में सूचीबद्ध myAddIn है (यानी उपकरण में -> संदर्भ .. ।)।

मैं ऐड-इन में अन्य कक्षाओं के साथ इंटरफ़ेस का सफलतापूर्वक उपयोग कर रहा हूं, लेकिन अब मैं सीधे अपनी कार्यपुस्तिका पुस्तक 1 ​​में इंटरफ़ेस को कॉल करना चाहता हूं। जब तक ऐड-इन खुला होता है, जब मैं book1 संकलित करता हूं (यानी डीबग -> संकलित VBAProject) यह सफलतापूर्वक संकलित करता है।

हालांकि

, जब मैं के साथ ऐड-इन को बंद कर दिया, मैं त्रुटि

Compile error: User-defined type not defined 

मिल Book1 संकलित करने के लिए कोशिश यह ठीक है कि मैं क्या से बचने के लिए कोशिश कर रहा हूँ - अन्यथा यदि ऐड-इन याद आ रही है (उदाहरण के लिए किसी और के कंप्यूटर पर) स्प्रेडशीट स्वयं भी काम करेगी।

+0

धन्यवाद, मैं प्रश्न में सुधार करने का प्रयास किया है। मैंने कक्षा को तुरंत चालू कर दिया है, लेकिन यह एक कंपाइलर त्रुटि है जो रनटाइम त्रुटि नहीं है। 'उपकरण' पर दिए गए लिंक के लिए धन्यवाद लेकिन मैं यह कैसे काम करता हूं के साथ काफी सहज हूं :) – crunch

+0

ठीक है, जब 'कंडीशन 1' गलत है तो आपके कोड को 'myAddIn.iInterfaceFoo' लागू करने का भी प्रयास नहीं करना चाहिए। क्या आपको 'कंडीशन 1' को सही/गलत पर सेट करने में कोई समस्या है, चाहे ऐड-इन लोड हो या नहीं? संभवतः [यह] देखें (http://stackoverflow.com/q/15951518/2140173) और [वह] (http://stackoverflow.com/q/19726791/2140173) –

+0

यह बस है - यह संकलन करने का प्रयास करता है 'कार्यान्वयन' रेखा, भले ही 'कंडीशन 1' 'गलत 'है। मैं उन लिंक किए गए उत्तरों पर एक नज़र डालेगा। – crunch

उत्तर

1

मैं बहुत कुछ देख रहा था और उस समस्या का अच्छा समाधान नहीं मिला।

तो मैं एक और फ़ाइल में समस्या पैदा करने वाले समारोह में लिखा है, और मैं इस तरह इसे सक्रिय करता है, तो मैं इसे की जरूरत है: एक मॉड्यूल में

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:\rvc\sp.mdb") 
Set ob = appAccess.Run("soap30object") 
End Sub 

मज़े करो!


एक अन्य समाधान

प्रतिक्रिया के लिए रनटाइम पर Modul में कोड बदलें ...

 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 
संबंधित मुद्दे