প্রোগ্রামিয়ালি একটি রেফারেন্স কীভাবে যুক্ত করবেন


89

আমি একটি প্রোগ্রাম লিখেছি যা সঞ্চালিত হয় এবং তথ্য শেষ করে স্কাইপ বার্তা দেয় যদি শেষ হয়। Skype4COM.dllস্কাইপের মাধ্যমে কোনও বার্তা প্রেরণের জন্য আমাকে একটি রেফারেন্স যুক্ত করতে হবে। আমাদের কাছে একটি নেটওয়ার্কে একটি ডজন বা তার বেশি কম্পিউটার এবং একটি ভাগ করা ফাইল সার্ভার রয়েছে (অন্যান্য জিনিসের মধ্যে)। অন্যান্য প্রোগ্রামগুলির সকলকেই এই প্রোগ্রামটি চালাতে সক্ষম হওয়া দরকার। আমি হাতে হাতে রেফারেন্স স্থাপন এড়াতে আশা করছিলাম। আমি রেফারেন্সটি একটি ভাগ করা স্থানে রাখার এবং প্রোগ্রামটি চলাকালীন প্রোগ্রামক্রমে যুক্ত করার পরিকল্পনা করেছি।

আমি ভিসিএ ব্যবহার করে এক্সেল 2007 এ প্রোগ্রামারালিভাবে কীভাবে একটি রেফারেন্স যুক্ত করব তা অনুভব করতে পারি না। আমি নিজেই এটি করতে জানি: খুলুন VBE --> Tools --> References --> browse --_> File Location and Name। তবে এটি আমার উদ্দেশ্যে খুব কার্যকর নয়। আমি জানি অ্যাক্সেস ভিবি.নেট করার উপায় আছে এবং কোডটি এই পপিং আপের মতোই রয়েছে তবে আমি নিশ্চিত নই যে আমি এটি বুঝতে পেরেছি বা এটি প্রাসঙ্গিক:

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

এখন পর্যন্ত উপস্থাপিত সমাধানগুলিতে, প্রোগ্রামালিফিকভাবে রেফারেন্স যুক্ত করার জন্য আমাকে হাত দিয়ে একটি রেফারেন্স যুক্ত করতে হবে এবং ট্রাস্ট কেন্দ্রটি পরিবর্তন করতে হবে - যা কেবলমাত্র রেফারেন্স যুক্ত করার চেয়ে বেশি। যদিও আমি অনুমান করি যদি প্রস্তাবিত সমাধানগুলি আমি অনুসরণ করি তবে আমি ভবিষ্যতে উল্লেখগুলি প্রোগ্রামগতভাবে যুক্ত করতে সক্ষম হব। যা সম্ভবত এটি প্রচেষ্টা মূল্যবান করে তোলে।

পরবর্তী কোনও চিন্তা দুর্দান্ত হবে।


4
আপনি এক্সেল 2010
Qbik

4
কেন এটি আবার জীবন্ত হয়ে উঠেছে তা ধারণা নেই - তবে তাড়াতাড়ি / দেরীতে আবদ্ধ হওয়া একবার দেখুন। আপনি যদি কোনও রেফারেন্স যুক্ত করেন (হয় হাতে বা প্রোগ্রামালিমে) তা আপনার কোডটিকে একটি নির্দিষ্ট সংস্করণের সাথে যুক্ত করে। যেমন এক্সেল 11 গ্রন্থাগার এক্সেল 2003 সমস্ত ভাল আবদ্ধ থাকে যদি আপনি যা চান তা, কিন্তু বেশ প্রায়ই (আমি বিশেষত যেখানে কাজ) আমি 2003, 2007 এবং 2010 থেকে কাজ করার জন্য এটি প্রয়োজন
ড্যারেন Bartrup-কুক

উত্তর:


110

ওমিট

আপনার প্রকল্পগুলিতে ভিবিএর মাধ্যমে রেফারেন্স যুক্ত করার দুটি উপায় রয়েছে

1) জিইউইডি ব্যবহার করে

2) সরাসরি dll রেফারেন্স।

দুটোই coverেকে রাখি।

তবে প্রথমে এই 3 টি জিনিস আপনার যত্ন নেওয়া উচিত

ক) ম্যাক্রোগুলি সক্ষম করা উচিত

