Modification d'un thisworkbook par un autre "workbook"

Résolu
Abc - 2 oct. 2015 à 13:34
 Abc - 6 oct. 2015 à 09:53
Bonjour,

Je suis plutôt novice en macro.
J'essaye de transférer une macro déjà existante du classeur dans lequel elle s'exécutait à un panneau de commande. La macro a été faite par un connaisseur donc je galère un peu à la modifier.

Cette macro contient du "ThisWorkbook"
Si j'ai bien suivi "ThisWorkbook" fait référence au classeur ou s'exécute la macro. Maintenant que je la lance d'un panneau de commande j'ai voulu remplacer le "ThisWorkbook".

J'ai donc procédé ainsi :
Dim lettre As Workbook
Set lettre = Workbooks("Macro lettre interco_test_lancer_macro_pour_tous.xls")


lettre va donc faire référence au Workbooks : "Macro lettre interco_test_lancer_macro_pour_tous.xls"

Dans la logique je me suis donc dis que remplacer tous les "ThisWorkbook" par "lettre" était bon.

Dans un premier temps cela a marcher, cependant j'ai deux lignes qui me reviennent en erreur :


'Avant modif
ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count).Range("B4") = xlBook.Sheets("Data").Range("A1")

'Après modif
lettre.Sheets(lettre.Worksheets.Count).Range("B4") = xlBook.Sheets("Data").Range("A1")


et

'Avant modif
ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count).Name = "RECAP-SUMMARY-" & xlBook.Sheets("data").Range("A1") & "-" & xlSheet.Range("B1")

'Après modif

lettre.Sheets(lettre.Worksheets.Count).Name = "RECAP-SUMMARY-" & xlBook.Sheets("data").Range("A1") & "-" & xlSheet.Range("B1")


"ThisWorkbook" a t-il des propriétés particulières ? Je dirais que remplacer un Wb par un autre ne devrait pas poser de soucis dans l'absolu.

Si quelqu'un a des pistes ou des idées je suis preneur.

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 oct. 2015 à 13:57
Bonjour,
La collection WorkBooks contient les classeurs OUVERTS.
Où et comment as-tu donc ouvert le classeur "Macro lettre interco_test_lancer_macro_pour_tous.xls" ?
0
J'ai fait une première macro contenant

Workbooks.Open ("\\nomduserveur.net\Test en situation réel\Macro lettre interco_test_lancer_macro_pour_tous.xls"), UpdateLinks:=0


