Macro qui s'exécute sur Personal.xlsb

Macro qui s'exécute sur Personal.xlsb - VB/VBA/VBS - Programmation

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...  :fou:  
 
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
Reply

Marsh Posté le 28-03-2022 à 16:42:49   

Reply

Marsh Posté le 28-03-2022 à 23:12:23    

Salut,
 
As-tu bien précisé les noms des classeurs dans la macro ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 29-03-2022 à 08:54:07    

MaybeEijOrNot a écrit :

Salut,
 
As-tu bien précisé les noms des classeurs dans la macro ?


 
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  :pt1cable: )


Message édité par scaryfan le 29-03-2022 à 08:55:12

---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

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.
 
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.


 
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 ?
 
 :hello:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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...
 
:??:


Message édité par scaryfan le 29-03-2022 à 10:45:12

---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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 :
  1. For Each Wbk In Workbooks
  2.     cName = Wbk.Name
  3.     cName = Left(cName, Len(cName) - 1)
  4.     If cName = "Classeur" Then
  5.         Exit For
  6.     End If
  7. Next
  8. With Wbk
  9.     MsgBox (Wbk.Name)
  10. End With


 
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.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

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.
En fonction du motif à détecter, tu as des fonctions plus ou moins appropriées : https://silkyroad.developpez.com/VB [...] aracteres/
 
Ex :

Code :
  1. For Each Wbk In Workbooks
  2.     cName = Wbk.Name
  3.     cName = Left(cName, Len(cName) - 1)
  4.     If cName = "Classeur" Then
  5.         Exit For
  6.     End If
  7. Next
  8. With Wbk
  9.     MsgBox (Wbk.Name)
  10. End With


 
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.


 
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
 
???
 


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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 :
  1. For Each Wbk In Workbooks
  2.         cName = Wbk.Name
  3.         cName = Left(cName, Len(cName) - 1)
  4.         If cName = "Classeur" Then
  5.             Exit For
  6.         End If
  7.     Next
  8.     With Wbk
  9.         MsgBox (.Name)
  10.     End With

Message cité 1 fois
Message édité par MaybeEijOrNot le 29-03-2022 à 11:47:01

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

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).
 
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 :
  1. For Each Wbk In Workbooks
  2.         cName = Wbk.Name
  3.         cName = Left(cName, Len(cName) - 1)
  4.         If cName = "Classeur" Then
  5.             Exit For
  6.         End If
  7.     Next
  8.     With Wbk
  9.         MsgBox (.Name)
  10.     End With



 
OK !
Donc dans mon cas, le code que je vais mettre en début de macro est le suivant :
 

Code :
  1. For Each Wbk In Workbooks
  2.         cName = Wbk.Name
  3.         cName = Left(cName, Len(cName) - 1)
  4.         If cName = "Trucmachin" Then
  5.             Exit For
  6.         End If
  7. Next
  8. With Wbk
  9.         Workbooks(.Name).Activate
  10. End With


 
Désolé, j'ai remis un "Activate"...  :D  


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 29-03-2022 à 12:10:45   

Reply

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.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 29-03-2022 à 12:37:07    

OK je teste tout à l'heure !  :wahoo:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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...  :fou:  
 
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...  :fou:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

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 ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 29-03-2022 à 15:00:36    

MaybeEijOrNot a écrit :

Mais comment tu sais que la macro reste sur le PERSONAL.xlsb ?
 
Et c'est quoi ta modif' au final ?


 
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...  :o


Message édité par scaryfan le 29-03-2022 à 15:02:08

---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 29-03-2022 à 15:23:24    

Et si tu fais juste un :

Code :
  1. MsgBox(ActiveWorkbook.Name)
  2. MsgBox(Workbooks("PERSONAL.xlsb" ).name)


 
Qu'obtiens-tu ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 29-03-2022 à 15:24:48    

MaybeEijOrNot a écrit :

Et si tu fais juste un :

Code :
  1. MsgBox(ActiveWorkbook.Name)
  2. MsgBox(Workbooks("PERSONAL.xlsb" ).name)


 
Qu'obtiens-tu ?


 
Je vais essayer...  :)  


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 29-03-2022 à 23:02:29    

Question bête : le collègue a la même version d'Excel que toi ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-03-2022 à 13:04:03    

:hello:  
 
Effectivement, on va vérifier ça...  :)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed