Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1169 connectés 

 



Dernière réponse
Sujet : Macro qui s'exécute sur Personal.xlsb
scaryfan :hello:  
 
Effectivement, on va vérifier ça...  :)

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
scaryfan :hello:  
 
Effectivement, on va vérifier ça...  :)
rufo Question bête : le collègue a la même version d'Excel que toi ?
scaryfan

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

MaybeEijOrNot Et si tu fais juste un :

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


 
Qu'obtiens-tu ?

scaryfan

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

MaybeEijOrNot Mais comment tu sais que la macro reste sur le PERSONAL.xlsb ?
 
Et c'est quoi ta modif' au final ?
scaryfan 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:
scaryfan OK je teste tout à l'heure !  :wahoo:
MaybeEijOrNot 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.
scaryfan

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  

MaybeEijOrNot 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

scaryfan

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

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

scaryfan :??:  
 
Et puis, je le réécris : la macro fonctionne correctement sur mon PC mais pas chez mon collègue...
 
:??:
scaryfan

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:

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

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

MaybeEijOrNot Salut,
 
As-tu bien précisé les noms des classeurs dans la macro ?
scaryfan 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

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR