Comment ajouter une référence programmatique

j'ai écrit un programme qui exécute et les messages Skype avec des informations quand si se termine. Je dois ajouter une référence pour Skype4COM.dll afin d'envoyer un message via Skype. Nous avons une douzaine d'ordinateurs sur un réseau et d'un serveur de fichiers partagés (entre autres choses). Tous les autres ordinateurs doivent être en mesure d'exécuter ce programme. J'espérais éviter la référence à la main. J'avais prévu de mettre la référence dans un endroit partagé, et d'ajouter par programme lorsque le programme est exécuté.

Je n'arrive pas à comprendre comment ajouter une référence programmatique à Excel 2007 en utilisant VBA. Je sais le faire manuellement: ouvrir VBE --> Tools --> References --> browse --_> File Location and Name . Mais ce n'est pas très utile pour mes fins. I know there are ways to do it in Access Vb.net et un code similaire n'arrêtait pas de surgir, mais je ne suis pas sûr de le comprendre, ou si c'est pertinent:

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

Jusqu'à présent, dans les solutions présentées, afin d'ajouter la référence programmatically je vais avoir besoin d'ajouter une référence à la main et changer le centre de confiance - qui est plus que juste ajouter la référence. Bien que je suppose que si je continue avec les solutions proposées je serai en mesure d'ajouter des références futures programmatically. Ce qui en vaut probablement la peine.

toute autre pensée serait grande.

73
demandé sur Community 2012-03-27 01:02:14

4 réponses

Omettre

il y a deux façons d'ajouter des références via VBA à vos projets

1) en utilisant le guide 151940920"

2) faisant directement référence à la dll.

laissez-moi couvrir les deux.

Mais d'abord, ce sont 3 choses que vous devez prendre soin de

a) Macros doivent être activées

b) dans les paramètres de sécurité, s'assurer que "L'accès en confiance au projet Visual Basic" est vérifié

enter image description here

c) Vous devez définir manuellement une référence à "Microsoft Visual Basic pour Applications" objet

enter image description here

Voie 1 (à l'Aide de GUID)

j'évite habituellement de cette façon, je dois chercher le guide dans le registre... ce que je déteste LOL. Plus d'informations sur le guide ici .

thème: ajouter une bibliothèque de référence VBA via le code

Link : http://www.vbaexpress.com/kb/getarticle.php?kb_id=267


Way 2 (faisant directement référence à la dll)

ce code ajoute une référence à 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"

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

    Set vbProj = Nothing
    Set VBAEditor = Nothing
End Sub

Note : Je n'ai pas ajouté le traitement des erreurs. Il est recommandé de l'utiliser dans votre code actuel :)

EDIT battu par mischab1 :)

89
répondu Siddharth Rout 2014-09-28 16:53:52

il y a deux façons d'ajouter des références en utilisant VBA. .AddFromGuid(Guid, Major, Minor) et .AddFromFile(Filename) . Quelle est la meilleure option dépend de ce que vous essayez d'ajouter une référence. J'utilise presque toujours .AddFromFile parce que les choses que je me réfère sont D'autres projets Excel VBA et ils ne sont pas dans le Registre de Windows.

L'exemple de code montrant permettra d'ajouter une référence au classeur le code est dans. Je ne vois généralement pas l'intérêt de faire cela parce que 90% du temps, avant vous pouvez ajouter la référence, le code a déjà réussi à compiler parce que la référence est manquante. (Et s'il n'a pas échoué à compiler, vous utilisez probablement late binding et vous n'avez pas besoin d'ajouter une référence.)

si vous avez des problèmes pour faire tourner le code, il y a deux problèmes possibles.

  1. afin d'utiliser facilement le modèle d'objet VBE, vous devez ajouter une référence à Microsoft Visual Basic pour L'Application Extensibilité . (VBIDE)
  2. pour exécuter le code Excel VBA qui change quoi que ce soit dans un projet VB, vous devez accès de confiance au Modèle d'objet de projet VBA . (Dans Excel 2010, il est situé dans le centre de confiance - Paramètres Macro.)

en dehors de cela, si vous pouvez être un peu plus clair sur ce que votre question Est ou ce que vous essayez de faire qui ne fonctionne pas, je pourrais donner une réponse plus spécifique.

20
répondu mischab1 2012-03-26 21:39:57

navigation dans le Registre pour les guids ou en utilisant des chemins, quelle méthode est la meilleure. Si la navigation sur le registre n'est plus nécessaire, n'est-ce pas la meilleure façon d'utiliser les guid? Office n'est pas toujours installé dans le même répertoire. Le chemin d'installation peut être modifié manuellement. Le numéro de version fait aussi partie du chemin. Je n'aurais jamais pu prédire que Microsoft ajouterait '(x86)' aux 'fichiers de programme' avant l'introduction des processeurs 64 bits. Si possible, j'essaierais d'éviter d'utiliser un chemin.

le code ci-dessous est dérivé de la réponse de Siddharth Rout, avec une fonction supplémentaire pour lister toutes les références qui sont utilisées dans le classeur actif. Que faire si J'ouvre mon classeur dans une version ultérieure D'Excel? Le cahier d'exercices fonctionnera-t-il encore sans adapter le code de la VBA? J'ai déjà vérifié que les guid pour office 2003 et 2010 sont identiques. Espérons que Microsoft ne change pas les guids dans les versions futures.

les arguments 0,0 (de .AddFromGuid) doit utiliser la dernière version de référence (que je n'ai pas pu tester).

Qu'en pensez-vous? Bien sûr, nous ne pouvons pas prédire l'avenir, mais que pouvons-nous faire pour rendre notre code version la preuve?

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

le code ci-dessus n'a plus besoin de la référence à L'objet" Microsoft Visual Basic for Applications Extensibility".

5
répondu hennep 2017-02-14 14:41:41

Voici comment obtenir le Guid programmatically! Vous pouvez ensuite utiliser ces gids / filepaths avec une réponse ci-dessus pour ajouter la référence!

référence: 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 

ici est le même code, mais l'impression sur le terminal si vous ne voulez pas consacrer une feuille de travail à la sortie.

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 
3
répondu Chad Crowe 2018-05-04 14:33:17