|
Publicité ' | ||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Bonjour,
Premier contact avec les macros et je galère quelque peu. Je suis chargé de corriger une macro qui ne fonctionne plus correctement. Cette macro est appelée à l'ouverture du fichier grâce à la méthode AutoOpen. Elle est entre autres chargée de redimensionner une image. Or le redimensionnement ne s'effectue jamais lors du passage de la macro due à l'ouverture du fichier. Pourtant cette macro est correctement lancée puisqu'elle affiche les diverses MsgBox que j'ai placé tout au long de son exécution. Voilà le code correspondant au redimensionnement des images: Code :
Pire, lors de la première exécution automatique à l'ouverture, je peux remarquer si j'ajoute pour une image donnée la méthode ShapeList.Item(i).Select, le redimensionnement a lieu pendant une période d'1/2 seconde puis l'image revient à sa taille d'origine. La seule manière de rendre le changement permanent est donc comme je l'ai dit précédemment de ré-exécuter à la main la macro. Quelqu'un aurait-il une idée sur la chose? PS: Je sais que le parcours de collection peut être écrit plus joliment, mais ce n'est pas ça qui m'inquiète actuellement |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
ShapeList, c'est quoi ?
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Ah, oui, désolé d'avoir oublié ça.
C'est des InlineShapes: ShapeList As InlineShapes Le nombre d'items de cette liste correspond bien au nombre d'images dans mon document. |
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
Je me suis amusé à refaire ton code et ça donne ceci : Code :
For Each ... Next Au lieu de passer les propriétés à des variables, j'utilise directement les propriétés. Au lieu d'utiliser l'évènement AutoOpen, je préfère utiliser Document_Open() La raison pour laquelle elle ne fonctionne qu'au second passage, je n'ai pas d'idée.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
||
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Merci pour ton intérêt et ton temps!
Pour la boucle je pense pas que ça change grand chose. C'est de ta manière qu'elle était codée à la base dans la macro que j'ai à modifier, et le problème était déjà présent. Par contre c'est plus lisible, je m'étais promis de re-modifier ça. Par contre pour le Document_Open, je ne peux pas encore tester n'étant pas au boulot. Mais il y a une précision que j'ai oublié de donner: ma macro est liée au document (via un .mso). Elle n'est donc pas globale pour tous les projets word de l'utilisateur. Tu penses que du coup le Document_Open sera toujours adapté? Ou alors le problème vient peut-être de la manière donc mon programme originel lie la macro au projet? (du temps de word 2003, la macro marchait parfaitement) PS: et pour les InlineShapes tout à l'heure, j'avais oublié de préciser que cette liste est récupérée via ThisDocument.InlineShapes |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
Le Document_Open() fonctionne pour un document lorsque la procédure se trouve dans ce document ou pour tous les documents si elle se trouve dans le Normal. Pour le .MSO, je n'ai jamais travaillé de cette façon.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Ok, très bien, je teste ça demain.
Et aurais-tu des conseils du coup sur l'implantation d'une macro externe sur un document autrement qu'avec un .mso? Si jamais cette méthode est trop archaïque ou autre? C'était ma première journée sous VBA, donc pardonne moi si je raconte des bêtises sans m'en rendre compte! ^^ Et merci encore. |
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
Dans le document même ? En fait, je ne connais ni les tenants ni les aboutissants.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
|
|
00
|
|
|
#9 | ||||
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Je viens de tester Document_Open() et ça n'a pas l'air de se lancer à l'ouverture du document word.
J'ai cette procédure de test dans la section Module de mon projet "Toto" (nom du document word). Le nom de fichier où est la procédure est NewMacros. Code :
Et sinon je vais planter un peu plus le contexte. Je suis en présence d'un logiciel java qui génère un document word à partir de diverses données. J'ai sous les yeux un bon gros document html qui à l'air de formater tout ça avec les espaces de noms qui vont bien. Code :
C'est pour cela que l'on affecte une macro à ce document, via un .mso. Le lien est fait dans le document html cité précédement. Code :
<link rel=Edit-Time-Data href="Style_MS_Word_html_documentstyle/_EXT-RES/editdata.mso"> Première chose: la macro exécute toujours lors de l'ouverture, mais certaines actions ne semblent pas prises en compte plus d'1/2 seconde. Par exemple, ma table des matières est correctement mise à jour, mais les images, et c'est l'objet de mon post, ne restent pas aux dimensions voulues. Je peux voir si je fais un effort de concentration ( Autre problème, mes images ne sont plus "intégrées" au document, mais cela fera surement l'objet d'un autre post. Voilà, le contexte est peut-être plus clair maintenant. |
||||
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
Pour le Document_Open(), la procédure doit se trouver dans ThisDocument, dans un module standard, elle n'a pas d'effet. Pour le reidmentionnement, j'ai eu quelques surprises aussi, le redimentionnement se faisait pour ensuite être annulé, c'est pour cette raison que j'ai écrit une macro toute neuve avec une boucle sur les objets. Pour que les images soient dans le document, je pense qu'on peut modifier la propriété de liaison.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
|
|
00
|
|
|
#11 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Merci, le document_open() marche dans la configuration que tu m'as dit, mais malheureusement mon problème reste identique.
J'ai copié collé ta fonction et le résultat final est le même. Pas de redimensionnement lors de l'ouverture, mais redimensionnement si on exécute la macro à la main. Pour le moment on a solutionné très temporairement le client en lui indiquant la procédure manuelle pour passer la macro, mais bon, il va falloir qu'on arrive à corriger ça. En tout cas merci encore pour ton temps, très gentil de ta part, et si tu as d'autres pistes de réflexion qui te viennent à l'esprit, n'hésite pas! |
|
|
00
|
|
|
#12 |
![]() ![]() ![]() Olivier LebeauContrôleur d'industrie Inscription : février 2006 Messages : 17 318 ![]() |
Salut,
Je suis surpris, les images sont redimensionnées à l'ouverture chez moi.
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ? Débutez en VBA Mes articles Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus ! |
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Une partie de la solution vient de la structure html. Quand on a déclaré dans la structure une largeur et une hauteur, le redimensionnement marche. Hors ces images sont celles qui n'ont pas besoin d'être redimensionnées, pour ça que je ne l'ai pas vu avant.
Par contre, quand dans la balise, rien n'est précisé, là il y a le problème que j'ai développé plus haut. Et justement, vu que notre structure de document est standard et que nous n'avons aucune idée de la future taille des images, on ne met rien. Une partie de la solution: mettre une taille toujours supérieure à la normale, et ensuite faire un reset de l'image puis la redimensionner. Mais du coup on redimensionne toutes les images. Mais bon, je suis pas encore très clair, je continue mes tests demain pour voir si je peux faire un test avant le reset. Il y a des mécanismes dans le chargement du document que je ne connais pas. Je repost quand j'en saurai plus |
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() Kévin Etudiant en apprentissage Inscription : septembre 2010 Messages : 60 ![]() |
Voilà, terminé tout à l'heure mes corrections sur cette macro, donc je vais expliquer tout ça un peu mieux dans l'hypothèse que quelqu'un d'autre s'arrache un jour les cheveux dessus!
Mon redimensionnement ne fonctionnait pas correctement. Nous avons fini par découvrir qu'en ajoutant les propriétés "width" et "height" dans la balise de l'image, le redimensionnement s'effectuait. Or la génération du document étant basée sur un document statique, impossible de déterminer à la génération les tailles correspondantes aux images. Solution proposée: mettre des propriétés volontairement trop grandes. On génère donc notre document ainsi, et la macro va maintenant faire son boulot: Si image trop grande -> Image que l'on a ajouté sans contrôle, on entre dans notre procédure : On applique un "reset" sur le InlineShapes, l'image revient à sa taille d'origine On applique ensuite notre petit algorithme de redimensionnement d'images Maintenant je voulais inclure (et non juste lier) les images à mon document lors de la sauvegarde. Pour cela, google nous donne la solution: récupérer tous les "fields" du document et appliquer la méthode "Unlink". Petite astuce cependant: faire ce "unlink" avant notre procédure de redimensionnement avec reset. Sinon ça ne marche pas, en tout cas dans mon cas Voilà, en espérant que cela sera utile à quelqu'un. Et un grand merci à toi Heureux-oli, sympa de pouvoir poser son problème et recevoir des réponses rapides! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com