XL 2010 Appel macro d'un autre classeur

pleasewait

XLDnaute Nouveau
Bonjour à tous,

Désolé si ma question a déjà été posée dans le forum.
Je vais tenter d'être aussi clair que possible ...

Je me suis fait une petite subroutine en VBA que j'aimerais pouvoir appeler par un instruction Call classique dans n'importe quel nouveau classeur à créer ou déjà créé.
(car cette petite subroutine est bien pratique !!!)
J'ai pensé mettre cette subroutine dans un fichier .xlma que je déclare en complément dans Excel.
L'idée est que cette subroutine ne figure que dans un seul classeur (.xlma par exemple) et non dans chaque classeur Excel.

Pour des raisons évidentes de maintenance ...

Sur n'importe quel classeur nouveau en mode développeur, je vois bien dans mon projet global, mon code VBA du nouveau classeur
et bien sûr le projet .xlma déclaré en complément dans Excel. Tout va bien .
Sauf que ...
Mon problème, que je n'arrive pas à résoudre, est d'appeler par un call (classique!) une subroutine située dans le .xlma depuis mon nouveau classeur .xlm !

(Par exemple.)

La subroutine à appeler par un Call dans le complément n'est pas visible ... (même si je la vois en mode développeur)

Existe t'il une solution ?

Merci à la communauté de lire ce message et même d'y apporter une solution s'il en existe une. (peut-être application.run ?)

Bonne journée à tous.

(Si c'est pas bien clair tout ça, je ré-explique!!)
 
Solution
Nan PAS Backup tout court car ce Name est en conflit avec le nom de la sub du .xlam.
Donc ce sera BackupXLAM pour le Name du projet Add-in.
En résumé mon 'truc' fonctionne maintenant et j'ai atteint mon but.

L'idée était d'avoir une macro utilitaire standard qui puisse être appelée dans n'importe quel classeur nouveau ou pas.

Pour cela, j'ai dû respecter les étapes suivantes.

1. Créer la macro "utilitaire" dans un fichier .xlam
2. Déclarer dans les Options Excel compléments cette add-in (voir capture écran)
3. Enregistrer la classeur appelant en .xlsm (qui gère les macros)
4. Référencer la macro "utilitaire" sous l'editeur VBA par un glisser-déposer du projet .xlam dans le projet .xlsm (voir capture écran)...

pleasewait

XLDnaute Nouveau
Bonjour.
Soit vous l'invoquez par un Application.Run, soit vous cochez la référence au nom (son VBAProject renommé différemment) du projet VBA de votre classeur de macros dans les projets où vous voulez qu'elle soit connue.
Merci pour la réponse.

Je n'ai pas bien compris le "vous cochez la référence au nom (son VBAProject renommé différemment) du projet VBA de votre classeur de macros dans les projets où vous voulez qu'elle soit connue." ??

Le Application.run ne me semble malheureusement pas applicable.
 

Dranreb

XLDnaute Barbatruc
Pourquoi ?
Notez que j'ai de toute façon une préférence pour l'autre solution.
Commencez donc par renommer le projet VBA de votre .xlam. Comme toutes les composantes VBA ça se passe du coté d'une ligne (Name), souvent la 1ère, même la seule parfois, dans la fenêtre de propriétés, après double clic dans l'explorateur de projets, sur le nom d'origine du truc, ici VBAProject.
Après quoi ce nouveau nom apparaîtra dans les références disponibles (faire Alt+OR) après sélection d'un autre projet. Il ne restera qu'à le cocher.
 
Dernière édition:

pleasewait

XLDnaute Nouveau
Pourquoi ?
Notez que j'ai de toute façon une préférence pour l'autre solution.
Commencez donc par renommer le projet VBA de votre .xlam. Comme toutes les composantes VBA ça se passe du coté d'une ligne (Name), souvent la 1ère, même la seule parfois, dans la fenêtre de propriétés, après double clic dans l'explorateur de projets, sur le nom d'origine du truc, ici VBAProject.
Après quoi ce nouveau nom apparaîtra dans les références disponibles (faire Alt+OR) après sélection d'un autre projet. Il ne restera qu'à le cocher.
Rien à faire, ça résiste.
J'ai bien tenter de renommer le projet .xlsm et .xlma dans l'explorateur de projet VBA. Tous les deux ont été nommés "Classeur1" dans le champs Name.
Pour autant, la subroutine du .xlma n'est pas 'visible' dans le .xlsm et donc pas de Call possible dans le .xlsm pour appeler la subroutine dans .xlma.
Je sèche ...

J'ajoute que cette subroutine tourne très bien si elle est integrée dans le projet .xlsm (J'ai mis le code dans la partie code du classeur car c'est un évènementiel (pour infos)).

Je peux faire copie d'écran, envoi du code de la subroutine etc etc ... pour avancer mais je ne vois pas comment résoudre le truc ... qui résiste.

Merci à Dranreb pour son aide.
 

pleasewait

XLDnaute Nouveau
C'est très bizarre car même si la subroutine (ou macro) n'est pas visible dans le classeur, je peux tout de même l'éxécuter via le bouton 'Macro' en saisissant son nom.
En pas à pas ou exécution directe ...
Je n'y comprends rien.
Peut-être un autorisation à donner à Excel ... (confidentialité ou autres ...):oops:
:rolleyes:
 

Dranreb

XLDnaute Barbatruc
Il ne s'agit pas du champ "Name" mais du champ "(Name)", avec les parenthèses ! Il est tout au début en général. Le Name sans parenthèse n'est pas l'identification d'un composant VBA mais le nom d'une entité de l'application hôte qu'il sert à représenter. D'ailleurs les composants purement VBA ne devraient pas en porter. Ce n'est pas le "(Name)" de ThisWorkbook qu'il faut changer, mais de celui de VBAProject ! D'ailleurs il n'a que cette unique ligne (Name). Parce que par défaut ils s'appellent tous comme ça au départ, alors ils ne peuvent pas être proposés dans la liste des références disponibles d'un projet utilisateur qui s'appelle aussi VBAProject, et qui pourra, d'ailleurs, lui, continuer de s'appeler ainsi, c'est seulement le projet du classeur de macros qui devra porter un nom différent, pour qu'on puisse cocher ce nom dans les références de l'autre !
 
Dernière édition:

pleasewait

XLDnaute Nouveau
Merci pour l'aide Dranreb.

Dans l'éditeur VBA du projet, j'ai fait les modifs que vous proposez mais rien à faire la subroutine du projet .xlma n'est pas 'visible' dans l'environnement .xlsm.

Je joins une capture d'écran de l'éditeur VBA pour permettre de comprendre (un peu !) à ceux qui s'intéressent à cette discussion.

Je ne vois pas comment avancer dans la résolution de ce 'truc'.

En glissant dans l'éditeur VBA le projet Backup.xlam dans le projet Classeur1.xlsm, il a été créé une référence au .xlam mais je ne vois pas ce qui change dans le fait que la subroutine du .xlam reste absolument non 'visible' et non appelable depuis un code dans le .xlsm ...

Compliqué tout ça !! ;):)

