par , 14/09/2018 à 15h23 (341 Affichages)
_______________________________________________________________________________________________________
Bonjour,
Ayant découvert ceci récemment, je voulais vous en faire un petit résumé en retour...
L'intérêt?
Pouvoir disposer, dans tous vos classeurs, de vos fonctions, procédures et classes favorites!
Comme beaucoup d'entres vous, j'utilises le classeur personal pour stocker des procédures et des fonctions VBA utiles.
Pour appeler ces procédures et fonctions depuis un classeur, ce n'est pas toujours aisé.
Voici les différents processus.
- Appeler une procédure :
Tout simplement en utilisant Run ou Application.Run.
En exemple, pour appeler la procédure nommée Macro1, située dans le classeur Personal.xlsb :
Application.Run "Personal.xlsb!Macro1"
Si la procédure Macro1 est une procédure paramétrée, on passera les paramètres (max 30 arguments) comme ceci :
Application.Run "Personal.xlsb!Macro1", Arg1, Arg2
Remarques : (extrait de l'aide VBA rubrique Application.Run, méthode)
Vous ne pouvez pas utiliser d'arguments nommés avec cette méthode. Ils doivent être transmis par position.
La méthode Run renvoie ce que la macro exécutée renvoie.
- Appeler une fonction :
Un peu plus délicat...
Il nous faut, tout comme pour n'importe qu'elle fonction d'une DLL, référencer le classeur personal.
Son nom, par défaut, est VBAProject. Or il s'avère que tout autre classeur possède son propre VBAProject.
En premier lieu, nous allons changer le nom du VBAProject du classeur personal.
Cliquez donc sur VBAProject (PERSONAL.XLSB) et modifiez le nom dans la fenêtre propriétés.
A titre personnel, j'ai choisit VBAProjectPersonal.
Dans le classeur depuis lequel vous souhaitez appeler une fonction de personal, ajoutez la référence :
Outils/Références... Cocher VBAProjectPersonal (ou le nom que vous avez choisi).
Vous pouvez maintenant appeler vos fonctions de la sorte :
1 2
| Dim B As Boolean
B = VBAProjectPersonal.FeuilleExist("Classeur1", "Feuil1") |
ou plus simplement encore :
1 2
| Dim B As Boolean
B = FeuilleExist("Classeur1", "Feuil1") |
Remarque :
Contrairement aux procédures (Sub) qui peuvent être Private, les fonctions (Function), au sein du classeur personal, doivent être Public pour être appelées depuis un autre classeur.
- Les modules de classe :
Sources : https://support.microsoft.com/en-us/help/555159
Nous allons créer, dans le classeur Personal.xlsb, une classe nommée ClassPersonne et y placerons ce code :
1 2 3 4 5 6 7 8 9
| Dim clsNom As String
Property Get Nom() As String
Nom = clsNom
End Property
Property Let Nom(N As String)
clsNom = N
End Property |
Très important : régler la propriété Instancing de votre Classe sur : 2- PublicNotCreatable.
Dans un module standard de votre classeur personal, vous allez créer cette fonction :
1 2 3
| Public Function New_Classe() As ClassPersonne
Set New_Classe = New ClassPersonne
End Function |
Dans le classeur depuis lequel vous souhaitez appeler une Classe de personal, ajoutez la référence :
Outils/Références... Cocher VBAProjectPersonal (ou le nom que vous avez choisi cf 2. plus haut).
Vous pouvez désormais utiliser votre classe, située dans votre classeur personal, depuis n'importe quel classeur, comme ceci par exemple :
1 2 3 4 5 6 7 8
| Sub Demo()
Dim Personne As VBAProjectPersonal.ClassPersonne
'ou Dim Personne As ClassPersonne
Set Personne = VBAProjectPersonal.New_Classe
' ou Set Personne = New_Classe
Personne.Nom = "TOTO"
MsgBox Personne.Nom
End Sub |
Je n'ai rien inventé, juste transmis le résumé de mes lectures.
Bonne journée.