Avec vba, je voudrais charger automatiquement une macro complémentaire 'mesmacros.xla' à l'ouverture de CERTAINSclasseurs et la décharger à la fermeture de ces mêmes classeurs.
Si ta XLA est déjà présente dans la liste :
Application.AddIns("Macro complémentaire").Installed = True
En remplaçant par le nom apparaissant dans la liste quand tu fais Outils,
Macros Complémentaires
Sinon, il faut au préalable l'ajouter à la liste :
Application.AddIns.Add ("C: otomacrocomp.xla")
Une autre approche pourrait être de laisser ta macro complémentaire disponible en permanence (=cochée dans la liste de la boite de dialogue 'OutilsMacros complémentaires...'), et de la rendre disponible aux classeurs qui t'intéressent en établissant une référence vers cette macro à l'ouverture des classeurs voulus et en la supprimant à leur fermeture.
Les bouts de code pour établir et supprimer une référence :
Sub AjouteRéférence2()
'nom du classeur auquel renvoie la référence (à adapter):
' "D: 6OfficeVBAClasseurTestXla.Xla"
'nom du projet VBA de ce classeur (à adapter):
' "ClasseurTestXla(ClasseurTestXla.Xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D: 6OfficeVBAClasseurTestXla.Xla"
End Sub
Sub EnlèveRéférence2()
With ThisWorkbook.VBProject.References
.Remove .Item("ClasseurTestXla")
End With
End Sub
Application.AddIns("Macro complémentaire").Installed = True
En remplaçant par le nom apparaissant dans la liste quand tu fais Outils,
Macros Complémentaires
Sinon, il faut au préalable l'ajouter à la liste :
Application.AddIns.Add ("C: otomacrocomp.xla")
Une autre approche pourrait être de laisser ta macro complémentaire disponible en permanence (=cochée dans la liste de la boite de dialogue 'OutilsMacros complémentaires...'), et de la rendre disponible aux classeurs qui t'intéressent en établissant une référence vers cette macro à l'ouverture des classeurs voulus et en la supprimant à leur fermeture.
Les bouts de code pour établir et supprimer une référence :
Sub AjouteRéférence2()
'nom du classeur auquel renvoie la référence (à adapter):
' "D: 6OfficeVBAClasseurTestXla.Xla"
'nom du projet VBA de ce classeur (à adapter):
' "ClasseurTestXla(ClasseurTestXla.Xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D: 6OfficeVBAClasseurTestXla.Xla"
End Sub
Sub EnlèveRéférence2()
With ThisWorkbook.VBProject.References
.Remove .Item("ClasseurTestXla")
End With
End Sub
Papou, Frédéric Sigonneau,
Ajouté ou modifié le 05/04/2008 (N°2004)
Ajouté ou modifié le 05/04/2008 (N°2004)
J'ai créé une macro, je l'ai transformée en macro complémentaire XLA. Comment l'appeller
depuis un bouton ?
La XLA étant chargée, elle apparait dans vba.
Sur le module ThisWorkbook de la xla ---> propriété
mettre IsAddin sur false puis retourner sur XL.
La XLA est maintenant visible ---> outils ---> macro
Sélectionner la macro ---> Options ---> Touche de raccourci
Remettre IsAddin sur true puis sauvegarder dans vba par l'icone disquette.
Sur le module ThisWorkbook de la xla ---> propriété
mettre IsAddin sur false puis retourner sur XL.
La XLA est maintenant visible ---> outils ---> macro
Sélectionner la macro ---> Options ---> Touche de raccourci
Remettre IsAddin sur true puis sauvegarder dans vba par l'icone disquette.
Alain Cros,
Ajouté ou modifié le 24/10/2004 (N°1505)
Ajouté ou modifié le 24/10/2004 (N°1505)
Comment affecter un raccourci clavier à une macro contenue dans un xla ?
Utilise ce code dans l'événement Workbook_AddinInstall de la macro complémentaire :
Application.MacroOptions Macro:="zaza", ShortcutKey:="L"
"zaza" étant le nom de la procédure à exécuter avec le raccourci clavier.
Application.MacroOptions Macro:="zaza", ShortcutKey:="L"
"zaza" étant le nom de la procédure à exécuter avec le raccourci clavier.
Frédéric Sigonneau,
Ajouté ou modifié le 16/05/2004 (N°1415)
Ajouté ou modifié le 16/05/2004 (N°1415)
J'ai mis un tas de macros dans un xla vers lequel pointe une référence de mon
fichier de travail. La xla s'ouvre en même temps que le classeur contenant la référence mais ne se ferme pas à la fermeture du classeur. Comment faire ?
Sub AjouteRéférence()
'nom du classeur auquel renvoie la référence :
' "D:\OfficeVBA\Progs\ProtectUnprotect\Protege.xla"
'nom du projet VBA de ce classeur :
' "Protege(Protege.xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D:\OfficeVBA\Progs\ProtectUnprotect\Protege.xla"
End Sub
Sub EnleveReferenceEtFerme()
With ThisWorkbook.VBProject.References
.Remove .Item("protege")
End With
Workbooks("protege.xla").Close
End Sub
La première procédure peut être appelée à l'ouverture, la seconde à la fermeture. Attention aux nuances dans les noms passés aux différentes méthodes... Le VBAProjet de ta macro xla doit absolument avoir un nom différent de VBAProject(nom par défaut qui renvoie en fait au perso.xls et provoque une erreur).
'nom du classeur auquel renvoie la référence :
' "D:\OfficeVBA\Progs\ProtectUnprotect\Protege.xla"
'nom du projet VBA de ce classeur :
' "Protege(Protege.xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D:\OfficeVBA\Progs\ProtectUnprotect\Protege.xla"
End Sub
Sub EnleveReferenceEtFerme()
With ThisWorkbook.VBProject.References
.Remove .Item("protege")
End With
Workbooks("protege.xla").Close
End Sub
La première procédure peut être appelée à l'ouverture, la seconde à la fermeture. Attention aux nuances dans les noms passés aux différentes méthodes... Le VBAProjet de ta macro xla doit absolument avoir un nom différent de VBAProject(nom par défaut qui renvoie en fait au perso.xls et provoque une erreur).
Frédéric Sigonneau,
Ajouté ou modifié le 16/05/2004 (N°1414)
Ajouté ou modifié le 16/05/2004 (N°1414)
Comment m'assurer lors du lancement de mon application que la
macro complémentaire Utilitaire d'analyse VBA soit bien activée.
Si elle n'est pas chargé alors je veux l'activer.
tu peux tester l'activation d'une macro complémentaire avec la propriété
AddIns
If AddIns("Utilitaire d'analyse").Installed = True Then
MsgBox "L'utilitaire d'analyse est installé"
Else
MsgBox "L'utilitaire d'analyse n'est pas installé"
End If
Pour référencer une macro, utilise la propriété Add de l'objet AddIns :
Set maMacro = AddIns.Add(Filename:="Chemin macro.xla", CopyFile:=True)
AddIns
If AddIns("Utilitaire d'analyse").Installed = True Then
MsgBox "L'utilitaire d'analyse est installé"
Else
MsgBox "L'utilitaire d'analyse n'est pas installé"
End If
Pour référencer une macro, utilise la propriété Add de l'objet AddIns :
Set maMacro = AddIns.Add(Filename:="Chemin macro.xla", CopyFile:=True)
Yannick,
Ajouté ou modifié le 16/05/2004 (N°1412)
Ajouté ou modifié le 16/05/2004 (N°1412)
Je souhaiterais créer un executable afin d'installer une macro
complémentaire dans Excel.
target="_blank"> Ce script vbs à télécharger sur le site de Frédéric
fait ce travail par l'intermédiaire d'une commande de menu (clic droit) dans l'explorateur
:
L'archive comporte un script d'installation et un autre de désinstallation
(lancé dans Ajout/suppression de programmes du panneau de configuration). Il y a
aussi un fichier LisezMoi.txt qui explique le fonctionnement (OK avec Windows
2000 bien que cela ne soit pas mentionné).
Et, bien sûr, le code est librement accessible.
fait ce travail par l'intermédiaire d'une commande de menu (clic droit) dans l'explorateur
:
L'archive comporte un script d'installation et un autre de désinstallation
(lancé dans Ajout/suppression de programmes du panneau de configuration). Il y a
aussi un fichier LisezMoi.txt qui explique le fonctionnement (OK avec Windows
2000 bien que cela ne soit pas mentionné).
Et, bien sûr, le code est librement accessible.
Frédéric Sigonneau,
Ajouté ou modifié le 16/05/2004 (N°1404)
Ajouté ou modifié le 16/05/2004 (N°1404)
J'ai fait une macro qui fonctionne très bien mais quand je la transforme en xla elle cesse de
fonctionner. Qu'est ce qui peut expliquer ce phénomène ?
Si par exemple tu as une instruction avec ThisWorkbook dans ta macro
complémentaire, elle marcherait dans un classeur mais produirait la plupart du
temps une erreur dans ta macro complémentaire. Il faudrait alors remplacer
ThisWorkbook par ActiveWorkbook.
complémentaire, elle marcherait dans un classeur mais produirait la plupart du
temps une erreur dans ta macro complémentaire. Il faudrait alors remplacer
ThisWorkbook par ActiveWorkbook.
Frédéric Sigonneau, (N°1075)
J'ai créé un fichier avec tout plein de fonctions et j'ai mis dans une feuille EXCEL plusieurs
données que je vais chercher quand j'en ai besoin. Puis pour ne pas surcharger mon fichier
PERSO, je l'ai enregistré comme xla.Mais comment faire maintenant pour visualiser ce fichier
pour le mettre à jour ?
c'est normal : un xla c'est fait pour disposer de trucs écrits en VBA, on
n'en voit pas les feuilles dans Excel.
Réenregistre-le en .xls et elles réapparaitront.
n'en voit pas les feuilles dans Excel.
Réenregistre-le en .xls et elles réapparaitront.
Catherine et Sainte Zaza, (N°1074)

j'ai créé un fichier toto.xla (le premier que j'entends rire je
l'escrabouille) que j'ai mis dans le répertoire Macrolib ; quand je fais Outils/Macros
complémentaires, mon toto apparaît bien dans la liste des macros complémentaires mais quand je
coche ou décoche la casette (petite case) devant mon toto, le système me crache à la figure un
message qui dit "impossible de trouver la macro C\..........\ oto.xla!. Voulez-vous
la supprimer de la liste. OUI NON" je réponds que NON : avec ce qu'elle
m'en a fait baver pour la créer ma toto.xla, vous pensez bien que je ne vais pas répondre OUI ;
vous allez me dire que je peaufine car, une fois cochée la case et une fois répondu NON, les
macros de ce toto.xla fonctionnent normalement ; mais comprenez que mon purisme dont l'écho se
répercutera in saecula saeculorum ne peut souffrir un tel agissement de la part de ma bécane ;
si quelqu'un parmi vous, gentes dames et gents damoiseaux, peut entr'apercevoir la moindre
action pour réparer cette bizarrerie, il bénéf
Lorsque le système te crache à la figure un message qui dit "impossible de trouver la
macro C..........toto.xla!. Voulez-vous la supprimer de la liste. OUI NON" réponds que
OUI, et ensuite ferme excel et réouvre le et refait la manip du parcourir.
Ca te permet souvent de la récupérer
Si ca ne marche pas, Tu peux toujours essayer de fermer Excel, et d'aller lancer la
macro-commande par un double-clic classique dans l'Explorateur. En principe
Excel va se lancer et lancer la macro-commande. Ensuite tu ouvres un
classeur vierge si Excel ne l'a pas fait.
macro C..........toto.xla!. Voulez-vous la supprimer de la liste. OUI NON" réponds que
OUI, et ensuite ferme excel et réouvre le et refait la manip du parcourir.
Ca te permet souvent de la récupérer
Si ca ne marche pas, Tu peux toujours essayer de fermer Excel, et d'aller lancer la
macro-commande par un double-clic classique dans l'Explorateur. En principe
Excel va se lancer et lancer la macro-commande. Ensuite tu ouvres un
classeur vierge si Excel ne l'a pas fait.
Isabelle, Clément Marcotte, (N°1073)
Je voudrais récupérer par VBA le noms des fichiers xla qui sont en add-ins dans excel.
Pour récupérer des informations sur les macros complémentaires disponibles,
essaie ce code tiré de l'aide sur l'objet Addins :
Sub XlaProperties()
Workbooks.Add
With ActiveSheet
.Rows(1).Font.Bold = True
.Range("A1:D1").Value = _
Array("Name", "Full Name", "Title", "Installed")
For i = 1 To AddIns.Count
.Cells(i + 1, 1) = AddIns(i).Name
.Cells(i + 1, 2) = AddIns(i).FullName
.Cells(i + 1, 3) =
AddIns(i).Title
.Cells(i + 1, 4) = AddIns(i).Installed
Next
.Range("A1").CurrentRegion.Columns.AutoFit
End With
End Sub
essaie ce code tiré de l'aide sur l'objet Addins :
Sub XlaProperties()
Workbooks.Add
With ActiveSheet
.Rows(1).Font.Bold = True
.Range("A1:D1").Value = _
Array("Name", "Full Name", "Title", "Installed")
For i = 1 To AddIns.Count
.Cells(i + 1, 1) = AddIns(i).Name
.Cells(i + 1, 2) = AddIns(i).FullName
.Cells(i + 1, 3) =
AddIns(i).Title
.Cells(i + 1, 4) = AddIns(i).Installed
Next
.Range("A1").CurrentRegion.Columns.AutoFit
End With
End Sub
Frédéric Sigonneau, (N°1072)
Comment supprimer définitivement une macro dans la liste des macros complémentaires.
Une fois que tu as supprimé ta macro complémentaire du dossier Macrolib ou
WindowsApplication DataMicrosoftMacros complémentaires, tu ouvres dans Excel
la boite de dialogue d'installation des macros complémentaires (OutilsMacros
complémentaires...) et tu sélectionnes le nom de celle que tu viens de
supprimer. Excel (97 ou 2000) te demande alors si tu veux la supprimer de la
liste.
WindowsApplication DataMicrosoftMacros complémentaires, tu ouvres dans Excel
la boite de dialogue d'installation des macros complémentaires (OutilsMacros
complémentaires...) et tu sélectionnes le nom de celle que tu viens de
supprimer. Excel (97 ou 2000) te demande alors si tu veux la supprimer de la
liste.
Frédéric Sigonneau, (N°1071)
Comment rendre automatique la référence à une XLA dans un classeur ? A quoi cela sert-il de
créer une référence ? quel intérêt par rapport à l'installation simple d'une xla ? est-ce que
cela simplifie l'appel des macros ? comment ?
Pour la première question : Ajoute cette macro dans ton classeur
Sub AjouteRéférence()
'nom de la macro complémentaire auquel renvoie la référence :
"D:\ 6OfficeVBA\ClasseurTestXla.Xla"
'nom du projet VBA de cette macro :
"ClasseurTestXla(ClasseurTestXla.Xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D:\ 6OfficeVBA\ClasseurTestXla.Xla"
End Sub
Sub EnlèveRéférence()
ThisWorkbook.VBProject.References.Remove _
ThisWorkbook.VBProject.References.Item("ClasseurTestXla")
End Sub
Il suffit de lancer une fois la procédure AjouteRéférence pour que la référence
soit établie. On peut aussi appeler AjouteRéférence dans le Workbook_Open du
classeur qui doit utiliser les ressources de la macro complémentaire et
EnlèveRéférence dans son événement BeforeClose.
Les procédures et fonctions publiques des compléments XLA ou autres
peuvent être appelées directement comme si elles faisaient partie du
projet en cours :
Truc = UneFonctionXLA(Toto) au lieu de
Truc = Run("Mon ClasseurXLA.xls!UneFonctionXLA", Toto)
=> plus pratique à utiliser, bien sûr, et également plus rapide à
l'exécution.
D'autre part tous les arguments sont documentés (noms, types,
obligatoires / optionnels), les procédures et fonctions apparaissent
dans l'explorateur d'objet et sont éventuellement associées à un fichier
d'aide utilisable en contexte par F1 dans l'éditeur VBA. Toutes choses
impossibles quand le fichier n'est pas ajouté en tant que référence.
Enfin, quand tu ajoutes une référence à une macro B.xla dans le projet
VBA d'un classeur A.xls, l'ouverture de A.xls entraîne automatiquement
celle de B.xla. Celui-ci n'est pas ouvert en permanence, mais seulement
quand il le faut.
Les références, par rapport aux macros complémentaires installées
directement sous Excel, concernent davantage des XLA destinées à
apporter de nouvelles fonctionnalités pour le programmeur VBA, pas pour
l'utilisateur final (ou alors pour les deux à la fois si la XLA est
prévue en même temps pour une installation classique et par ajout de
référence)
Sub AjouteRéférence()
'nom de la macro complémentaire auquel renvoie la référence :
"D:\ 6OfficeVBA\ClasseurTestXla.Xla"
'nom du projet VBA de cette macro :
"ClasseurTestXla(ClasseurTestXla.Xla)"
ThisWorkbook.VBProject.References.AddFromFile _
"D:\ 6OfficeVBA\ClasseurTestXla.Xla"
End Sub
Sub EnlèveRéférence()
ThisWorkbook.VBProject.References.Remove _
ThisWorkbook.VBProject.References.Item("ClasseurTestXla")
End Sub
Il suffit de lancer une fois la procédure AjouteRéférence pour que la référence
soit établie. On peut aussi appeler AjouteRéférence dans le Workbook_Open du
classeur qui doit utiliser les ressources de la macro complémentaire et
EnlèveRéférence dans son événement BeforeClose.
Les procédures et fonctions publiques des compléments XLA ou autres
peuvent être appelées directement comme si elles faisaient partie du
projet en cours :
Truc = UneFonctionXLA(Toto) au lieu de
Truc = Run("Mon ClasseurXLA.xls!UneFonctionXLA", Toto)
=> plus pratique à utiliser, bien sûr, et également plus rapide à
l'exécution.
D'autre part tous les arguments sont documentés (noms, types,
obligatoires / optionnels), les procédures et fonctions apparaissent
dans l'explorateur d'objet et sont éventuellement associées à un fichier
d'aide utilisable en contexte par F1 dans l'éditeur VBA. Toutes choses
impossibles quand le fichier n'est pas ajouté en tant que référence.
Enfin, quand tu ajoutes une référence à une macro B.xla dans le projet
VBA d'un classeur A.xls, l'ouverture de A.xls entraîne automatiquement
celle de B.xla. Celui-ci n'est pas ouvert en permanence, mais seulement
quand il le faut.
Les références, par rapport aux macros complémentaires installées
directement sous Excel, concernent davantage des XLA destinées à
apporter de nouvelles fonctionnalités pour le programmeur VBA, pas pour
l'utilisateur final (ou alors pour les deux à la fois si la XLA est
prévue en même temps pour une installation classique et par ajout de
référence)
Frédéric Sigonneau, Laurent Longre, (N°1070)
J'ai créé un fichier xla qui contient des macros. J'ai un classeur xls dans lequel j'ai un
bouton personnalisé qui appelle une des macros du xla. Lorsque je clique sur ce bouton excel
recherche la macro dans le classeur et pas dans la xla. Comment lui dire de chercher dans le
xla ?
Quand la macro complémentaire est installée, il suffit d'entrer le nom de la procédure à
exécuter dans la boite de dialogue "Affecter une macro" pour que le bouton lance la
procédure. Cependant cette affectation est volatile. A la prochaine ouverture du classeur, un
clic sur le bouton va rechercher la procédure dans le classeur actif ou la première (par ordre
alphabétique) macro complémentaire installée.
Il y a plusieurs moyens de contraindre le bouton à toujours déclencher la procédure souhaitée
mais il faut passer par un peu de VBA.Le plus simple, est de réaffecter la procédure au bouton
dans l'événement Open du classeur Perso.xls. Ceci garantit que le bouton pourra dès l'ouverture
d'Excel lancer la bonne procédure même s'il est cliqué en dehors du contexte souhaité (un
classeur particulier). Et c'est ce qui demande le moins de travail...
Dans l'événement Workbook_Open du Perso.xls, une ligne de code comme celle-ci suffit :
Application.CommandBars("LaBarre").Controls("NomBouton").OnAction =
"y"
"LaBarre" est le nom de la barre d'outils (intégrée ou personnalisée) où le
bouton a été monté "NomBouton" est le nom du bouton (Personnaliser, clic droit sur le
bouton et taper le nom souhaité dans la zone "Nom :")
exécuter dans la boite de dialogue "Affecter une macro" pour que le bouton lance la
procédure. Cependant cette affectation est volatile. A la prochaine ouverture du classeur, un
clic sur le bouton va rechercher la procédure dans le classeur actif ou la première (par ordre
alphabétique) macro complémentaire installée.
Il y a plusieurs moyens de contraindre le bouton à toujours déclencher la procédure souhaitée
mais il faut passer par un peu de VBA.Le plus simple, est de réaffecter la procédure au bouton
dans l'événement Open du classeur Perso.xls. Ceci garantit que le bouton pourra dès l'ouverture
d'Excel lancer la bonne procédure même s'il est cliqué en dehors du contexte souhaité (un
classeur particulier). Et c'est ce qui demande le moins de travail...
Dans l'événement Workbook_Open du Perso.xls, une ligne de code comme celle-ci suffit :
Application.CommandBars("LaBarre").Controls("NomBouton").OnAction =
"y"
"LaBarre" est le nom de la barre d'outils (intégrée ou personnalisée) où le
bouton a été monté "NomBouton" est le nom du bouton (Personnaliser, clic droit sur le
bouton et taper le nom souhaité dans la zone "Nom :")
Frédéric Sigonneau, (N°1069)
Pour alléger un classeur xls, je voudrais stocker ses macros dans xla qui lui serait
"associé". Comment faire ?
Pour utiliser le code stocké dans ton xla, établis une référence vers ce fichier
xla dans ton fichier xls. Pour ça, les deux fichiers étant ouverts (ça veut dire
la macro complémentaire étant installée pour pouvoir la voir dans la fenêtre des
projets), commence par renommer le VBAProject de ton fichier xla (clic droit sur
son VBAProject puis Propriétés. N'oublie pas d'enregistrer ta modif (pas
d'avertissement si tu fermes en ayant oublié d'enregistrer). Puis sélectionne
dans VBE le VBAProject de ton fichier xls et OutilsRéférences et coche le nom
de ta macro complémentaire.
Ensuite les procédures stockées dans le xla sont directement appelables depuis
le fichier xls.
xla dans ton fichier xls. Pour ça, les deux fichiers étant ouverts (ça veut dire
la macro complémentaire étant installée pour pouvoir la voir dans la fenêtre des
projets), commence par renommer le VBAProject de ton fichier xla (clic droit sur
son VBAProject puis Propriétés. N'oublie pas d'enregistrer ta modif (pas
d'avertissement si tu fermes en ayant oublié d'enregistrer). Puis sélectionne
dans VBE le VBAProject de ton fichier xls et OutilsRéférences et coche le nom
de ta macro complémentaire.
Ensuite les procédures stockées dans le xla sont directement appelables depuis
le fichier xls.
Frédéric Sigonneau, (N°1068)

J'ai chargé une macro complémentaire par un double-clic puis fermé Excel et détruit la macro
xla de mon disque dur car elle plante systématiquement. A chaque ouverture d'Excel, le menu qui
avait été ajouté par la macro est toujours visible. Le lancement de ce menu plante bien sûr
puisque la macro xla est introuvable. Comment me débarasser de ce menu ?
Tout en maintenant la touche alt enfoncée, saisis ton menu et "jette le" en le
trainant dans la feuille excel.
trainant dans la feuille excel.
Popi, (N°1067)
A quoi cela sert-il de créer une référence ? quel intérêt par rapport à l'installation simple
d'une xla ? est-ce que cela simplifie l'appel des macros ? comment ?
Les procédures et fonctions publiques des compléments XLA ou autres
peuvent être appelées directement comme si elles faisaient partie du
projet en cours :
Truc = UneFonctionXLA(Toto) au lieu de
Truc = Run("Mon ClasseurXLA.xls!UneFonctionXLA", Toto)
=> plus pratique à utiliser, bien sûr, et également plus rapide à
l'exécution.
D'autre part tous les arguments sont documentés (noms, types,
obligatoires / optionnels), les procédures et fonctions apparaissent
dans l'explorateur d'objet et sont éventuellement associées à un fichier
d'aide utilisable en contexte par F1 dans l'éditeur VBA. Toutes choses
impossibles quand le fichier n'est pas ajouté en tant que référence.
Enfin, quand tu ajoutes une référence à une macro B.xla dans le projet
VBA d'un classeur A.xls, l'ouverture de A.xls entraîne automatiquement
celle de B.xla. Celui-ci n'est pas ouvert en permanence, mais seulement
quand il le faut.
Les références, par rapport aux macros complémentaires installées
directement sous Excel, concernent davantage des XLA destinées à
apporter de nouvelles fonctionnalités pour le programmeur VBA, pas pour
l'utilisateur final (ou alors pour les deux à la fois si la XLA est
prévue en même temps pour une installation classique et par ajout de
référence).
peuvent être appelées directement comme si elles faisaient partie du
projet en cours :
Truc = UneFonctionXLA(Toto) au lieu de
Truc = Run("Mon ClasseurXLA.xls!UneFonctionXLA", Toto)
=> plus pratique à utiliser, bien sûr, et également plus rapide à
l'exécution.
D'autre part tous les arguments sont documentés (noms, types,
obligatoires / optionnels), les procédures et fonctions apparaissent
dans l'explorateur d'objet et sont éventuellement associées à un fichier
d'aide utilisable en contexte par F1 dans l'éditeur VBA. Toutes choses
impossibles quand le fichier n'est pas ajouté en tant que référence.
Enfin, quand tu ajoutes une référence à une macro B.xla dans le projet
VBA d'un classeur A.xls, l'ouverture de A.xls entraîne automatiquement
celle de B.xla. Celui-ci n'est pas ouvert en permanence, mais seulement
quand il le faut.
Les références, par rapport aux macros complémentaires installées
directement sous Excel, concernent davantage des XLA destinées à
apporter de nouvelles fonctionnalités pour le programmeur VBA, pas pour
l'utilisateur final (ou alors pour les deux à la fois si la XLA est
prévue en même temps pour une installation classique et par ajout de
référence).
Laurent Longre, (N°1066)
J'ai créé un classeur et je voudrais qu'à l'ouverture il vérifie si les macros complémentaires
"utilitaire d'analyse" et "utilitaire d'analyse - VBA" sont cochés. Et dans
le cas négatif, qu'il les installe.
Dans le workbook_open() de ton classeur ajoute ce code :
Application.AddIns("Utilitaire d'analyse").Installed = True
Pour que cela fonctionne, il faut
- utiliser excel 97 ou plus récent.
- que le dossier MacrolibAnalyse contienne bien les fichiers nécessaires
(Funcres.xla, Atpvbafr.xla notamment).
Application.AddIns("Utilitaire d'analyse").Installed = True
Pour que cela fonctionne, il faut
- utiliser excel 97 ou plus récent.
- que le dossier MacrolibAnalyse contienne bien les fichiers nécessaires
(Funcres.xla, Atpvbafr.xla notamment).
Frédéric Sigonneau, (N°1065)
J'ai crée un classeur excel avec des boutons lancant des macros de calcul et de création de
graphiques assez importantes en taille. Mon fichier xls devenant relativement important,j'ai
enregistré le classeur en xla pour mettre mes proc en macros complémentaires. Je me retrouve
donc avec 2 fichiers, le xls et le xla. J'ai ajouté au xls une référence au xla. Puis-je sans
danger effacer les macros du .xls ? Et comment dois-je faire pour que mes boutons présents sur
les feuilles xls soient affecté au macros xla, cela n'a pas l'air de se faire automatiquement.
Une fois que ton classeur .xls a été enregistré en macro complémentaire (.xla)
tu te retrouves en effet avec deux fichiers. Le classeur (.xls) ne sert plus
à rien. Tu peux le détruire. Tu pourras toujours visualiser et modifier
les procédures et fonctions de ta macro complémentaire dans l'éditeur VBE. La
chose à faire maintenant (après avoir détruit ou mis de côté au cas où ton
classeur.xls) est d'installer ta macro complémentaire : dans Excel tu fais
Outils\Macros complémentaires..., tu cherches la tienne dans la liste, tu
coches la case en face de son nom puis OK (si elle n'est pas dans la liste tu
la cherches avec Parcourir puis même chose).
A partir du moment où elle estinstallée, ta macro complémentaire sera lancée à
chaque ouverture d'Excel et tu pourras appeler ses procédures et fonctions
depuis les modules de code d'autres classeurs, ou utiliser tes fonctions dans
des cellules d'une feuille de calcul (à condition qu'elles se contentent de
renvoyer un résultat).
Oui, pour les boutons, il n'y a pas de miracle. Sa macro complémentaire devrait,
à mon avis, comporter un module réservé à la création d'une BO personnalisée
avec le nombre de boutons dont il a besoin et reliés à ses procédures.
Il pourrait s'inspirer de ce bout de code, qui crée une barre d'outils avec deux
boutons :
'==================dans un module standard
Sub CreeBO() 'à appeler dans le Workbook_Open du .xla
Dim MaBar, Btn1, Btn2
On Error Resume Next
Set MaBar = Application.CommandBars.Add("MaBarre")
With MaBar
Set Btn1 = .Controls.Add(msoControlButton)
With Btn1
.FaceId = 39
.OnAction = "Macro1"
End With
Set Btn2 = .Controls.Add(msoControlButton)
With Btn2
.FaceId = 40
.OnAction = "Macro2"
End With
.Visible = True
End With
End Sub
Sub Macro1()
MsgBox "Bouton 1"
End Sub
Sub Macro2()
MsgBox "Bouton 2"
End Sub
Sub DelBO() 'à appeler dans le Workbook_AddinUninstall du .xla
On Error Resume Next
Application.CommandBars("MaBarre").Delete
End Sub
tu te retrouves en effet avec deux fichiers. Le classeur (.xls) ne sert plus
à rien. Tu peux le détruire. Tu pourras toujours visualiser et modifier
les procédures et fonctions de ta macro complémentaire dans l'éditeur VBE. La
chose à faire maintenant (après avoir détruit ou mis de côté au cas où ton
classeur.xls) est d'installer ta macro complémentaire : dans Excel tu fais
Outils\Macros complémentaires..., tu cherches la tienne dans la liste, tu
coches la case en face de son nom puis OK (si elle n'est pas dans la liste tu
la cherches avec Parcourir puis même chose).
A partir du moment où elle estinstallée, ta macro complémentaire sera lancée à
chaque ouverture d'Excel et tu pourras appeler ses procédures et fonctions
depuis les modules de code d'autres classeurs, ou utiliser tes fonctions dans
des cellules d'une feuille de calcul (à condition qu'elles se contentent de
renvoyer un résultat).
Oui, pour les boutons, il n'y a pas de miracle. Sa macro complémentaire devrait,
à mon avis, comporter un module réservé à la création d'une BO personnalisée
avec le nombre de boutons dont il a besoin et reliés à ses procédures.
Il pourrait s'inspirer de ce bout de code, qui crée une barre d'outils avec deux
boutons :
'==================dans un module standard
Sub CreeBO() 'à appeler dans le Workbook_Open du .xla
Dim MaBar, Btn1, Btn2
On Error Resume Next
Set MaBar = Application.CommandBars.Add("MaBarre")
With MaBar
Set Btn1 = .Controls.Add(msoControlButton)
With Btn1
.FaceId = 39
.OnAction = "Macro1"
End With
Set Btn2 = .Controls.Add(msoControlButton)
With Btn2
.FaceId = 40
.OnAction = "Macro2"
End With
.Visible = True
End With
End Sub
Sub Macro1()
MsgBox "Bouton 1"
End Sub
Sub Macro2()
MsgBox "Bouton 2"
End Sub
Sub DelBO() 'à appeler dans le Workbook_AddinUninstall du .xla
On Error Resume Next
Application.CommandBars("MaBarre").Delete
End Sub
Frédéric Sigonneau, (N°1064)
J'ai écrit des macros qui fontappel à la macro complémentaire "utilitaire d'analyse".
Je dois diffuser ces macros sur d'autres PC. Comment vérifier que ceux-ci ont bien activé cette
macro complémentaire et si ce n'est pas le cas le faire ?
Il suffit que la macro suivante soit déclenchée
à l'ouverture du fichier, avec l'événement Workbook_Open.
Private Sub Workbook_Open()
AddIns("Utilitaire d'analyse").Installed = True
End Sub
à l'ouverture du fichier, avec l'événement Workbook_Open.
Private Sub Workbook_Open()
AddIns("Utilitaire d'analyse").Installed = True
End Sub
Laurent Mortézai, (N°1063)
Comment peut-on utiliser une fonction contenue dans la macro complémentaire utilitaire d'analyse
Pour avoir acces à la fonction QUOTIENT, il faut faire
Outils/Macro complémentaires..., et cocher Utilitaire d'analyse.
Dans la feuille excel on l'utilise en écrivant = quotient(numérateur;dénominateur)
Elle est utilisable depuis VBA comme ceci :
Application.Evaluate("QUOTIENT(numérateur,dénominateur)")
Attention en VBA
les arguments sont séparés par une virgule alors que c'est un point virgule dans
la feuille excel
Dès que cette référence est active, tu peux alors trouver la fonction
quotient dans l'explorateur d'objets sous la bibliothèque ainsi activée.
Elle est alors accessible comme une fonction de VBA classique, sans passer
par Worksheetfunction
Par contre, tu dois déclarer cette référence sur chaque classeur de tes
modules.
Outils/Macro complémentaires..., et cocher Utilitaire d'analyse.
Dans la feuille excel on l'utilise en écrivant = quotient(numérateur;dénominateur)
Elle est utilisable depuis VBA comme ceci :
Application.Evaluate("QUOTIENT(numérateur,dénominateur)")
Attention en VBA
les arguments sont séparés par une virgule alors que c'est un point virgule dans
la feuille excel
Dès que cette référence est active, tu peux alors trouver la fonction
quotient dans l'explorateur d'objets sous la bibliothèque ainsi activée.
Elle est alors accessible comme une fonction de VBA classique, sans passer
par Worksheetfunction
Par contre, tu dois déclarer cette référence sur chaque classeur de tes
modules.
Pierre-Jean Vouette, Philippe Pons, Benoit Brachet, , (N°1062)