খ) সুরক্ষা সেটিংসে, "ভিজ্যুয়াল বেসিক প্রকল্পে ট্রাস্ট অ্যাক্সেস" চেক করা আছে কিনা তা নিশ্চিত করুন

এখানে চিত্র বর্ণনা লিখুন

গ) আপনি ম্যানুয়ালি Applications মাইক্রোসফ্ট ভিজ্যুয়াল বেসিক ফর অ্যাপ্লিকেশন এক্সটেনসিবিলিটি অবজেক্টের জন্য একটি রেফারেন্স সেট করেছেন

এখানে চিত্র বর্ণনা লিখুন

ওয়ে 1 (জিইউইডি ব্যবহার করে)

রেজিস্ট্রিতে জিইউইডি অনুসন্ধান করতে হয় বলে আমি সাধারণত এইভাবে এড়াতে থাকি ... যা আমি লোলকে ঘৃণা করি। জিইউডি তে আরও এখানে

বিষয়: কোডের মাধ্যমে একটি ভিবিএ রেফারেন্স লাইব্রেরি যুক্ত করুন

লিঙ্ক : http://www.vbaexpress.com/kb/getarticle.php?kb_id=267

'Credits: Ken Puls
Sub AddReference()
     'Macro purpose:  To add a reference to the project using the GUID for the
     'reference library

    Dim strGUID As String, theRef As Variant, i As Long

     'Update the GUID you need below.
    strGUID = "{00020905-0000-0000-C000-000000000046}"

     'Set to continue in case of error
    On Error Resume Next

     'Remove any missing references
    For i = ThisWorkbook.VBProject.References.Count To 1 Step -1
        Set theRef = ThisWorkbook.VBProject.References.Item(i)
        If theRef.isbroken = True Then
            ThisWorkbook.VBProject.References.Remove theRef
        End If
    Next i

     'Clear any errors so that error trapping for GUID additions can be evaluated
    Err.Clear

     'Add the reference
    ThisWorkbook.VBProject.References.AddFromGuid _
    GUID:=strGUID, Major:=1, Minor:=0

     'If an error was encountered, inform the user
    Select Case Err.Number
    Case Is = 32813
         'Reference already in use.  No action necessary
    Case Is = vbNullString
         'Reference added without issue
    Case Else
         'An unknown error was encountered, so alert the user
        MsgBox "A problem was encountered trying to" & vbNewLine _
        & "add or remove a reference in this file" & vbNewLine & "Please check the " _
        & "references in your VBA project!", vbCritical + vbOKOnly, "Error!"
    End Select
    On Error GoTo 0
End Sub

উপায় 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
সুতরাং দেখে মনে হচ্ছে হাত দিয়ে রেফারেন্স যুক্ত করার পরিবর্তে আমার নিজের হাতে আলাদা রেফারেন্স যুক্ত করতে হবে এবং এক্সেল অনুমতিগুলি পরিবর্তন করতে হবে? ভবিষ্যতে এটি আরও ভাল হবে তা নিশ্চিত, তবে এটি এখন কিছুটা মজার বলে মনে হচ্ছে।
ওম্মিট

4
হ্যাঁ এটি মজাদার শোনায় তবে তারপরে এই মুহুর্তটি এটিই :)
সিদ্ধার্থ রাউট

4
দুর্দান্ত উত্তর। এর এফওয়াইআই ব্যবহারকারীরা লক্ষ্য করুন যে আপনি এখনও কোনও ওয়ার্ড / পাওয়ারপয়েন্ট / অন্যান্য অবজেক্ট বা এনুম ব্যবহার করতে পারবেন না এটির সাথে কোনও ফাংশন বা পদ্ধতির বাইরে কারণ WORKBOOK_OPENসংঘটিত ঘটনাটি কার্যকর হওয়া শুরুর আগে সংকলক ব্যর্থ হবে । সুতরাং আপনি একটি পাবলিক ওয়ার্ড অবজেক্ট তৈরি করতে পারবেন না এবং আপনি কোনও শব্দ / পিপিটি টাইপ হিসাবে প্যারামিটারের ধরণ নির্ধারণ করতে পারবেন না (যেমন আপনি এর মতো কিছু করতে পারবেন না Sub CopyActiveChartToWord(FormatType as WdPasteDataType))।
s_a

