web-dev-qa-db-fra.com

Comment ajouter une référence par programme

J'ai écrit un programme qui s'exécute et envoie des messages à Skype avec des informations lorsque se termine. J'ai besoin d'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 un serveur de fichiers partagé (entre autres). Tous les autres ordinateurs doivent pouvoir exécuter ce programme. J'espérais éviter de configurer la référence à la main. J'avais prévu de placer la référence dans un emplacement partagé et de l'ajouter par programme lors de l'exécution du programme.

Je n'arrive pas à comprendre comment ajouter une référence par programmation à Excel 2007 à l'aide de VBA. Je sais comment le faire manuellement: Ouvrez VBE --> Tools --> References --> browse --_> File Location and Name. Mais ce n'est pas très utile pour mes fins. Je sais qu'il y a moyen de le faire dans Access Vb.net et que le code similaire à celui-ci continue à apparaître, mais je ne suis pas sûr de l'avoir compris, ou s'il 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 par programme, il me faudra ajouter une référence à la main et modifier le Centre de gestion de la confidentialité - ce qui ne se limite pas à l'ajout de la référence. Bien que je suppose que si je poursuis avec les solutions proposées, je pourrai ajouter des références futures par programme. Ce qui en fait probablement la peine.

Toute autre pensée serait géniale.

80
Ommit

Ommit

Il existe deux manières d'ajouter des références via VBA à vos projets.

1) Utilisation du GUID

2) référençant directement la dll.

Laissez-moi couvrir les deux.

Mais d’abord ce sont 3 choses que vous devez prendre en charge

a) Les macros doivent être activées

b) Dans les paramètres de sécurité, assurez-vous que l'option "Trust Access to Visual Basic" est cochée.

enter image description here

c) Vous avez défini manuellement une référence à l'objet "Microsoft Visual Basic pour Applications Extensibility".

enter image description here

Voie 1 (Utilisation du GUID)

J'ai l'habitude d'éviter de cette façon car je dois rechercher le GUID dans le registre ... ce que je déteste LOL. Plus sur GUID ici .

Sujet: Ajouter une bibliothèque de référence VBA via un code

Lien : 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

Voie 2 (Référence directe à 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\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

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

EDIT Battu par mischab1 :)

100
Siddharth Rout

Il existe deux manières d'ajouter des références à l'aide de VBA. .AddFromGuid(Guid, Major, Minor) et .AddFromFile(Filename). Le meilleur choix dépend de ce à quoi vous essayez d'ajouter une référence. J'utilise presque toujours .AddFromFile parce que je fais référence à d'autres projets Excel VBA et qu'ils ne figurent pas dans le registre Windows.

L'exemple de code que vous montrez ajoutera une référence au classeur dans lequel il se trouve. Je ne vois généralement aucune raison de le faire, car 90% du temps, avant que vous puissiez ajouter la référence, la compilation du code a déjà échoué. parce que la référence est manquante. (Et si la compilation n'a pas échoué, vous utilisez probablement une liaison tardive et vous n'avez pas besoin d'ajouter de référence.)

Si vous rencontrez des problèmes pour exécuter le code, deux problèmes sont possibles.

  1. Pour pouvoir utiliser facilement le modèle objet du VBE, vous devez ajouter une référence à Microsoft Visual Basic pour Application Extensibility. (VBIDE)
  2. Afin d'exécuter du code VBA Excel modifiant tout ce qui se trouve dans un VBProject, vous devez faire confiance à l'accès au modèle d'objet de projet VBA. (Dans Excel 2010, il se trouve dans Trust Center - Paramètres macro.)

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

23
mischab1

Parcourir le registre à la recherche d’instructions ou utiliser des chemins, quelle méthode est la meilleure. Si la consultation du registre n’est plus nécessaire, ne sera-t-il pas le meilleur moyen d’utiliser des guids? Office n'est pas toujours installé dans le même répertoire. Le chemin d'installation peut être modifié manuellement. De plus, le numéro de version fait partie du chemin. Je n'aurais jamais pu prédire que Microsoft ajouterait jamais '(x86)' à 'Program Files' avant l'introduction des processeurs 64 bits. Si possible, j'essayerais 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 répertorier toutes les références utilisées dans le classeur actif. Et si j'ouvre mon classeur dans une version ultérieure d'Excel? Le classeur fonctionnera-t-il toujours sans adaptation du code VBA? J'ai déjà vérifié que les guides pour Office 2003 et 2010 sont identiques. Espérons que Microsoft ne changera pas les guides dans les versions futures.

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

Quelles sont vos pensées? Bien sûr, nous ne pouvons prédire l'avenir, mais que pouvons-nous faire pour que notre version du code soit vérifiée?

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 pour Applications Extensibility".

7
hennep

Voici comment obtenir le Guid par programme! Vous pouvez ensuite utiliser ces guides/chemins de fichiers avec la 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()
'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

Voici le même code mais en imprimant sur le terminal si vous ne voulez pas dédier une feuille de calcul à 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 
5
Chad Crowe