วิธีเพิ่มข้อมูลอ้างอิงโดยใช้โปรแกรม


89

ฉันได้เขียนโปรแกรมที่ทำงานและส่งข้อความถึง Skype พร้อมข้อมูลเมื่อเสร็จสิ้น ฉันต้องการเพิ่มข้อมูลอ้างอิงSkype4COM.dllเพื่อที่จะส่งข้อความผ่าน Skype เรามีคอมพิวเตอร์หลายสิบเครื่องในเครือข่ายและเซิร์ฟเวอร์ไฟล์ที่ใช้ร่วมกัน (เหนือสิ่งอื่นใด) คอมพิวเตอร์เครื่องอื่น ๆ ทั้งหมดต้องสามารถเรียกใช้โปรแกรมนี้ได้ ฉันหวังว่าจะหลีกเลี่ยงการตั้งค่าการอ้างอิงด้วยมือ ฉันได้วางแผนที่จะวางข้อมูลอ้างอิงไว้ในตำแหน่งที่ใช้ร่วมกันและเพิ่มโดยทางโปรแกรมเมื่อโปรแกรมทำงาน

ฉันไม่สามารถหาวิธีเพิ่มข้อมูลอ้างอิงในโปรแกรม Excel 2007 โดยใช้ VBA ได้ ฉันรู้วิธีการทำด้วยตนเอง: 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

จนถึงตอนนี้ในโซลูชันที่นำเสนอในการเพิ่มข้อมูลอ้างอิงโดยทางโปรแกรมฉันจะต้องเพิ่มการอ้างอิงด้วยตนเองและเปลี่ยนศูนย์ความเชื่อถือซึ่งเป็นมากกว่าการเพิ่มข้อมูลอ้างอิง แม้ว่าฉันเดาว่าถ้าฉันทำตามวิธีแก้ปัญหาที่เสนอฉันจะสามารถเพิ่มการอ้างอิงในอนาคตโดยใช้โปรแกรมได้ ซึ่งอาจทำให้คุ้มค่ากับความพยายาม

คิดต่อไปจะดีมาก


2
คุณสามารถใช้ CreateObject () ได้โดยไม่ต้องเพิ่มการอ้างอิงใน Excel 2010
Qbik

1
ไม่รู้ว่าทำไมสิ่งนี้ถึงกลับมามีชีวิตชีวาอีกครั้ง - แต่ลองดูการผูกมัดในช่วงต้น / ปลาย หากคุณเพิ่มการอ้างอิง (ด้วยมือหรือโดยใช้โปรแกรม) มันจะเชื่อมโยงรหัสของคุณกับเวอร์ชันที่ระบุ เช่นไลบรารี Excel 11 เชื่อมโยงกับ Excel 2003 ทุกอย่างดีถ้านั่นคือสิ่งที่คุณต้องการ แต่บ่อยครั้ง (โดยเฉพาะในที่ที่ฉันทำงาน) ฉันต้องการให้มันทำงานในปี 2003, 2007 และ 2010
Darren Bartrup-Cook

คำตอบ:


110

โอม

มีสองวิธีในการเพิ่มการอ้างอิงผ่าน VBA ไปยังโครงการของคุณ

1)การใช้ GUID

2)อ้างอิง dll โดยตรง

ผมขอครอบคลุมทั้งสองอย่าง

แต่ก่อนอื่นคือ 3 สิ่งที่คุณต้องดูแล

ก)ควรเปิดใช้งานมาโคร

b)ในการตั้งค่าความปลอดภัยตรวจสอบให้แน่ใจว่าได้เลือก "Trust Access To Visual Basic Project" แล้ว

ป้อนคำอธิบายภาพที่นี่

c)คุณได้ตั้งค่าการอ้างอิงถึงอ็อบเจ็กต์ `` Microsoft Visual Basic for Applications Extensibility "ด้วยตนเอง

ป้อนคำอธิบายภาพที่นี่