Comment recopier mes macros sur un classeur situé sur un autre PC
Tu le copies simplement sur l'autre PC !
Mais il va écraser celui déjà présent sur l'autre poste... d'où
l'intérêt des macros complémentaires si tu veux éviter ça. Fais Fenêtre
-> Afficher, sélectionne Perso.xls, clique sur OK. Ensuite, Fichier ->
Enregistrer sous, donne un nom autre que Perso.xls (par exemple,
MesMacros.xls), sélectionne le type de fichier "Macro complémentaire
Microsoft Excel (*.xla)" et enregistre. Sur l'autre poste, copie le
fichier MesMacros.xla que tu viens de créer dans le répertoire Macrolib,
lance Excel, fais Outils -> Macros complémentaires, coche "MesMacros" et
valide.
Mais il va écraser celui déjà présent sur l'autre poste... d'où
l'intérêt des macros complémentaires si tu veux éviter ça. Fais Fenêtre
-> Afficher, sélectionne Perso.xls, clique sur OK. Ensuite, Fichier ->
Enregistrer sous, donne un nom autre que Perso.xls (par exemple,
MesMacros.xls), sélectionne le type de fichier "Macro complémentaire
Microsoft Excel (*.xla)" et enregistre. Sur l'autre poste, copie le
fichier MesMacros.xla que tu viens de créer dans le répertoire Macrolib,
lance Excel, fais Outils -> Macros complémentaires, coche "MesMacros" et
valide.
Laurent Longre, (N°1061)
Comment désinstaller une macrocomplémentaire en vba ? Je sais utiliser installed=false, puis
fermer le fichier xla et le supprimer complètement du disque (kill), mais il en reste toujours
quelques traces (ça fait sale !), notamment les cases (non cochées) dans la boite "outils/
macro complémentaires"
Comment éliminer tous les résidus et ne plus laisser de traces ?
Ce n'est pas très "propre" mais c'est la seule solution que j'aie
trouvée :
Private Sub SupprimerMacroComplémentaire(Nom As String)
Dim I As Integer
With AddIns
.Item(Nom).Installed = False
Kill .Item(Nom).FullName
SendKeys "{HOME}"
For I = 1 To .Count
If .Item(I).Name = Nom Then Exit Sub
SendKeys "{DOWN}"
Next I
End With
SendKeys "~{ESC}"
Application.CommandBars.FindControl(ID:=943).Execute
DoEvents
End Sub
Sub Test()
SupprimerMacroComplémentaire "Macro de test"
End Sub
Sinon, à l'extérieur d'Excel tu peux aussi détruire l'entrée "OPEN"
correspondant à ta macro dans la base de registres. Le problème c'est
que ça ne marche que si Excel est fermé (il ne tient pas compte des
modifs faites manuellement dans la BDR au moment de sa fermeture).
trouvée :
Private Sub SupprimerMacroComplémentaire(Nom As String)
Dim I As Integer
With AddIns
.Item(Nom).Installed = False
Kill .Item(Nom).FullName
SendKeys "{HOME}"
For I = 1 To .Count
If .Item(I).Name = Nom Then Exit Sub
SendKeys "{DOWN}"
Next I
End With
SendKeys "~{ESC}"
Application.CommandBars.FindControl(ID:=943).Execute
DoEvents
End Sub
Sub Test()
SupprimerMacroComplémentaire "Macro de test"
End Sub
Sinon, à l'extérieur d'Excel tu peux aussi détruire l'entrée "OPEN"
correspondant à ta macro dans la base de registres. Le problème c'est
que ça ne marche que si Excel est fermé (il ne tient pas compte des
modifs faites manuellement dans la BDR au moment de sa fermeture).
Laurent Longre, (N°1060)
Comment mettre à jour une fonction que j'ai créée dans un fichier .xla avec une macro dans un
autre fichier?
Tu n'es pas obligé de passer par un fichier qui "corrigerait" le code de ta
macro complémentaire.
Première chose à faire, modifier ta fonction (pour reprendre ton exemple) en ouvrant le projet
de ta macro complémentaire dansl'explorateur de projets du VBE. Une fois tes corrections
effectuées, n'oublie pas de les enregistrer : VBE ne délivre aucun avertissement si tu quittes
sans avoir enregistré tes modifications.
Tu peux ensuite (si tu dois distribuer la nouvelle version sur d'autres postes) mettre à jour
ton ancienne version en la remplaçant dans le dossier Macrolib d'Excel (ou autre dossier où ta
macro est stockée) par la nouvelle. Soit par une simple copie "à la mimine" defichier
dans l'explorateur (en écrasant l'ancienne version) soit par un petit script qui automatise
l'opération.
Il faut seulement faire attention, lors de cette recopie, qu'Excel soit bien fermé. Evite aussi
de changer le nom de ta macro complémentaire, sous peine d'avoir à faire des manips plus
compliquées pour la mise à jour sur d'autres postes : désinstaller la version"1",
l'effacer du disque dur, recopier la version "2", la réinstaller dansExcel.... Note
plutôt ton numéro de version dans un module, en commentaire.
macro complémentaire.
Première chose à faire, modifier ta fonction (pour reprendre ton exemple) en ouvrant le projet
de ta macro complémentaire dansl'explorateur de projets du VBE. Une fois tes corrections
effectuées, n'oublie pas de les enregistrer : VBE ne délivre aucun avertissement si tu quittes
sans avoir enregistré tes modifications.
Tu peux ensuite (si tu dois distribuer la nouvelle version sur d'autres postes) mettre à jour
ton ancienne version en la remplaçant dans le dossier Macrolib d'Excel (ou autre dossier où ta
macro est stockée) par la nouvelle. Soit par une simple copie "à la mimine" defichier
dans l'explorateur (en écrasant l'ancienne version) soit par un petit script qui automatise
l'opération.
Il faut seulement faire attention, lors de cette recopie, qu'Excel soit bien fermé. Evite aussi
de changer le nom de ta macro complémentaire, sous peine d'avoir à faire des manips plus
compliquées pour la mise à jour sur d'autres postes : désinstaller la version"1",
l'effacer du disque dur, recopier la version "2", la réinstaller dansExcel.... Note
plutôt ton numéro de version dans un module, en commentaire.
Frédéric Sigonneau, (N°1059)
Comment fait-on pour passer une macro en macro complémentaire et la rendre accessible à partir
d'un bouton dans tous les classeurs ?
Copie le code dans un module d'un classeur vierge en ayantau préalable pris soin de noter le
nom de la proc. ici formFrac, puis enregistre ce fichier au format *.xla, sous le nom zaza par
exemple.
Par la barre des menus, Outils/Macro complémentaire, coche la macro
complémentaire zaza. Toujours par la barre des menus, Affichage/Barres
d'outils/Personnaliser/onglet Commandes, sélectionne Macro. Fait glisser le "bouton
personnalisé" depuis cette fenêtre jusque dans la barre d'outils Mise en forme, à côté de
l'icône % par exemple. Clique ensuite avec le bouton droit de la souris sur ce nouveau bouton
qui apparaît à présent dans
la barre d'outils Mise en forme, et valide: Affecter une macro. Dans la zone
Nom de la macro, saisie formFrac et valide par OK.
Si tu désires, pour le personnaliser, modifier l'image du bouton, clic-droit
à nouveau sur le bouton, puis Modifier l'image du bouton, ou Editeur de
boutons...
Tu peux maintenant fermer la fenêtre "Personnaliser", la procédure est
maintenant a
nom de la proc. ici formFrac, puis enregistre ce fichier au format *.xla, sous le nom zaza par
exemple.
Par la barre des menus, Outils/Macro complémentaire, coche la macro
complémentaire zaza. Toujours par la barre des menus, Affichage/Barres
d'outils/Personnaliser/onglet Commandes, sélectionne Macro. Fait glisser le "bouton
personnalisé" depuis cette fenêtre jusque dans la barre d'outils Mise en forme, à côté de
l'icône % par exemple. Clique ensuite avec le bouton droit de la souris sur ce nouveau bouton
qui apparaît à présent dans
la barre d'outils Mise en forme, et valide: Affecter une macro. Dans la zone
Nom de la macro, saisie formFrac et valide par OK.
Si tu désires, pour le personnaliser, modifier l'image du bouton, clic-droit
à nouveau sur le bouton, puis Modifier l'image du bouton, ou Editeur de
boutons...
Tu peux maintenant fermer la fenêtre "Personnaliser", la procédure est
maintenant a
ChrisV, (N°1058)
Puis-je déclarer une fois pour toute une valeur par ex: tva=5.5 pour y faire appel depuis
n'importe quel classeur ?
Pour obtenir le résultat que tu souhaites, je ne vois guère qu'une petite
macro complémentaire dans laquelle tu écrirais des fonctions renvoyant les
valeurs constantes souhaitées. En effet, je ne connais aucune forme de déclaration de variable
ou de constante dans un classeur qui puisse en "transmettre" la valeur à une autre
classeur. Et par ailleurs la portée des noms ne dépasse pas non plus le classeur (excepté les
noms cachés mais leur utilisation me parait moins simple à mettre en oeuvre pour ton besoin).
En attendant, tu peux essayer la solution macro complémentaire, facile à mettre en oeuvre.
Ajoute un module standard à un nouveau classeur, et recopie, par exemple, les fonctions
ci-dessous selon tes besoins :
'=============
Function TVA1()
TVA1 = 5.5
End Function
Function
TVA2()
TVA2 = 19.6
End Function
Function Tx_Euro()
Tx_Euro =
6.55957
End Function
Function ETP()
ETP = 35 / 24
End
Function
'=============
Enregistre ensuite le classeur en macro complémentaire (extension ".xla" dans la
boite de dialogue Enregistrer sous) puis installe-la (Outils\Macros complémentaires). A partir
de maintenant, et tant que ta macro complémentaire restera installée, tu peux écrire dans une
feuille de calcul de n'importe quel classeur:
=1000*((100+tva1())/100)
ou
=ETP()*0,5
(Attention de ne pas oublier les parenthèses, comme lorsqu'on utilise une fonction sans
argument comme MAINTENANT()).
PS. Si tu veux en savoir plus sur les noms cachés et étudier la possibilité de les utiliser
pour résoudre ton problème, une seule adresse, celle de LL qui a écrit une page sur cette
possibilité non documentée :
http://longre.free.fr/ dans les pages sur
l'API-C.
macro complémentaire dans laquelle tu écrirais des fonctions renvoyant les
valeurs constantes souhaitées. En effet, je ne connais aucune forme de déclaration de variable
ou de constante dans un classeur qui puisse en "transmettre" la valeur à une autre
classeur. Et par ailleurs la portée des noms ne dépasse pas non plus le classeur (excepté les
noms cachés mais leur utilisation me parait moins simple à mettre en oeuvre pour ton besoin).
En attendant, tu peux essayer la solution macro complémentaire, facile à mettre en oeuvre.
Ajoute un module standard à un nouveau classeur, et recopie, par exemple, les fonctions
ci-dessous selon tes besoins :
'=============
Function TVA1()
TVA1 = 5.5
End Function
Function
TVA2()
TVA2 = 19.6
End Function
Function Tx_Euro()
Tx_Euro =
6.55957
End Function
Function ETP()
ETP = 35 / 24
End
Function
'=============
Enregistre ensuite le classeur en macro complémentaire (extension ".xla" dans la
boite de dialogue Enregistrer sous) puis installe-la (Outils\Macros complémentaires). A partir
de maintenant, et tant que ta macro complémentaire restera installée, tu peux écrire dans une
feuille de calcul de n'importe quel classeur:
=1000*((100+tva1())/100)
ou
=ETP()*0,5
(Attention de ne pas oublier les parenthèses, comme lorsqu'on utilise une fonction sans
argument comme MAINTENANT()).
PS. Si tu veux en savoir plus sur les noms cachés et étudier la possibilité de les utiliser
pour résoudre ton problème, une seule adresse, celle de LL qui a écrit une page sur cette
possibilité non documentée :
http://longre.free.fr/ dans les pages sur
l'API-C.
Frédéric Sigonneau, (N°1057)