Les deux lignes d'erreurs citées plus haut se trouve dans une macro différente que j'ai appelé grâce à un "Call"
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 2/10/2015 à 14:35
Et c'est là que tu aurais du initialiser ta variable Lettre
Et cette variable (puisqu'utilisée dans des macros distinctes) aurait dû être déclarée générale (soit publique si dans des modules distincts, soit dans la partie générale du module contenant les deux macros).
Mais tu vas me dire que je tourne autour du pot sans te donner le code (comme tu l'as fait récemment dans une autre discussion), puis, quand tu auras enfin compris le sens de mon message, reviendras en disant que tu as "trouvé tout seul).
Au passage : là encore le mode debug ou un simple msgbox te permettrait de savoir ce qu'est finalement ton objet lettre juste avant sont utilisation...(sa propriété Name, pardi ...)
Ceci étant dit : ce que je t'en dis est "quand cela plante". Car quand cela "ne plante pas", c'est tout simplement parce-que le classeur en cause est celui actif (et cela plante lorsqu'il ne l'est pas).
J'estime t'avoir par ces mots suffisamment aiguillé (quoi que tu puisses en penser) et te laisse faire à partir de là ...

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Hello,

Je dois bien m'avouer vaincu cette fois-ci. Je comprends bien que ma variable "lettre" doit-être définis en publique dès le départ (les macros se trouvent bien dans des modules différents). J'ai rajouté la ligne "Public lettre As Workbook" dans le module de la première macro contenant l'ouverture de ce fichier. (tout en haut en du module, avant le Sub).
Une fois ce classeur ouvert j'en ai profité pour mettre ici mon "Set lettre = Workbooks("Macro lettre interco_test_lancer_macro_pour_tous.xls")".

D'après ce que j'ai compris de tes explications cela devrait alors marcher.

Surtout que juste avant ma ligne d'erreur j'ai bien essayé un MsgBox lettre.Name et le nom de mon classeur est bien revenu dans la MsgBox.

Du coup je bloque, j'ai compris un truc de travers dans tes consignes ou ma cause est autre ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 5/10/2015 à 11:31
Et ta variable xlBook ?
Où et comment a-t-elle été déclarée et où et comment a-t-elle été initialisée ?
Et quel est son contenu au moment de l'erreur ?

Et quel est le message exact de l'erreur ? (on ne le connaît toujours pas) ?
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Je viens de remplacer ma ligne d'erreur par ça :

   Dim j As Integer
For j = 1 To Worksheets.Count
Sheets(j).Activate
ActiveWorkbook.Sheets(j).Name = "RECAP-SUMMARY-" & xlBook.Sheets("data").Range("A1") & "-" & xlSheet.Range("B1")
Next j


Et ma macro marche.

J'avais défini mon xlbook as workbook en publique dans mon premier module. Son contenu au moment de l'erreur était bien le nom de mon deuxième classeur d'ou les informations viennent. Je ne pense donc pas que l'erreur venait de ce coté la.

Bon l'essentiel est que maintenant mon code marche. Merci pour tes conseils.

Edit 1 : Ca a marché correctement une fois, ensuite en fermant le tout et en le ré-ouvrant, je réssaye et j'ai droit à "Erreur d'exécution '1004' : Impossible de renommer une feuille comme une autre feuille, une bibliothèque d'objets référencée ou un classer référencé par Visual Basic".

Je ne comprends absolument pas cette erreur étant donné qu'il n'y a aucun conflit de ce type la.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 5/10/2015 à 12:39
Comment peux-tu raisonnablement penser, même une seule fraction de seconde, donner le même nom à plusieurs feuilles du même classeur ? (ce que prétend faire ta boucle) ...
Et au demeurant : une boucle qui fait son apparition maintenant .... comme un cheveu sur la soupe ...
On a de plus en plus l'impression de ce que tu avances à tâtons et nous "sers" un code également "à tâtons", en espérant que l'on va deviner et corriger ...
On est déjà "ailleurs" du premier "exposé" !

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Alors effectivement, je me rends compte de ma connerie dans mon code.
Cependant le but ici est de renommer chaque feuille du classeur cible avec des valeurs de celulles du classeur source. Etant donné que l'on trouve plusieurs feuilles une boucle est justifiée non ? (A condition de la paramétrer correctement, ce qui n'est pas le cas ici, on est d'accord.)

Comme je te l'ai déjà dit je n'ai pas de formation de développeur ou d'informaticien. Donc oui j'avance à tâtons.

Le fait est que j'ai passé une journée complète sur ce problème sans arriver à le résoudre ni même comprendre pourquoi je l'avais. J'ai donc cherché une autre façon d'arriver au même résultat, ce qui explique que l'on soit "ailleurs" du premier "exposé".
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 oct. 2015 à 15:31
Comme je te l'ai déjà dit je n'ai pas de formation de développeur ou d'informaticien. Donc oui j'avance à tâtons

Les rudiments sont- au moins nécessaires.
J'ai donc cherché une autre façon d'arriver au même résultat, ce qui explique que l'on soit "ailleurs" du premier "exposé".

Ik est dès lors impossible, voire carrément impensable, de te "suivre".
Désolé et Bonne chance
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 oct. 2015 à 20:09
ceci ayant été dit, Abc :
Bien que la vocation de ce forum ne soit pas celle d'écrire le code nécessaire à l'ensemble d'un mécanisme et bien que le coût de
j'ai passé une journée complète sur ce problème

soit probablement très supérieur à ce que t'aurait coûté l'intervention d'un informaticien très moyen, voire débutant ...,
Je veux bien te l'écrire, ce code, mais à condition :
- que tu saches isoler parfaitement ton besoin
- le définir très techniquement (sans en faire un roman), en exposant de manière claire, précise (et donc succincte) les tenants et les aboutissants très précis. Cela ne demande aucune connaissance informatique mais nécessite une très grande clarté d'esprit.
Reviens avec cela et tu auras ma réponse (et ton code) sauf si ton exposé laisse des zones d'ombre telles que j'aurais à te poser (ce serait un comble !) des questions complémentaires ...
A toi de voir ...
0
Je te remercie pour ton aide. Cependant je suis repartis du postulat de base à savoir :

lettre.Sheets(lettre.Worksheets.Count).Range("B4") = xlBook.Sheets("Data").Range("A1")


Je l'ai remplacé comme ceci :

ActiveWorkbook.Sheets(Worksheets.Count).Range("B4") = xlBook.Sheets("Data").Range("A1") 


et miracle ça marche !

Je le met en résolu et te remercie encore pour ta proposition !

Bonne journée
0
Rejoignez-nous