par , 26/01/2020 à 16h42 (2123 Affichages)
Préambule
Avec le VBA, lorsque l’on pilote une autre application que celle où l’on développe, il y a lieu de passer par le référencement de la bibliothèque utilisée.
Exemple pour Word : Microsoft Word xx.n Object Library (remplacer xx.n par 14.0 pour Word 2010)
Cependant, le référencement peut poser problème lorsque des versions différentes cohabitent ou si l’on sauve l’application avec un référencement de version plus récente que celle avec laquelle va tourner l’application
Pour pallier ce problème, il est donc préférable de livrer l’application sans ce référencement et utiliser le LateBinding
Je renvoie vers cette fiche Early et Late Binding pour en savoir plus sur le sujet
Pour profiter des avantages du EarlyBinding lors du développement (IntelliSense) et profiter de ceux du LateBinding (indépendance vis-à-vis des versions), on utilisera la compilation conditionnelle.
C’est le but de ce billet
Exemple d'une procédure utilisant la compilation conditionnelle
Cette procédure doit être enclenchée avant d’utiliser l’objet Word
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| Sub StartWord()
' Compilation conditionnelle
#If IsLateBinding Then
Dim appWrd As Object
Dim wrdDoc As Object
Set appWrd = CreateObject("Word.Application")
#Else
' Phase de test
' Nécessite le référencemant de Microsoft Word xx.n Object Library
Dim appWrd As Word.Application
Dim wrdDoc As Word.Document
Set appWrd = New Word.Application
MsgBox "Phase de test EarlyBinding"
#End If
' Début du programme
With appWrd: .Visible = True: .Activate: End With
Set wrdDoc = appWrd.Documents.Add
' Ecriture dans le nouveau document Word
With appWrd.Selection
.TypeText Text:="Bonjour,"
.TypeParagraph
.TypeText Text:="Ceci est une phase de test"
.TypeParagraph
#If IsLateBinding Then
.TypeText Text:="Utilise le Late Binding"
#Else
.TypeText Text:="Utilise le Early Binding"
#End If
End With
Set appWrd = Nothing: Set wrdDoc = Nothing
End Sub |
Comment affecter une valeur à la constante
Pour l’exemple la constante se nomme IsLateBinding
Pour affecter une valeur à la constante deux possibilités. La première est connue dans le module où elle est placée, la seconde est valable pour l'ensemble du projet
1 - Par code VBA en tête de module
1 2
| Option Explicit
#Const IsLateBinding = True |
2 - A l'aide de la boîte de dialogue [VBAProject – Propriétés du projet]
Pour afficher cette boîte de dialogue, il y a lieu de cliquer sur la commande Propriétés de VBAProject... du menu Outils
Entrer NomConstante = Valeur dans la zone de texte Arguments de compilation conditionnelle de la boîte de dialogue VBAProject – Propriétés du projet comme illustré ci-dessous
Attention : Si la valeur de la constante est booléenne, il faut entrer sa valeur numérique (-1 pour True, False étant la valeur par défaut, il n’y a pas de raison de le définir)

Comment utiliser les constantes des autres applications
A partir du moment où l'on choisi de faire tourner l'application en Late binding, les constantes de l'application tierce que l'on utilise ne sont plus reconnues.
Pour rappel : Les constantes préfixées vb (vbCrLf, vbTab, etc.) sont connues dans toutes les applications VBA, xl (xlCenter, xlBottom) sont propres à Excel, wd à Word, pp à PowerPoint, ac pour Access, etc.
Donc pour conserver une transparence totale entre Late et Early Binding, il y a lieu de déclarer ces constantes et de leurs attribuer la même valeur dans une structure décisionnelle #If... #End If
Exemple à placer en tête du module
Il est possible de prévoir un module dédié à la déclaration des constantes mais dans ce cas la constante conditionnelle (IsLateBinding pour notre exemple) doit être dans ce même module ou la déclarer à l'aide de la boîte de dialogue VBAProject – Propriétés du projet comme expliqué plus haut afin qu'elle soit publique pour le projet.
1 2 3 4 5 6 7 8
| Option Explicit
#Const IsLateBinding = True
'
#If IsLateBinding Then
Public Const wdGoToBookmark As Long = -1
Public Const wdAlignParagraphCenter As Long = 1
Public Const wdListNumberStyleBullet As Long = 23
#End If |
A consulter
Liste des constantes énumérées pour Word