gratifiant > microsoft.* > microsoft.excel

Péhemme (07/10/2019, 16h51)
Bonjour à Tous,

J'ai des macros qui nécessitent le chargement préalable de références.
J'ai par ailleurs des macros qui coche automatiquement les références les
plus utilisées.

Dans le cas d'appel de ces premières macros, si la référence nécessaire
n'est pas chargée, j'obtiens le message :
"Erreur de compilation
Type défini par l'utilisateur non défini."

Je souhaite intercepter l'erreur générée afin d'appeler la macro de
chargement automatique dans le cas où la référence serait manquante.

Tous mes essais sont restés infructueux car l'erreur se manifeste dès
l'appel de la macro (première citée).

Merci d'avance de vos idées.

Michel
W7 - Excel 2010
MichD (07/10/2019, 19h42)
Bonjour,

Un exemple :
Pour exécuter une macro, supposons qu'Excel requiert la référence
suivante : "Microsoft Scripting Runtime" puisque j'ai déclaré une
variable comme ceci :
Dim Dc As Scripting.Dictionary

Comme la bibliothèque n'est pas chargée, Excel décèle une erreur de
"compilation" avant même d'exécuter le code. Par conséquent même si
j'inclus une gestion d'erreur à la procédure, elle ne sera pas exécutée
puisque la référence est manquante. Pour illustrer le propos, colle
cette macro dans un module et exécute-la.

'--------------------------------
Sub test()
Dim GestionErreur As String
On Error GoTo GestionErreur

Dim DC As Scripting.Dictionary

Set DC = createobject("Scripting.Dictionary")

Exit Sub

GestionErreur:

Set Sh = Worksheets.Add
Resume Next

Resume
End Sub

'--------------------------------

Pourquoi ne pas charger toutes les références à l'ouverture du classeur
comme ceci (celle qu'Excel ne charge pas par défaut). C'est de loin
l'approche la plus facile, la plus simple, et cela ne devraient pas
ralentir l'exécution ton code.

'-----------------------------------
Private Sub Workbook_Open()

On Error Resume Next
With ThisWorkbook.VBProject.References
.AddFromGuid GUID:="{420B2830-E718-11CF-893D-00A0C9054228}", _
Major:=1, Minor:=0
'.AddFromGuid ...
End With

End Sub
'-----------------------------------

Et pour trouver les paramètres de "AddFromGuid" de chacune de ces
références, tu charges manuellement toutes les références que ton
projetVBA requiert le temps d'exécuter cette macro suivante :

'------------------------------------
Sub AfficherLesGuids_Propriétés()
Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer

Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))

On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For a = 1 To NbRef
Sh.Cells(X, 1) = .Item(a).Name
Sh.Cells(X, 2) = .Item(a).Description
Sh.Cells(X, 3) = .Item(a).GUID
Sh.Cells(X, 4) = .Item(a).Major
Sh.Cells(X, 5) = .Item(a).Minor
Sh.Cells(X, 6) = .Item(a).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'------------------------------------

MichD
Péhemme (08/10/2019, 17h35)
Bonjour Denis,

Tout d'abord excuse-moi de revenir si tard, j'ai quitté la région parisienne
et suis actuellement sur la route pour rejoindre le sud de la France.
Ma question était purement intellectuelle.
J'ai ma "boîte d'outils" sur le ruban d'un fichier xlam.
Dans certains cas j'utilise des macros nécessitant les références :
.. VBIDE : Microsoft Visual Basic for Applications Extensibility 5.3
.. Word : Microsoft Word 14.0 Object Library
Celles-ci sont naturellement cochées.
À la suite de lectures sur le Net, je me suis amusé à écrire des macros qui
permettent de les charger sur demande, puis d'autres qui les décochent
également à la demande.
Fort de ces outils, je me demandais s'il n'était pas judicieux de mettre un
contrôle d'erreur en amont des macros qui utilisent ces références afin de
vérifier si les références nécessaires sont bien chargées et, si non, de le
faire automatiquement.
N'étant pas du tout à l'aise avec les GUIDS j'utilise, lors du chargement
par macros, le chemin complet de ces références.
En revanche, pour les décocher, j'utilise le nom de la référence (ex :
VBIDE, Word ou Scripting) que j'ai trouvé en utilisant une macro que tu
avais du publier ici-même quand j'étais jeune :-)).
Voilà, tu sais tout.
Par ailleurs, quand on est dans le VBE, 3 clicks pour charger une référence
n'a jamais tué personne.
Merci en tout cas pour ta réponse et conserve tes suggestions.
Bien amicalement
Michel

"MichD" a écrit dans le message de groupe de discussion :
qnftda$ta0$1...

Bonjour,

