TUTO EXCELLONS : REFERENCEMENT DES OBJETS
L’un des atouts de la suite Microsoft Office réside dans l’interopérabilité des applications qui la compose.
Pour mettre en oeuvre cette interopérabilité, il est nécessaire de procéder au référencement des objets.
Pour programmer en VBA l’interaction d’EXCEL avec WORD par exemple, il est nécessaire de référencer les éléments (propriétés, méthodes, collections, énumérations, …) exposées par l’objet WORD dans EXCEL.
Un référencement est nécessaire quelque soit l’application Microsoft Office en jeu mais également lorsque nous utilisons des objets Microsoft particuliers (« FileSystemObject », « Microsoft XML » …) ou encore lorsque nous mettons en œuvre des composants non Microsoft (composants ActiveX par exemple).
Cet article présente de façon concise ce qu’il est nécessaire de connaître concernant le référencement des objets.
(Les copies-écrans du présent document sont issues d’EXCEL version 365)
Dans la boîte de dialogue qui s’ouvre, apparaissent toutes les bibliothèques d’objets des applications installées et enregistrés sur l’ordinateur.
Remarquons que quelques-unes d’entre-elles sont sélectionnées automatiquement et, parmi celles-ci, la référence « Microsoft Excel XX.X Object Library » : celle de l’application EXCEL (XX.X étant la version d’EXCEL installée sur notre ordinateur. Ici la version 16.0 – vous pouvez en avoir une différente).
LES 2 MODALITES DE REFERENCEMENT : LIAISON ANTICIPEE vs LIAISON TARDIVE
Le VBA permet de réaliser le référencement des objets suivant 2 modalités :
- La liaison anticipée (early binding)
- La liaison tardive (late binding)
Chacune de ces modalités comporte certains avantages et certains inconvénients résumés dans le tableau suivant :
La mise en oeuvre dans VBA de ces 2 modalités est détaillée ci-dessous.
Lorsque l’on utilise la liaison anticipée avec l’application WORD, le code VBA de déclaration des objets se présente ainsi :
Sub gvs_Exemple_Referencement_Liaison_Anticipée()
'On déclare une variable objet référençant l'application
Dim oWordApp As Word.Application
'On déclare une variable objet référençant un document word
Dim oDoc As Word.Document
'On affecte une nouvelle instance de l'application WORD
Set oWordApp = New Word.Application
'On crée un nouveau document que l’on affecte à la variable
Set oDoc = oWordApp.Documents.Add
‘
'
' Partie de notre programme consommant les objets exposés
'
'
oDoc.Close False ‘ A adapter
'On ferme l'instance de l'application utilisée
oWordApp.Quit
'On fait le ménage
Set oDoc = Nothing
Set oWordApp = Nothing
End Sub
iAvec la liaison anticipée lors de l’écriture du code VBA, la fonction ‘IntelliSense’ est active. Ceci signife que, en faisant référence à l’un des objets de l’objet lié, VBE présente automatiquement la totalité des évènements/propriétés/méthodes liés à cet objet. Illustration de la fonction IntelliSense :
De plus, avec la liaison anticipée, l’Explorateur d’objet (Affichage/Explorateur d’objets ou F2) expose l’intégralité des Evèvements/Propriétés/Méthodes propres à un objet référencé. Ceci peut s’avérer utile pour s’approprier des objets complexes comme, par exemple WORD. Les images suivantes illustrent l’explorateur de l’objet WORD :
MISE EN OEUVRE DE LA LIAISON TARDIVE (LATE BINDING)
Pour la liaison tardive, aucune sélection n’est réalisée dans la boîte de dialogue ‘Références – VBAProject’ et le code VBA de déclaration des objets est sensiblement différent de celui pour une liaison anticipée. Par exemple, toujours avec l’objet WORD, le code VBA se présente ainsi :
Sub gvs_Exemple_Referencement_Liaison_Tardive()
'On déclare une variable objet pour l’application
Dim oWordApp As Object
'On déclare une variable objet référençant un document word
Dim oDoc As Object
'On déclare un booleen
Dim booWORDActif As Boolean
'On suspend la survenue d’erreur
On Error Resume Next
'On se réfère à l'application WORD en considérant qu'elle est déjà ouverte
booWORDActif = True
Set oWordApp = GetObject(, "Word.Application")
'Si la variable oWordapp n'a pas été initialisée par la ligne précédente c'est que WORD n'est pas ouvert.
If oWordApp Is Nothing Then
'On affecte alors une nouvelle instance de l'application WORD
Set oWordApp = CreateObject("Word.Application")
booWORDActif = False
End If
'On rétablit la survenue d’erreur
On Error GoTo 0
'On affecte une nouveau document
Set oDoc = oWordApp.Documents.Add
'
' Partie de notre programme consommant les objets exposés
'
oDoc.Close False
'On ferme l'instance de l'application utilisée si WORD n'était pas prélablement actif
If Not booWORDActif Then
oWordApp.Quit
End If
'On fait le ménage
Set oDoc = Nothing
Set oWordApp = Nothing
End Sub
Avec la liaison tardive, nous ne bénéficions ni de la fonction ‘IntelliSense’ de VBA ni de l’Explorateur d’objet. De ce fait, lors de l’écriture du code VBA, il est nécessaire de bien connaitre les Evènements/Propriétés/Méthodes exposés par l’object avec lequel on interopère.
LIAISON ANTICIPEE vs TARDIVE – LE BON COMPROMIS
Comme vu dans les paragraphes précédents, la liaison anticipée assure une écriture du code plus simple et rapide.
Toutefois, lorsque le développement est destiné à être distribué sur d’autre postes de travail que celui du développement, nous risquons de générer certaines difficultés si nous utilisonqs les liaisons anticipées.
En effet, Microsoft respecte (la plupart du temps) le principe de compatibilité ascendante, mais ce principe ne s’applique pas dans le sens descendant.
Ce qui signifie que, si nous développons une solution avec liaisons anticipées sous MS Office 2015, par exemple, celle-ci fonctionnera sans problème sur des ordinateurs installés avec MS Office 2015 et, en principe avec les versions ultérieures (2016, 365…). Dans cette situation, MS Office mettra automatiquement à jour le référencement initial au profit du référencement à la version de l’objet installé.
En revanche, sur les ordinateurs installés avec une version plus ancienne que MS Office 2015, le développement VBA réalisé risque fortement de provoquer un bug documenté par un message pour le moins obscur : ‘zzzzz n’est pas une fonction valide’ ( ‘zzzzz’ pouvant être n’importe quelle fonction sans rapport avec le code VBA écrit pour interopérer).
En pareil cas, si nous affichons la boîte de dialogue ‘Références’, nous remarquerons que la (les) référence(s) cochée(s) lors du développement est (sont) indiquée(s) comme « MANQUANT ».
Pour corriger le problème, nous devrons intervenir sur chaque ordinateur pour dé-référencer la (les) référence(s) manquante(s) et référencer l’objet de la version MS Office installée. (Si le nombre d’ordinateurs est important, c’est la galère ! ☹)
Démarche optimale suggérée :
- Lors de la phase de développement et jusqu’à la finalisation de nos tests, pour bénéficier des avantages liés à l’écriture du code, nous mettrons en œuvre les liaisons anticipées.
- Avant de distribuer la solution développée, nous modifierons le code VBA en mettant en œuvre les liaisons tardives : déclarations des variables suivant cette modalité de laison (voir plus haut) et en dé-référençant le (les) objet(s) référencé(s) dans la boîte de dialogue ‘Références’. Ces opérations réalisées, il est recommandé de recompiler le code VBA autant de fois que nécessaire afin d’éliminer toutes les erreurs de référencement.Attention aux énumérations utilisées : après déférencement, à la compilation, elles génèreront une erreur « variable non définie ». Il conviendra alors de les définir explicitement dans le code VBA en tant que constantes.
