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.
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.
c) Vous avez défini manuellement une référence à l'objet "Microsoft Visual Basic pour Applications Extensibility".
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
:)
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.
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.
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".
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