วิธีที่ 1 (ใช้ GUID)

ฉันมักจะหลีกเลี่ยงวิธีนี้เนื่องจากฉันต้องค้นหา GUID ในรีจิสทรี ... ซึ่งฉันเกลียด LOL เพิ่มเติมเกี่ยวกับ GUID ที่นี่

หัวข้อ: เพิ่มไลบรารีอ้างอิง VBA ผ่านรหัส

ลิงก์ : 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:)


2
ดังนั้นดูเหมือนว่าแทนที่จะเพิ่มการอ้างอิงด้วยมือฉันต้องเพิ่มการอ้างอิงแยกต่างหากด้วยมือและเปลี่ยนการอนุญาต excel? จริงอยู่ว่ามันจะดีขึ้นในอนาคต แต่ตอนนี้มันดูตลกไปหน่อย
Ommit

2
ใช่มันฟังดูตลก แต่ก็เป็นอย่างนั้นในขณะนี้ :)
Siddharth Rout

1
คำตอบที่ดี ผู้ใช้ FYI โปรดสังเกตว่าคุณยังไม่สามารถใช้ Word / PowerPoint / อ็อบเจกต์อื่นหรือ Enum ใด ๆ นอกฟังก์ชันหรือโพรซีเดอร์ได้เนื่องจากคอมไพเลอร์จะล้มเหลวก่อนที่WORKBOOK_OPENเหตุการณ์จะเริ่มดำเนินการ ดังนั้นคุณจึงไม่สามารถสร้างออบเจ็กต์ Public Word และคุณไม่สามารถกำหนดประเภทของพารามิเตอร์เป็นประเภท Word / PPT ได้ (เช่นคุณไม่สามารถทำสิ่งที่ต้องการได้Sub CopyActiveChartToWord(FormatType as WdPasteDataType))
s_a

3
ตำแหน่งโฟลเดอร์ของ DLL บางตัวจะไม่แตกต่างกันใน Windows เวอร์ชันต่างๆหรือไม่? (เช่น Win 8, Win 7, Vista, XP ฯลฯ ) ในกรณีนี้การไม่เพิ่มด้วย GUID จะปลอดภัยกว่า (หากผู้ใช้ของคุณใช้ Win เวอร์ชันต่างๆกัน)
johny ทำไม

10
สำหรับบันทึกที่ GUID สำหรับ MS Scripting Runtime {420B2830-E718-11CF-893D-00A0C9054228}คือ คุณสามารถค้นหา GUID อื่น ๆ ได้โดยเพิ่มด้วยตนเองจากนั้นวนลูปผ่านแต่ละรายการRef ThisWorkbook.VBProject.Referencesและใช้Debug.Print Ref.Name, Ref.Guid
โจมตีทางอากาศ

26

มีสองวิธีในการเพิ่มการอ้างอิงโดยใช้ VBA .AddFromGuid(Guid, Major, Minor)และ.AddFromFile(Filename). ข้อใดดีที่สุดขึ้นอยู่กับสิ่งที่คุณพยายามเพิ่มข้อมูลอ้างอิง ฉันมักจะใช้.AddFromFileเพราะสิ่งที่ฉันอ้างถึงเป็นโครงการ Excel VBA อื่น ๆ และไม่ได้อยู่ใน Windows Registry

รหัสตัวอย่างที่คุณแสดงจะเพิ่มการอ้างอิงไปยังสมุดงานที่มีรหัสอยู่โดยทั่วไปแล้วฉันไม่เห็นจุดใดในการทำเช่นนั้นเพราะ 90% ของเวลาก่อนที่คุณจะสามารถเพิ่มการอ้างอิงรหัสนั้นไม่สามารถรวบรวมได้ เนื่องจากไม่มีข้อมูลอ้างอิง (และหากไม่สามารถคอมไพล์ได้คุณอาจกำลังใช้การเชื่อมต่อล่าช้าและคุณไม่จำเป็นต้องเพิ่มข้อมูลอ้างอิง)

