Macro qui s'exécute sur Personal.xlsb - VB/VBA/VBS - Programmation
Marsh Posté le 28-03-2022 à 23:12:23
Salut,
As-tu bien précisé les noms des classeurs dans la macro ?
Marsh Posté le 29-03-2022 à 08:54:07
MaybeEijOrNot a écrit : Salut, |
Bah non justement, le but étant que la macro s'exécute sur le fichier ouvert... quelque soit le nom...
Un jour, cela peut être "Trucmachin001.xlsx", un autre jour "Trucmachin003.xlsx"...
Sachant que chaque matin, ce fameux fichier a toujours la même structure... (heureusement d'ailleurs )
Marsh Posté le 29-03-2022 à 10:33:45
Oui mais comme tu le peux constater c'est forcément bancal de lancer une macro sans préciser où elle doit s'exécuter.
Avec l'objet Workbooks tu peux accéder aux différents classeurs ouverts, tu peux peut-être commencer par indiquer dans ta macro qu'elle doit s'exécuter dans le premier classeur dont le nom se termine par .xlsx ou du moins pas par .xlsb.
Après c'est à toi de voir quel motif est le plus approprié, parce qu'un classeur nommé "TrucmachinXXX.xlsx" ce n'est pas très compliqué à identifier.
Marsh Posté le 29-03-2022 à 10:43:02
MaybeEijOrNot a écrit : Oui mais comme tu le peux constater c'est forcément bancal de lancer une macro sans préciser où elle doit s'exécuter. |
Merci MaybeEijOrNot pour ta réponse.
Comment fais-je pour sélectionner le premier classeur dont l'extension se termine par ".xlsx" ?
Workbooks(*&".xlsx" ).Activate ?
Marsh Posté le 29-03-2022 à 10:44:59
Et puis, je le réécris : la macro fonctionne correctement sur mon PC mais pas chez mon collègue...
Marsh Posté le 29-03-2022 à 11:26:08
Non il faut parcourir les différentes occurrences de Workbooks en bouclant dessus puis vérifier le nom à chaque fois grâce aux fonctions de manipulation des chaînes de caractères.
En fonction du motif à détecter, tu as des fonctions plus ou moins appropriées : https://silkyroad.developpez.com/VB [...] aracteres/
Ex :
Code :
|
Après je suis parti du fait que tu as dit que la macro s’exécutait chez ton collègue dans le mauvais classeur, mais peut-être qu'un paramètre de sécurité l'empêche tout simplement de s’exécuter.
Marsh Posté le 29-03-2022 à 11:36:09
MaybeEijOrNot a écrit : Non il faut parcourir les différentes occurrences de Workbooks en bouclant dessus puis vérifier le nom à chaque fois grâce aux fonctions de manipulation des chaînes de caractères.
|
Merci MaybeEijOrNot.
Il n'y a pas une façon plus simple pour activer le fichier qui se termine par ".xlsx" ???
Et puis, j'ai aussi pensé à ça : Application.Workbooks(1).Activate ou Workbooks(1).Activate
Ou alors : ThisWorkbook.Application.Visible = False
???
Marsh Posté le 29-03-2022 à 11:46:36
Rien à voir, le .activate va passer le classeur en "actif" donc oui la macro va s’exécuter dessus mais ce n'est pas le problème. Le problème c'est de sélectionner lequel est à activer. Ici tu actives le premier sans savoir lequel sera le premier. T'assurer d’exécuter la macro dans le bon classeur c'est une dizaine de lignes assez simples au max. Pour vérifier une "extension" tu peux split le nom avec le point et garder la dernière occurrence. Pour vérifier si un nom revient à chaque fois tu peux utiliser InStr, quand tu sais que tu as des longueurs fixes tu peux utiliser les fonctions Left, Right et Mid complétée de Len (longueur totale de la chaîne).
De manière générale, le .activate est à éviter, tu n'en as pas besoin, suffit d'utiliser le With. D'ailleurs je corrige mon exemple (pas besoin de repréciser Wbk à l'intérieur du With, c'est tout son intérêt) :
Code :
|
Marsh Posté le 29-03-2022 à 12:10:45
MaybeEijOrNot a écrit : Rien à voir, le .activate va passer le classeur en "actif" donc oui la macro va s’exécuter dessus mais ce n'est pas le problème. Le problème c'est de sélectionner lequel est à activer. Ici tu actives le premier sans savoir lequel sera le premier. T'assurer d’exécuter la macro dans le bon classeur c'est une dizaine de lignes assez simples au max. Pour vérifier une "extension" tu peux split le nom avec le point et garder la dernière occurrence. Pour vérifier si un nom revient à chaque fois tu peux utiliser InStr, quand tu sais que tu as des longueurs fixes tu peux utiliser les fonctions Left, Right et Mid complétée de Len (longueur totale de la chaîne).
|
OK !
Donc dans mon cas, le code que je vais mettre en début de macro est le suivant :
Code :
|
Désolé, j'ai remis un "Activate"...
Marsh Posté le 29-03-2022 à 12:16:12
Dans ce cas là, adapte la ligne :
cName = Left(cName, Len(cName) - 1)
Le -1 élimine le dernier caractère, tu dois en éliminer plus.
Si tu tiens au .activate, tu peux enlever le With ... End With. Et tu peux faire le .activate directement sur Wbk (Wbk.activate) qui correspond à l'occurrence dans Workbooks quand la boucle a été interrompue.
Marsh Posté le 29-03-2022 à 12:37:07
OK je teste tout à l'heure !
Marsh Posté le 29-03-2022 à 14:07:52
MaybeEijOrNot,
Désolé de t'embêter encore, mais ça ne fonctionne pas.
La macro reste sur le PERSONAL.xlsb...
J'ai testé sur mon poste à nouveau et ça fonctionne... il y a donc bien quelque chose qui est différent chez mon collègue...
Marsh Posté le 29-03-2022 à 14:37:48
Mais comment tu sais que la macro reste sur le PERSONAL.xlsb ?
Et c'est quoi ta modif' au final ?
Marsh Posté le 29-03-2022 à 15:00:36
MaybeEijOrNot a écrit : Mais comment tu sais que la macro reste sur le PERSONAL.xlsb ? |
Au début de ma macro, j'enregistre le nom du classeur actif dans une mémoire WBN... et en mode débogage, chez mon collègue, quand je mets ma souris sur la mémoire - après que la macro soit passé sur la ligne - VBA m'affiche "PERSONAL.xlsb"... tout simplement...
Et sur mon poste, c'est bien "TRUCMACHIN.xlsx" qui s'affiche...
C'est à péter un câble...
Marsh Posté le 29-03-2022 à 15:23:24
Et si tu fais juste un :
Code :
|
Qu'obtiens-tu ?
Marsh Posté le 29-03-2022 à 15:24:48
MaybeEijOrNot a écrit : Et si tu fais juste un :
|
Je vais essayer...
Marsh Posté le 29-03-2022 à 23:02:29
Question bête : le collègue a la même version d'Excel que toi ?
Marsh Posté le 31-03-2022 à 13:04:03
Effectivement, on va vérifier ça...
Marsh Posté le 28-03-2022 à 16:42:49
Salut,
J'ai un souci avec une macro que j'ai installée chez un collègue.
Tous les matins, j'ouvre un fichier XLSX que je reçois par mail : "Trucmachin.xlsx"
Ensuite, j'exécute une macro qui est enregistrée dans un module du fichier PERSONAL.XLSB.
La macro met en forme le fichier Trucmachin.xlsx et le découpe ensuite en plusieurs fichiers A.xlsx, B.xslx, C.xlsx... etc.
Chez mon collègue, la macro s'exécute mais sur le fichier PERSONAL.xlsb... au lieu du fichier Trucmachin.xlsx...
Quel est le problème ?
Je précise bien que chez moi, la macro s'exécute bien sur le fichier "Trucmachin.xlsx"...
Merci pour vos retours.
scaryfan
Message édité par scaryfan le 28-03-2022 à 16:52:36
---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To