4
কিছু ডিএলএল এর ফোল্ডারের অবস্থানগুলি কি উইন্ডোজের বিভিন্ন সংস্করণে আলাদা হবে না? (যেমন উইন 8, উইন 7, ভিস্তা, এক্সপি ইত্যাদি)। কোন ক্ষেত্রে, জিআইডি দ্বারা যুক্ত করা নিরাপদ হবে না (যদি আপনার ব্যবহারকারীরা বিভিন্ন উইন সংস্করণে থাকেন)?
জনী কেন 21

10
রেকর্ডের জন্য, এমএস স্ক্রিপ্টিং রানটাইমের জন্য জিইউইডি {420B2830-E718-11CF-893D-00A0C9054228}। আপনি এগুলো নিজে যোগ তারপর, প্রতিটি মাধ্যমে looping দ্বারা অন্যান্য GUIDs খুঁজে বের করতে পারেন Ref ThisWorkbook.VBProject.Referencesএবং ব্যবহারDebug.Print Ref.Name, Ref.Guid
বিমান হামলায়

26

ভিবিএ ব্যবহার করে রেফারেন্স যুক্ত করার দুটি উপায় রয়েছে। .AddFromGuid(Guid, Major, Minor)এবং .AddFromFile(Filename)। কোনটি সর্বোত্তম তা নির্ভর করে আপনি কোন উল্লেখটি যুক্ত করার চেষ্টা করছেন তার উপর। আমি প্রায়শই ব্যবহার করি .AddFromFileকারণ আমি যে জিনিসগুলি উল্লেখ করছি সেগুলি অন্যান্য এক্সেল ভিবিএ প্রকল্পগুলি এবং সেগুলি উইন্ডোজ রেজিস্ট্রিতে নেই।

আপনি যে উদাহরণ কোডটি দেখিয়ে যাচ্ছেন তাতে কোডটি রয়েছে এমন ওয়ার্কবুকের একটি রেফারেন্স যুক্ত করবে I আমি সাধারণত এটি করার কোনও অর্থ দেখতে পাই না কারণ 90% সময় আপনি রেফারেন্স যুক্ত করার আগে কোডটি ইতিমধ্যে সংকলন করতে ব্যর্থ হয়েছে কারণ উল্লেখটি অনুপস্থিত। (এবং যদি এটি সংকলনটি ব্যর্থ না হয় তবে আপনি সম্ভবত দেরীতে বাইন্ডিং ব্যবহার করছেন এবং আপনার কোনও রেফারেন্স যুক্ত করার দরকার নেই))

কোডটি চালাতে আপনার যদি সমস্যা হয় তবে দুটি সম্ভাব্য সমস্যা রয়েছে।

  1. VBE এর অবজেক্ট মডেলটি সহজেই ব্যবহার করার জন্য আপনাকে অ্যাপ্লিকেশন এক্সটেনসিবিলিটির জন্য মাইক্রোসফ্ট ভিজ্যুয়াল বেসিকের একটি রেফারেন্স যুক্ত করতে হবে । (ভিবিআইডি)
  2. এক্সেল ভিবিএ কোড চালনা করার জন্য যা কোনও ভিবিপ্রজেক্টের যে কোনও কিছুতেই পরিবর্তন করে, আপনাকে ভিবিএ প্রকল্প অবজেক্ট মডেলটিতে অ্যাক্সেস বিশ্বাস করতে হবে । (এক্সেল 2010 এ, এটি ট্রাস্ট সেন্টারে - ম্যাক্রো সেটিংসে অবস্থিত))

এ ছাড়াও, আপনি যদি আপনার প্রশ্নটি বা আপনি যা করার চেষ্টা করছেন তা কাজ করছে না সে সম্পর্কে যদি আপনি আরও কিছুটা পরিষ্কার করে বলতে পারেন তবে আমি আরও নির্দিষ্ট উত্তর দিতে পারব।


10

গাইড বা পাথ ব্যবহারের জন্য রেজিস্ট্রি ব্রাউজ করা, কোন পদ্ধতিটি সেরা। যদি রেজিস্ট্রি ব্রাউজ করার আর প্রয়োজন হয় না, তবে গাইডগুলি ব্যবহারের আরও ভাল উপায় হবে না? অফিস সর্বদা একই ডিরেক্টরিতে ইনস্টল করা হয় না। ইনস্টলেশন পাথ ম্যানুয়ালি পরিবর্তন করা যেতে পারে। এছাড়াও সংস্করণ নম্বরটি পথের একটি অংশ। আমি কখনই অনুমান করতে পারি না যে 64 বিট প্রসেসর প্রবর্তনের আগে মাইক্রোসফ্ট কখনও 'প্রোগ্রাম ফাইলগুলিতে' (x86) যুক্ত করবে। সম্ভব হলে আমি কোনও পথ ব্যবহার না করার চেষ্টা করতাম।

