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