Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2011, 16h57   #1
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
Par défaut Redimensionnement images visible au deuxième passage de la macro

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
 
Dim Width As Long
Dim NewWidth As Long
Dim Height As Long
Dim NewHeight As Long
 
Dim taille As Integer
taille = ShapeList.Count
 
For i = 1 To taille
 
        If ShapeList.Item(i).Type = wdInlineShapePicture Or ShapeList.Item(i).Type = wdInlineShapeLinkedPicture Then
 
 
            Width = ShapeList.Item(i).Width
            Height = ShapeList.Item(i).Height
            NewWidth = MillimetersToPoints(160)
            NewHeight = MillimetersToPoints(230)
 
            If Height > NewHeight Then
 
                ShapeList.Item(i).Height = NewHeight
                ShapeList.Item(i).Width = Width * NewHeight / Height
            End If
            If Width > NewWidth Then
 
                ShapeList.Item(i).Width = NewWidth
                ShapeList.Item(i).Height = Height * NewWidth / Width
            End If
 
        End If
 
    Next i
A priori ce code ne fonctionne pas trop mal, sauf que le changement reste visible uniquement si on passe la macro une deuxième fois à la main après l'ouverture du document.

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
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 17h43   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 17h57   #3
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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.
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 18h38   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
Salut,

Je me suis amusé à refaire ton code et ça donne ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Sub Document_open()
Dim ilS As InlineShape
'Boucle sur les objets
For Each ilS In ActiveDocument.InlineShapes
If ilS.Type = wdInlineShapePicture Or wdInlineShapeLinkedPicture Then
    If ilS.Height > MillimetersToPoints(230) Then
 
        With ilS
            .Width = .Width * MillimetersToPoints(230) / .Height
            .Height = MillimetersToPoints(230)
        End With
    End If
    If ilS.Width > MillimetersToPoints(120) Then
 
        With ilS
            .Height = .Height * MillimetersToPoints(120) / .Width
            .Width = MillimetersToPoints(120)
        End With
    End If
End If
Next ilS
End Sub
au lieu de faire une boucle sur le nombre d'items dans le documents, je fais une boucle sur les Items

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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 18h49   #5
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 19h41   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 00h02   #7
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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.
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 06h27   #8
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h24   #9
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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 :
1
2
3
4
5
6
Sub Document_open()
 
MsgBox "coucou"
 
 
End Sub
C'est bien ça normalement?


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 :
1
2
3
4
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">
Or ce document n'est pas encore parfait. La table des matière n'est pas remplie, les images ne sont pas à l'échelle du document, les images ne sont pas "intégrées" au document (on déplace le .doc dans un autre fichier, les liens vers les images sont brisés et on voit une croix rouge à la place), ...

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">
Cette macro réalise donc toutes les actions précédemment citées, plus quelques autres et re-sauvegarde le document. On ne l'exécute que à la première ouverture du document. Elle marchait bien sous word 2003 selon mes collègues, mais depuis word 2007, certaines actions ne fonctionnent plus correctement.

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 ( ) une image réduite pendant un court instant, puis après cette dernière reprend sa taille normale. J'ai essayé entre les à la fin de chaque étape de redimensionnement (largeur puis taille) de sauvegarder le document mais cela n'est pas efficace.

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.
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 11h04   #10
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 14h50   #11
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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!
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 16h30   #12
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 318
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 318
Points : 29 214
Points : 29 214
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 19h02   #13
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 18h15   #14
Membre du Club
 
Avatar de yaraco
 
Kévin
Etudiant en apprentissage
Inscription : septembre 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Kévin
Localisation : France

Informations professionnelles :
Activité : Etudiant en apprentissage
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 60
Points : 65
Points : 65
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 (le parcours des fields ne récupère plus ceux contenant des images).

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!
yaraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h49.


 
 
 
 
Partenaires

Hébergement Web