หากคุณประสบปัญหาในการเรียกใช้โค้ดอาจมีปัญหาสองประการ

  1. ในการสั่งซื้อเพื่อให้ง่ายต่อการใช้งานรูปแบบวัตถุ VBE ของคุณจะต้องเพิ่มการอ้างอิงถึงMicrosoft Visual Basic สำหรับการประยุกต์ใช้การขยาย (วิดีโอ)
  2. เพื่อที่จะรัน Excel รหัส VBA ที่มีการเปลี่ยนแปลงอะไรใน VBProject คุณจะต้องเชื่อถือการเข้าถึงรูปแบบวัตถุ VBA โครงการ (ใน Excel 2010 จะอยู่ใน Trust Center - การตั้งค่ามาโคร)

นอกเหนือจากนั้นหากคุณสามารถเข้าใจได้ชัดเจนขึ้นอีกนิดว่าคำถามของคุณคืออะไรหรือสิ่งที่คุณพยายามทำ แต่ไม่ได้ผลฉันสามารถให้คำตอบที่เจาะจงมากขึ้น


10

เรียกดูรีจิสตรีเพื่อดูคำแนะนำหรือใช้เส้นทางวิธีใดดีที่สุด หากไม่จำเป็นต้องเรียกดูรีจิสทรีอีกต่อไปจะเป็นวิธีที่ดีกว่าหรือไม่ในการใช้คำแนะนำ ไม่ได้ติดตั้ง Office ไว้ในไดเร็กทอรีเดียวกันเสมอไป เส้นทางการติดตั้งสามารถเปลี่ยนแปลงได้ด้วยตนเอง นอกจากนี้หมายเลขเวอร์ชันยังเป็นส่วนหนึ่งของเส้นทาง ฉันไม่เคยคาดเดามาก่อนว่า Microsoft จะเพิ่ม '(x86)' ใน 'Program Files' ก่อนที่จะเปิดตัวโปรเซสเซอร์ 64 บิต ถ้าเป็นไปได้ฉันจะพยายามหลีกเลี่ยงการใช้เส้นทาง

โค้ดด้านล่างนี้ได้มาจากคำตอบของ Siddharth Rout โดยมีฟังก์ชันเพิ่มเติมเพื่อแสดงรายการข้อมูลอ้างอิงทั้งหมดที่ใช้ในสมุดงาน จะเกิดอะไรขึ้นถ้าฉันเปิดสมุดงานของฉันใน Excel เวอร์ชันที่ใหม่กว่า สมุดงานจะยังใช้งานได้โดยไม่ต้องปรับรหัส VBA หรือไม่ ฉันได้ตรวจสอบแล้วว่าคู่มือสำหรับ office 2003 และ 2010 เหมือนกัน หวังว่า Microsoft จะไม่เปลี่ยนแนวทางในเวอร์ชันอนาคต

อาร์กิวเมนต์ 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

โค้ดด้านบนไม่ต้องการการอ้างอิงถึงอ็อบเจ็กต์ "Microsoft Visual Basic for Applications Extensibility" อีกต่อไป


3
โปรดทราบว่าคุณต้องเปิดใช้งานมาโครและเลือก Trust Access To Visual Basic Project (ชี้ a และ b ในคำตอบจาก @Siddharth_Rout) แต่ +1 เพื่อกำจัดการอ้างอิง VBIDE! นอกจากนี้ฉันขอขอบคุณที่ DebugPrintExistingRefs แสดงผลในรูปแบบเพื่อคัดลอกและวางบรรทัดลงในโค้ด
GlennFromIowa

7

นี่คือวิธีรับ Guid แบบเป็นโปรแกรม! จากนั้นคุณสามารถใช้ guids / filepaths เหล่านี้กับคำตอบด้านบนเพื่อเพิ่มข้อมูลอ้างอิง!

อ้างอิง: 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.