সক্রিয় ওয়ার্কবুকটিতে ব্যবহৃত সমস্ত উল্লেখগুলি তালিকাভুক্ত করার জন্য একটি অতিরিক্ত ফাংশন সহ সিদ্ধার্থ রাউটের উত্তর থেকে নীচের কোডটি উত্পন্ন হয়েছে। আমি যদি আমার ওয়ার্কবুকটি এক্সেলের পরবর্তী সংস্করণে খুলি তবে কী হবে? ভিবিএ কোডটি মানিয়ে না নিয়ে কি ওয়ার্কবুকটি এখনও কাজ করবে? আমি ইতোমধ্যে পরীক্ষা করে দেখেছি যে 2003 এবং 2010 এর অফিসের গাইডগুলি অভিন্ন are আসুন আশা করি মাইক্রোসফ্ট ভবিষ্যতের সংস্করণগুলিতে গাইড পরিবর্তন করে না।

0,0 টি আর্গুমেন্ট (.AdFromGuid থেকে) একটি রেফারেন্সের সর্বশেষ সংস্করণ (যা আমি পরীক্ষা করতে সক্ষম হইনি) ব্যবহার করা উচিত।

আপনার চিন্তা কি? অবশ্যই আমরা ভবিষ্যতের পূর্বাভাস দিতে পারি না তবে আমাদের কোড সংস্করণ প্রমাণ হিসাবে আমরা কী করতে পারি?

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

উপরের কোডটিতে "মাইক্রোসফ্ট ভিজ্যুয়াল বেসিক ফর অ্যাপ্লিকেশন এক্সটেনসিবিলিটি" অবজেক্টের রেফারেন্সের প্রয়োজন নেই।


4
নোট করুন যে আপনার কাছে ম্যাক্রো সক্ষম এবং ভিজ্যুয়াল বেসিক প্রকল্পের ট্রাস্ট অ্যাক্সেস করতে হবে ( @ সিদ্ধার্থ_আরউটের উত্তরে পয়েন্ট a এবং b ), তবে ভিবিআইডিআই রেফারেন্সটি মুছে ফেলার জন্য +1! এছাড়াও, আমি প্রশংসা করি যে ডিবাগপ্রিন্টএক্সেস্টিংআরফগুলি কোডটিতে লাইনটি অনুলিপি করে আটকানোর জন্য ফর্ম্যাটটিতে আউটপুট দেয়।
গ্লেনফ্রিম আইওয়া

7

এখানে গাইডের প্রোগ্রামালিটি কীভাবে পাবেন! তারপরে আপনি রেফারেন্স যুক্ত করতে উপরের উত্তর সহ এই গাইড / ফাইলপথগুলি ব্যবহার করতে পারেন!

তথ্যসূত্র: http://www.vbaexpress.com/kb/getarticle.php?kb_id=278

Sub ListReferencePaths()
'Lists path and GUID (Globally Unique Identifier) for each referenced library.
'Select a reference in Tools > References, then run this code to get GUID etc.
    Dim rw As Long, ref
    With ThisWorkbook.Sheets(1)
        .Cells.Clear
        rw = 1
        .Range("A" & rw & ":D" & rw) = Array("Reference","Version","GUID","Path")
        For Each ref In ThisWorkbook.VBProject.References
            rw = rw + 1
            .Range("A" & rw & ":D" & rw) = Array(ref.Description, _
                   "v." & ref.Major & "." & ref.Minor, ref.GUID, ref.FullPath)
        Next ref
        .Range("A:D").Columns.AutoFit
    End With
End Sub

এখানে একই কোড তবে টার্মিনালে মুদ্রণ যদি আপনি আউটপুটে কোনও কার্যপত্রক উত্সর্গ করতে না চান।

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 

Debug.Print "Reference name" & " | " & "Full path to reference" & " | " & "Reference GUID" 

For i = 1 To ThisWorkbook.VBProject.References.Count 
  With ThisWorkbook.VBProject.References(i) 
    Debug.Print .Name & " | " & .FullPath  & " | " & .GUID 
  End With 
Next i 
On Error GoTo 0 
End Sub 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.