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


89

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

VBAを使用してプログラムでExcel2007に参照を追加する方法がわからないようです。私はそれを手動で行う方法を知っています:開く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
Excel 2010で参照を追加せずにCreateObject()を使用できます
Qbik 2014

1
なぜこれが再び生き返ったのかわかりませんが、初期/後期バインディングを見てください。参照を(手動またはプログラムで)追加すると、コードが特定のバージョンに関連付けられます。Excelなど11ライブラリーは、かなり頻繁に(私は仕事特にどこ)私は2003年、2007年および2010年に仕事にそれを必要とすることは、あなたが何をしたいかどうエクセル2003のすべての良いに結ばれているが、
ダレンBartrup-クック

回答:


110

オミット

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

1) GUIDの使用

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

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

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

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

b)セキュリティ設定で、[VisualBasicプロジェクトへのアクセスを信頼する]がオンになっていることを確認します

ここに画像の説明を入力してください

c)「MicrosoftVisual Basic forApplicationsExtensibility」オブジェクトへの参照を手動で設定しました

ここに画像の説明を入力してください

方法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 2012年

2
はい、それは面白そうに聞こえますが、それが現時点ではそうです:)
Siddharth Rout 2012年

1
素晴らしい答え。これを使用するFYIユーザーは、WORKBOOK_OPENイベントの実行が開始される前にコンパイラが失敗するため、関数またはプロシージャの外部でWord / PowerPoint /その他のオブジェクトまたは列挙型を使用できないことに注意してください。したがって、パブリックWordオブジェクトを作成したり、パラメーターのタイプをWord / PPTタイプとして定義したりすることはできません(たとえば、のようなことはできませんSub CopyActiveChartToWord(FormatType as WdPasteDataType))。
s_a 2014

3
一部のDLLのフォルダーの場所は、Windowsのバージョンによって異なりませんか?(例:Win 8、Win 7、Vista、XPなど)。どちらの場合、GUIDによる追加の方が安全ではありませんか(ユーザーが異なるWinバージョンを使用している場合)?
ジョニーなぜ2014

10
ちなみに、MS ScriptingRuntimeのGUIDは{420B2830-E718-11CF-893D-00A0C9054228}です。他のGUIDを手動で追加し、それぞれRef ThisWorkbook.VBProject.Referencesをループして使用することで、他のGUIDを見つけることができますDebug.Print Ref.Name, Ref.Guid
airstrike 2016

26

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

表示しているサンプルコードは、コードが含まれているブックへの参照を追加します。参照を追加する前に、90%の確率でコードのコンパイルに失敗しているため、通常、これを行う意味はありません。参照が欠落しているためです。(コンパイルに失敗しなかった場合は、実行時バインディングを使用している可能性があり、参照を追加する必要はありません。)

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

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

それとは別に、あなたの質問が何であるか、またはあなたがやろうとしていることがうまくいかないことについてもう少し明確にすることができれば、私はより具体的な答えを与えることができます。


10

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

以下のコードは、アクティブなワークブックで使用されているすべての参照を一覧表示する追加の関数を使用して、SiddharthRoutの回答から派生しています。ブックを新しいバージョンのExcelで開いた場合はどうなりますか?ブックはVBAコードを適応させなくても機能しますか?私はすでにOffice2003と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 forApplicationsExtensibility」オブジェクトへの参照は不要になりました。


3
マクロを有効にし、Visual Basicプロジェクトへのアクセスを信頼するをオンにする必要があることに注意してください(@Siddharth_Routからの回答のポイントaとb )が、VBIDE参照を削除するには+1です!また、DebugPrintExistingRefsが、行をコピーしてコードに貼り付ける形式で出力することを感謝します。
GlennFromIowa 2017年

7

プログラムで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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.