Peut-être un truc tout bête que j'ai omis pour faire tourner le truc ... Bigre !!!

Capture.PNG
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Normalement une Public Sub du module Module1 du projet BackupXLMA peut être invoquée dans un code du projet du classeur utilisateur, qu'il soit dans un module standard, mais je vois qu'il n'y en a pas pour le moment, ou dans un module objet comme d'objet Worksheet ou le ThisWorkbook. Vous pouvez même spécifier BackupXLMA suivi d'un point et il vous proposera dans une liste tous ce qui y existe de Public, que vous pourrez sélectionner.
Par exemple chez moi je peux faire ça :
1631436208988.png

Les classes éventuelles ainsi que tout ce qui est Public dans le projet en référence est connu dans celui où cette référence est cochée. Le nom de projet joue exactement le même rôle que le nom de bibliothèque, tel que VBA, Excel ou MSForms, pour utiliser les fournitures des références classiques aux fichiers dll, exe ou tlb.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça m'avait intrigué aussi mais l'explorateur de projet montre bien chez lui un Backup.xlam, mais dont il a appelé BackupXLMA le projet VBA. C'est son droit. Qui sait, "MA" signififie peut être autre chose pour lui que Add-in with Macros ? … Si toutefois c'est bien ce que signifie "AM" …
 

pleasewait

XLDnaute Nouveau
Bonjour,

Désolé d'interférer, mais s'agit-il d'un .xlam ou d'un .xlma ?
J'ai déjà utilisé des .xlam mais je ne connais pas de .xlma.
Bonsoir,
Vous n'interférez pas du tout.
C'est moi qui ai fait une petite erreur (certes sans conséquence ...).
J'aurais dû nommer mon add-in "BackupXLAM" et non "Backup XLMA".
Voir même "Backup" tout court !!! ;)
Petite faute sans conséquence mais merci de l'avoir fait remarquer.
Cela dit ... je vais devoir refaire mon .xlam car son Name n'est pas correct. 👍🙃
Merci.
 

pleasewait

XLDnaute Nouveau
Ça m'avait intrigué aussi mais l'explorateur de projet montre bien chez lui un Backup.xlam, mais dont il a appelé BackupXLMA le projet VBA. C'est son droit. Qui sait, "MA" signififie peut être autre chose pour lui que Add-in with Macros ? … Si toutefois c'est bien ce que signifie "AM" …
C'était juste une faute de frappe de ma part dans le nommage de cet .xlam (et non XLMA !!!)
Le truc va donc être renommé "Backup". Tout simple. Tout bête.
Merci et bonne soirée.
 

pleasewait

XLDnaute Nouveau
Nan PAS Backup tout court car ce Name est en conflit avec le nom de la sub du .xlam.
Donc ce sera BackupXLAM pour le Name du projet Add-in.
En résumé mon 'truc' fonctionne maintenant et j'ai atteint mon but.

L'idée était d'avoir une macro utilitaire standard qui puisse être appelée dans n'importe quel classeur nouveau ou pas.

Pour cela, j'ai dû respecter les étapes suivantes.

1. Créer la macro "utilitaire" dans un fichier .xlam
2. Déclarer dans les Options Excel compléments cette add-in (voir capture écran)
3. Enregistrer la classeur appelant en .xlsm (qui gère les macros)
4. Référencer la macro "utilitaire" sous l'editeur VBA par un glisser-déposer du projet .xlam dans le projet .xlsm (voir capture écran)

Et du coup ... ça fonctionne !!!
Et donc ... je suis content !!!

Je remercie Dranreb et Dudu2 d'avoir pris le temps de m'aider sur ce coup-là.

J'espère que ce petit récapitulatif pourra en aider d'autres (C'est le principe du forum).

Le sujet est pour moi résolu.

Bien cordialement.
Bonne soirée.


Capture1.PNG
Capture2.PNG
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T