2012-03-26 24 views
66

मैंने एक प्रोग्राम लिखा है जो समाप्त होने पर जानकारी के साथ स्काइप चलाता है और संदेश देता है। स्काइप के माध्यम से एक संदेश भेजने के लिए मुझे Skype4COM.dll के लिए संदर्भ जोड़ने की आवश्यकता है। हमारे पास नेटवर्क पर एक दर्जन या उससे अधिक कंप्यूटर हैं और एक साझा फ़ाइल सर्वर (अन्य चीजों के साथ)। अन्य सभी कंप्यूटरों को इस कार्यक्रम को चलाने में सक्षम होना चाहिए। मैं हाथ से संदर्भ स्थापित करने से बचने की उम्मीद कर रहा था। मैंने एक साझा स्थान में संदर्भ डालने की योजना बनाई थी, और कार्यक्रम चलाते समय इसे प्रोग्रामेटिक रूप से जोड़ना था।प्रोग्रामेटिक रूप से संदर्भ जोड़ने के लिए

मुझे लगता है कि वीबीए का उपयोग कर Excel 2007 में प्रोग्रामेटिक रूप से संदर्भ जोड़ने का तरीका नहीं लग रहा है। मुझे पता है कि इसे मैन्युअल रूप से कैसे करें: VBE --> Tools --> References --> browse --_> File Location and Name खोलें। लेकिन यह मेरे उद्देश्यों के लिए बहुत उपयोगी नहीं है। मुझे पता है कि Access Vb.net में यह करने के लिए तरीके और कोड इस के समान ऊपर पॉपिंग रखा है, लेकिन मुझे यकीन है कि मैं इसे समझते हैं, या अगर यह प्रासंगिक है नहीं कर रहा हूँ:

ThisWorkbook.VBProject.References.AddFromGuid _ 
    GUID:="{0002E157-0000-0000-C000-000000000046}", _ 
    Major:=5, Minor:=3 

अब तक समाधान में प्रस्तुत किया, में प्रोग्राम प्रोग्रामिक रूप से संदर्भ जोड़ने के लिए मुझे हाथ से एक संदर्भ जोड़ने और ट्रस्ट सेंटर बदलने की आवश्यकता होगी - जो संदर्भ को जोड़ने से कहीं अधिक है। हालांकि मुझे लगता है कि अगर मैं प्रस्तावित समाधानों का पालन करता हूं तो मैं भविष्य में संदर्भों को प्रोग्रामेटिक रूप से जोड़ सकता हूं। जो शायद इसे प्रयास के लायक बनाता है।

कोई और विचार बहुत अच्छा होगा।

+1

आप Excel 2010 – Qbik

+0

कोई विचार क्यों यह फिर से जिंदा आ गया है के तहत संदर्भ जोड़े बिना CreateObject() का उपयोग कर सकते हैं - लेकिन कम से जल्दी/लेट बाइंडिंग एक नजर है। यदि आप कोई संदर्भ जोड़ते हैं (या तो हाथ या प्रोग्रामेटिक रूप से) यह आपके कोड को एक विशिष्ट संस्करण से जोड़ता है। जैसे एक्सेल 11 लाइब्रेरी एक्सेल 2003 से जुड़ा हुआ है। अगर आप यही चाहते हैं तो बहुत अच्छा है, लेकिन अक्सर (विशेष रूप से जहां मैं काम करता हूं) मुझे 2003, 2007 और 2010 को काम करने की ज़रूरत है। –

उत्तर

77

ommit

वहाँ अपनी परियोजनाओं

1) को VBA के माध्यम से संदर्भ जोड़ने के दो तरीके GUID

2) का उपयोग करते हुए सीधे dll को संदर्भित कर रहे हैं।

मुझे दोनों को कवर करने दें।

लेकिन पहले इन 3 चीजें आप की देखभाल करने की जरूरत है

क) मैक्रो सक्षम होना चाहिए

ख) सुरक्षा सेटिंग्स में, यह सुनिश्चित करें कि "ट्रस्ट दृश्य मूल परियोजना के लिए पहुँच"

enter image description here

ग) चेक किया गया है आप मा है nually अनुप्रयोग Extensibility "वस्तु

enter image description here

रास्ता 1 (GUID का उपयोग करना)