Un exemple :
Pour exécuter une macro, supposons qu'Excel requiert la référence
suivante : "Microsoft Scripting Runtime" puisque j'ai déclaré une
variable comme ceci :
Dim Dc As Scripting.Dictionary

Comme la bibliothèque n'est pas chargée, Excel décèle une erreur de
"compilation" avant même d'exécuter le code. Par conséquent même si
j'inclus une gestion d'erreur à la procédure, elle ne sera pas exécutée
puisque la référence est manquante. Pour illustrer le propos, colle
cette macro dans un module et exécute-la.

'--------------------------------
Sub test()
Dim GestionErreur As String
On Error GoTo GestionErreur

Dim DC As Scripting.Dictionary

Set DC = createobject("Scripting.Dictionary")

Exit Sub

GestionErreur:

Set Sh = Worksheets.Add
Resume Next

Resume
End Sub

'--------------------------------

Pourquoi ne pas charger toutes les références à l'ouverture du classeur
comme ceci (celle qu'Excel ne charge pas par défaut). C'est de loin
l'approche la plus facile, la plus simple, et cela ne devraient pas
ralentir l'exécution ton code.

'-----------------------------------
Private Sub Workbook_Open()

On Error Resume Next
With ThisWorkbook.VBProject.References
.AddFromGuid GUID:="{420B2830-E718-11CF-893D-00A0C9054228}", _
Major:=1, Minor:=0
'.AddFromGuid ...
End With

End Sub
'-----------------------------------

Et pour trouver les paramètres de "AddFromGuid" de chacune de ces
références, tu charges manuellement toutes les références que ton
projetVBA requiert le temps d'exécuter cette macro suivante :

'------------------------------------
Sub AfficherLesGuids_Propriétés()
Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer

Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))

On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For a = 1 To NbRef
Sh.Cells(X, 1) = .Item(a).Name
Sh.Cells(X, 2) = .Item(a).Description
Sh.Cells(X, 3) = .Item(a).GUID
Sh.Cells(X, 4) = .Item(a).Major
Sh.Cells(X, 5) = .Item(a).Minor
Sh.Cells(X, 6) = .Item(a).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'------------------------------------

MichD
MichD (08/10/2019, 19h35)
Nul besoin de te compliquer la vie. Place cette macro dans le
ThisWorkbook de ton projetVBA. La bibliothèque VBIDE et Word va se
charger automatiquement dès l'ouverture d'Excel. Si elles le sont déjà
le code suivant ne provoquera pas une erreur.

Cette méthode charge les bibliothèques directement à partir du registre
de Windows. Lorsque tu utilises le chemin complet des 2 fichiers
sous-jacents à ces 2 bibliothèques, ces chemins peuvent être différents
selon la version d'Office ou de Windows que tu utilises. Ce n'est pas le
cas avec le "Guid".

'------------------------------------------
Private Sub Workbook_Open()
On Error Resume Next
With ThisWorkbook.VBProject.References
'Charge la bibliothèque VBIDE
.AddFromGuid GUID:="{0002E157-0000-0000-C000-000000000046}", _
Major:=5, Minor:=3
'Charge la bibliothèque WORD
.AddFromGuid GUID:="{00020905-0000-0000-C000-000000000046}", _
Major:=8, Minor:=7
End With
End Sub
'------------------------------------------

MichD

Le 08/10/19 à 11:35, Péhemme a écrit :
[..]
Péhemme (09/10/2019, 09h37)
Merci Denis de ces informations.
Je reprends ma route en espérant trouver du beau temps.
:-)))
Bien amicalement
Michel

"MichD" a écrit dans le message de groupe de discussion :
qnihcv$11r7$1...

Nul besoin de te compliquer la vie. Place cette macro dans le
ThisWorkbook de ton projetVBA. La bibliothèque VBIDE et Word va se
charger automatiquement dès l'ouverture d'Excel. Si elles le sont déjà
le code suivant ne provoquera pas une erreur.

Cette méthode charge les bibliothèques directement à partir du registre
de Windows. Lorsque tu utilises le chemin complet des 2 fichiers
sous-jacents à ces 2 bibliothèques, ces chemins peuvent être différents
selon la version d'Office ou de Windows que tu utilises. Ce n'est pas le
cas avec le "Guid".

'------------------------------------------
Private Sub Workbook_Open()
On Error Resume Next
With ThisWorkbook.VBProject.References
'Charge la bibliothèque VBIDE
.AddFromGuid GUID:="{0002E157-0000-0000-C000-000000000046}", _
Major:=5, Minor:=3
'Charge la bibliothèque WORD
.AddFromGuid GUID:="{00020905-0000-0000-C000-000000000046}", _
Major:=8, Minor:=7
End With
End Sub
'------------------------------------------

MichD

Le 08/10/19 à 11:35, Péhemme a écrit :
[..]
Discussions similaires