web-dev-qa-db-ja.com

プログラムで参照を追加する方法

終了したら、Skypeを実行して情報をメッセージで送信するプログラムを作成しました。 Skype経由でメッセージを送信するには、Skype4COM.dllの参照を追加する必要があります。ネットワーク上に数十台のコンピューターと共有ファイルサーバーがあります(特に)。他のすべてのコンピューターは、このプログラムを実行できる必要があります。手動で参照を設定するのを避けたいと思っていました。参照を共有の場所に置き、プログラムの実行時にプログラムで参照を追加することを計画していました。

VBAを使用してExcel 2007にプログラムで参照を追加する方法がわからないようです。私はそれを手動で行う方法を知っています:OpenVBE --> Tools --> References --> browse --_> File Location and Nameしかし、それは私の目的にはあまり役に立ちません。 Access Vb.net でそれを行う方法があることは知っていますが、これに似たコードがポップアップし続けますが、理解できるかどうか、または関連があるかどうかはわかりません:

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

これまでのところ、提示されたソリューションでは、参照をプログラムで追加するには、手動で参照を追加し、参照を追加するだけではなく、セキュリティセンターを変更する必要があります。提案された解決策を順守すれば、プログラムで将来の参照を追加できると思いますが。これはおそらく努力する価値があります。

それ以上の考えは素晴らしいだろう。

77
Ommit

オミット

VBAを介して参照をプロジェクトに追加する方法は2つあります

1)GUIDを使用

2)dllを直接参照します。

両方をカバーさせてください。

しかし、最初にこれらはあなたが世話をする必要がある3つのものです

a)マクロを有効にする必要があります

b)セキュリティ設定で、「Visual Basicプロジェクトへのアクセスを信頼する」がチェックされていることを確認します

enter image description here

c)「Microsoft Visual Basic for Applications Extensibility」オブジェクトへの参照を手動で設定しました

enter image description here

方法1(GUIDを使用)

私は通常、レジストリでGUIDを検索する必要があるため、この方法を避けます。 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

Way 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にBeatられて:)

98
Siddharth Rout

VBAを使用して参照を追加するには2つの方法があります。 .AddFromGuid(Guid, Major, Minor)および.AddFromFile(Filename)。どちらが最適かは、参照を追加しようとしているものによって異なります。参照しているものは他のExcel VBAプロジェクトであり、Windowsレジストリにはないため、ほとんど常に.AddFromFileを使用します。

表示しているサンプルコードは、コードが含まれるワークブックへの参照を追加します。参照を追加する前に、コードが既にコンパイルに失敗しているのは、90%の時間です参照がないためです。 (コンパイルに失敗しなかった場合は、おそらく遅延バインディングを使用しているため、参照を追加する必要はありません。)

コードの実行に問題がある場合は、2つの問題が考えられます。

  1. VBEのオブジェクトモデルを簡単に使用するには、Microsoft Visual Basic for Application Extensibilityへの参照を追加する必要があります。 (VBIDE)
  2. VBProjectのすべてを変更するExcel VBAコードを実行するには、VBAプロジェクトオブジェクトモデルへのアクセスを信頼するにする必要があります。 (Excel 2010では、セキュリティセンター-マクロ設定にあります。)

それとは別に、あなたの質問が何であるか、またはあなたがしようとしていることでもう少し明確にできる場合、それはうまくいきません。

22
mischab1

GUIDのレジストリを参照したり、パスを使用したりする方法が最適です。レジストリを参照する必要がなくなった場合、GUIDを使用するより良い方法ではないでしょうか? Officeは常に同じディレクトリにインストールされるとは限りません。インストールパスは手動で変更できます。また、バージョン番号はパスの一部です。 64ビットプロセッサが導入される前に、Microsoftが '(x86)'を 'Program Files'に追加することを予測することはできませんでした。可能であれば、パスを使用しないようにします。

以下のコードは、Siddharth Routの回答から派生したもので、アクティブなワークブックで使用されているすべての参照をリストする追加機能を備えています。ブックを新しいバージョンのExcelで開くとどうなりますか? VBAコードを調整しなくても、ブックは機能しますか? Office 2003と2010のGUIDが同じであることを既に確認しました。 Microsoftが将来のバージョンでGUIDを変更しないことを期待しましょう。

引数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」オブジェクトへの参照はもう必要ありません。

7
hennep

Guidをプログラムで取得する方法は次のとおりです。これらのGUID /ファイルパスを上記の回答とともに使用して、参照を追加できます!

リファレンス: 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 
5
Chad Crowe