के रूप में मैं में GUID के लिए खोज करने के लिए है मैं आमतौर पर इस तरह से बचने के लिए` माइक्रोसॉफ्ट विजुअल बेसिक के लिए एक संदर्भ सेट रजिस्ट्री ... जो मुझे एलओएल से नफरत है। GUID here पर और अधिक।

विषय: कोड के माध्यम से एक VBA संदर्भ पुस्तकालय जोड़े

लिंक: http://www.vbaexpress.com/kb/getarticle.php?kb_id=267


रास्ता 2 (सीधे dll को संदर्भित)

इस कोड को एक संदर्भ कहते हैं Microsoft VBScript Regular Expressions 5.5

Option Explicit 

Sub AddReference() 
    Dim VBAEditor As VBIDE.VBE 
    Dim vbProj As VBIDE.VBProject 
    Dim chkRef As VBIDE.Reference 
    Dim BoolExists As Boolean 

    Set VBAEditor = Application.VBE 
    Set vbProj = ActiveWorkbook.VBProject 

    '~~> Check if "Microsoft VBScript Regular Expressions 5.5" is already added 
    For Each chkRef In vbProj.References 
     If chkRef.Name = "VBScript_RegExp_55" Then 
      BoolExists = True 
      GoTo CleanUp 
     End If 
    Next 

    vbProj.References.AddFromFile "C:\WINDOWS\system32\vbscript.dll\3" 

CleanUp: 
    If BoolExists = True Then 
     MsgBox "Reference already exists" 
    Else 
     MsgBox "Reference Added Successfully" 
    End If 

    Set vbProj = Nothing 
    Set VBAEditor = Nothing 
End Sub 

नोट: मैंने त्रुटि हैंडलिंग नहीं जोड़ा है। यह अनुशंसित है कि अपने वास्तविक कोड में, यह प्रयोग करते हैं :)

संपादित द्वारा mischab1 :)

+4

+ भयानक विस्तार के लिए 1। महान प्रतिक्रिया। – Ommit

+0

तो ऐसा लगता है कि हाथ से संदर्भ जोड़ने के बजाय मुझे हाथ से अलग संदर्भ जोड़ने और एक्सेल अनुमतियों को बदलने की आवश्यकता है? यह भविष्य में बेहतर होगा, लेकिन अब यह थोड़ा मजाकिया लगता है। – Ommit

+0

हां यह मजाकिया लगता है लेकिन फिर इस समय यह है :) –

17

वीबीए का उपयोग करके संदर्भ जोड़ने के दो तरीके हैं। .AddFromGuid(Guid, Major, Minor) और .AddFromFile(Filename)। कौन सा सबसे अच्छा है उस पर निर्भर करता है कि आप किस संदर्भ को जोड़ने का प्रयास कर रहे हैं। मैं लगभग हमेशा .AddFromFile का उपयोग करता हूं क्योंकि जिन चीजों का मैं संदर्भ दे रहा हूं वे अन्य एक्सेल वीबीए प्रोजेक्ट हैं और वे विंडोज रजिस्ट्री में नहीं हैं।

उदाहरण कोड जो आप दिखा रहे हैं वह उस कोडबुक में संदर्भ जोड़ देगा जिसमें कोड है। मुझे आमतौर पर ऐसा करने में कोई बिंदु नहीं दिखता है क्योंकि 90% समय, संदर्भ जोड़ने से पहले, कोड में संकलन करने में पहले से ही असफल रहा क्योंकि संदर्भ गुम है। (और यदि यह असफल होने में विफल नहीं हुआ है, तो आप शायद देर से बाध्यकारी उपयोग कर रहे हैं और आपको संदर्भ जोड़ने की आवश्यकता नहीं है।)

यदि आपको कोड चलाने में समस्याएं आ रही हैं, तो दो संभव हैं मुद्दे।

  1. आदेश आसानी से VBE के ऑब्जेक्ट मॉडल का उपयोग करने के लिए आपको आवेदन तानाना के लिए माइक्रोसॉफ्ट विजुअल बेसिक के लिए एक संदर्भ जोड़ने की जरूरत है। (VBIDE)
  2. एक्सेल वीबीए कोड चलाने के लिए जो VBProject में कुछ भी बदलता है, आपको VBA प्रोजेक्ट ऑब्जेक्ट मॉडल पर ट्रस्ट पहुंच की आवश्यकता है। (एक्सेल 2010 में, यह ट्रस्ट सेंटर - मैक्रो सेटिंग्स में स्थित है।)

इसके अलावा, यदि आप अपने प्रश्न के बारे में थोड़ा और स्पष्ट हो सकते हैं कि आप ऐसा करने की कोशिश कर रहे हैं, काम नहीं कर रहा, मैं एक और विशिष्ट जवाब दे सकता था।

+0

+1 इसे मेरे सामने पोस्ट करने के लिए;) –

3

guids के लिए रजिस्ट्री ब्राउज़िंग या पथ का उपयोग, जो विधि सबसे अच्छा है पीटा। यदि रजिस्ट्री ब्राउज़ करना अब आवश्यक नहीं है, तो क्या यह guids का उपयोग करने का बेहतर तरीका नहीं होगा? कार्यालय हमेशा एक ही निर्देशिका में स्थापित नहीं है। स्थापना पथ मैन्युअल रूप से बदला जा सकता है। इसके अलावा संस्करण संख्या पथ का एक हिस्सा है। मैं कभी भविष्यवाणी नहीं कर सकता था कि 64 बिट्स प्रोसेसर की शुरूआत से पहले माइक्रोसॉफ्ट कभी भी 'प्रोग्राम फाइल' में '(x86)' जोड़ देगा। यदि संभव हो तो मैं पथ का उपयोग करने से बचने की कोशिश करूंगा।

नीचे दिया गया कोड सिद्धार्थ रूट के उत्तर से लिया गया है, जिसमें सक्रिय कार्यपुस्तिका में उपयोग किए जाने वाले सभी संदर्भों को सूचीबद्ध करने के लिए अतिरिक्त कार्य किया गया है। क्या होगा यदि मैं Excel के बाद के संस्करण में अपनी कार्यपुस्तिका खोलूं? क्या कार्यपुस्तिका अभी भी वीबीए कोड को अनुकूलित किए बिना काम करेगी? मैंने पहले से ही जांच की है कि कार्यालय 2003 और 2010 के लिए मार्गदर्शिकाएं समान हैं। आइए उम्मीद करते हैं कि माइक्रोसॉफ्ट भविष्य के संस्करणों में ग्रिड नहीं बदलता है।

तर्क 0,0 (.AddFromGuid) से संदर्भ के नवीनतम संस्करण का उपयोग करना चाहिए (जिसे मैं परीक्षण करने में सक्षम नहीं हूं)।

आपके विचार क्या हैं? बेशक हम भविष्य की भविष्यवाणी नहीं कर सकते हैं लेकिन हम अपने कोड संस्करण प्रमाण को बनाने के लिए क्या कर सकते हैं?

Sub AddReferences(wbk As Workbook) 
    ' Run DebugPrintExistingRefs in the immediate pane, to show guids of existing references 
    AddRef wbk, "{00025E01-0000-0000-C000-000000000046}", "DAO" 
    AddRef wbk, "{00020905-0000-0000-C000-000000000046}", "Word" 
    AddRef wbk, "{91493440-5A91-11CF-8700-00AA0060263B}", "PowerPoint" 
End Sub 

Sub AddRef(wbk As Workbook, sGuid As String, sRefName As String) 
    Dim i As Integer 
    On Error GoTo EH 
    With wbk.VBProject.References 
     For i = 1 To .Count 
      If .Item(i).Name = sRefName Then 
       Exit For 
      End If 
     Next i 
     If i > .Count Then 
      .AddFromGuid sGuid, 0, 0 ' 0,0 should pick the latest version installed on the computer 
     End If 
    End With 
EX: Exit Sub 
EH: MsgBox "Error in 'AddRef'" & vbCrLf & vbCrLf & err.Description 
    Resume EX 
    Resume ' debug code 
End Sub 

Public Sub DebugPrintExistingRefs() 
    Dim i As Integer 
    With Application.ThisWorkbook.VBProject.References 
     For i = 1 To .Count 
      Debug.Print " AddRef wbk, """ & .Item(i).GUID & """, """ & .Item(i).Name & """" 
     Next i 
    End With 
End Sub 

उपरोक्त कोड को "अनुप्रयोग एक्सटेंसिबिलिटी के लिए माइक्रोसॉफ्ट विजुअल बेसिक" ऑब्जेक्ट के संदर्भ की आवश्यकता नहीं है।

+0

का उपयोग करके ध्यान दें कि आपको मैक्रोज़ सक्षम होना है और विजुअल बेसिक प्रोजेक्ट की ट्रस्ट एक्सेस (चेक इन ए और बी [उत्तर] में [https://stackoverflow.com/a/9880276/2712565) @Siddharth_Rout से), लेकिन VBIDE संदर्भ को समाप्त करने के लिए +1! साथ ही, मैं सराहना करता हूं कि डीबगप्रिंटएक्सिंगरिफ्स कोड को कोड में कॉपी और पेस्ट करने के प्रारूप में आउटपुट करता है। – GlennFromIowa

2

यहां गिड के प्रोग्रामेटिक तरीके से कैसे प्राप्त करें! फिर संदर्भ जोड़ने के लिए आप उपरोक्त उत्तरों के साथ इन guids/filepaths का उपयोग कर सकते हैं!

संदर्भ: http://www.vbaexpress.com/kb/getarticle.php?kb_id=278

Sub ListReferencePaths() 
'Macro purpose: To determine full path and Globally Unique Identifier (GUID) 
'to each referenced library. Select the reference in the Tools\References 
'window, then run this code to get the information on the reference's library 

On Error Resume Next 
Dim i As Long 
With ThisWorkbook.Sheets(1) 
    .Cells.Clear 
    .Range("A1") = "Reference name" 
    .Range("B1") = "Full path to reference" 
    .Range("C1") = "Reference GUID" 
End With 
For i = 1 To ThisWorkbook.VBProject.References.Count 
    With ThisWorkbook.VBProject.References(i) 
     ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(1, 0) = .Name 
     ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 1) = .FullPath 
     ThisWorkbook.Sheets(1).Range("A65536").End(xlUp).Offset(0, 2) = .GUID 
    End With 
Next i 
On Error GoTo 0 
End Sub 
संबंधित मुद्दे