Macro taille image collée dans Word 2007 [Résolu/Fermé]

Signaler
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010
-
 bibilac -
Bonjour,

D'abord, d'une manière collective, merci à tous les membres du forum pour tous ces enseignements précieux dont j'ai bénéficié grâce à vous depuis déjà si longtemps ! J'ai appris plus de 50% de ce que je sais grâce à vous :)

Bon sinon, pour la première fois, j'ai quand même un problème pour lequel je n'ai trouvé aucune réponse nulle part... Je le place dans le forum Bureautique un peu au hasard, j'espère ne pas me tromper...

Situation de départ : utilisation d'un document en mode Formulaire sous word 2007 (avec les zones de saisie, les listes déroulantes, la protection activée pour saisie uniquement dans les champs et tout le toutim).
Je mets ce doc à la dispo d'utilisateurs qui doivent pouvoir y insérer des copies écran sans désactiver la protection (en restant en mode formulaire, forcément...).

Elément important à connaître : il ne vont pas insérer les copies écran par la fonction insertion d'image, mais il vont procéder par COPIER /COLLER.

J'ai donc créé un bouton "coller ma copie écran" dans le doc à cet effet.
En gros, la macro associée fait peu de choses : désactivation de la protection, atteindre le point d'insertion prévu défini par un signet (dénommé "ECRAN"), remonter d'une ligne, coller, et réactivation de la protection.
Pour tout ça, j'ai pas de problème.

Ce que je n'arrive pas à faire, c'est de forcer le redimmensionnement de l'image collée pour qu'elle ne dépasse pas la zone de texte.

J'ai essayé d'utiliser l'enregistreur pour choper les commandes de gestion de la taille d'image sélectionnée, mais, à mon grand désespoir, lorsque j'arrête l'enregistrement la macro créée est juste... VIDE :((

J'ai testé plein de trucs trouvé sur le net mais rien ne me permet d'agir sur cet objet que je viens de coller, je n'y arrive pas.
Je veux bien apprendre et surtout les bidules genre "InlineShapes", parce que pour l'instant, je comprends pas comment ça marche.

Voici mon code de départ, à toutes fins utiles...
Merci encore mille fois pour votre aide à tous

Private Sub CommandButton11_Click()
'If document is protected, Unprotect it.
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=""
End If

Selection.GoTo What:=wdGoToBookmark, Name:="ECRAN"
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste

' ReProtect the document.
If ActiveDocument.ProtectionType = wdNoProtection Then
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, _
NoReset:=True
End If
End Sub

18 réponses

Messages postés
17093
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
13 avril 2021
10 316
Bonjour,

Moi je dis toujours qu'il vaut mieux réserver les macros lorsque c'est indispensable. Parce que ça génère quand même pas mal de problème. Y a toujours la personne qui n'a pas activé les macros, les récup de fichiers pour en créer un autre, et hop, on perd la macro au passage, etc.

Parce que si j'en juge ton modèle à travers tes explications, et vu que tu utilises Word 2007, il n'y a pas besoin de macro du tout !

- Insertion de champs de formulaires 2007
- Création de la cellule de tableau pour l'image
- Protection : protéger tout (aucune modif)
- Sélection des champs de formulaires et du tableau
- Cocher Exception => tout le monde

Et voilà ! tu as un template léger, protégé, que tout le monde peut utiliser sans souci.

Il faut aussi penser à une chose : si l'utilisateur décide de changer d'image, il va réutiliser ta macro qui ne fera que coller une nouvelle image, et la première sera toujours là.

Bref... à mon avis, où il faut macroter plus que cela, ou oublier les macros.

m@rina
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
Salut,
Tout d'abord, je précise que je ne connais pas VBA sous word...
J'ai néanmoins vu dans l'aide que l'on peux attribuer à "InlineShapes" une valeur de height (hauteur) et de width (largeur). Je pense qu'il faut voir de ce côté.
Vu sur CCM également : ici ceci :
Selection.InlineShapes(1).LockAspectRatio = msoTrue
Selection.InlineShapes(1).Height = ton hauteur
Selection.InlineShapes(1).Width = ta largeur

Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Merci Pikaju

Mais ça marche pas :(

J'ai une erreur "5941" Le membre de la sélection requis n'existe pas.

je pense que le souci vient du fait que l'image est collée et non pas insérée par la fonction d'insertion Word.
ça fait 2 semaine que je triture les inlineshapes dans tous les sens sans vraiment comprendre ce que je fais et sans succès...
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Voici la nouvelle macro, celle qui provoque l'erreur d'éxécution 5941:
Private Sub CommandButton11_Click()
'If document is protected, Unprotect it.
If ActiveDocument.ProtectionType <> wdNoProtection Then
ActiveDocument.Unprotect Password:=""
End If

Selection.GoTo What:=wdGoToBookmark, Name:="ECRAN"
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste
Selection.InlineShapes(1).LockAspectRatio = msoTrue
Selection.InlineShapes(1).Height = 200
Selection.InlineShapes(1).Width = 200
' ReProtect the document.
If ActiveDocument.ProtectionType = wdNoProtection Then
ActiveDocument.Protect Type:=wdAllowOnlyFormFields, _
NoReset:=True
End If
End Sub

Je me demande si il faudrait pas définir une variable pour déclarer l'objet que je colle.
Sous excel, je me poserai pas la question, mais là sous word, et en plus 2007, je rame à reculon et j'attaque la falaise....
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
Bon sang de bonsoir, il faut que l'on trouve...
Essaye cette macro qui n'a rien à voir, il s'agit d'un test. Si j'ai bien compris il ne s'agit pas d'un objet InlineShapes car ton image est encadrée. Il s'agit d'un objet Shapes. Cette macro te le dira :
sources
Sub TestTypeImage()
Dim i As Integer
If Not IsNull(ActiveDocument.InlineShapes.Count) Then
    i = ActiveDocument.InlineShapes.Count
    MsgBox "Votre document comporte " & _
       i & vbCrLf & " Images de type InlineShape !"
End If
If Not IsNull(ActiveDocument.Shapes.Count) Then
    i = ActiveDocument.Shapes.Count
    MsgBox "Votre document comporte " & _
       ActiveDocument.Shapes.Count & vbCrLf & " Images de type Shape !"
End If
End Sub


Shapes et InlineShapes ont les mêmes propriétés donc après cela devrait aller avec .width et .height
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

TRUC DE OUFF !!!!

Délir total
J'ai éxécuté la macro avant de cliquer sur mon bouton et j'ai découvert que j'avais 3 inlineshapes et 4 shapes.
Je l'ai ré-éxécutée après mon bouton coller image, et le compteur Inlinesshapes passe à 4 tandis que le shapes reste à 4.
Moralité, ça crée bien un Inlineshapes !!!
Le truc que je découvre, c'est que j'en avais déjà 3 :o
Forcément, le biniou, il sait pas trop avec ki il doit discuter...

T'es un champion :)
Je désespère de ne pas avoir pensé à faire ce test ! C'est dur de vieillir :((((( lol
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
ça n'est qu'un début, une piste.
Dès que ton code fonctionne, reviens le poster ici que cela serve pour les futurs amateurs d'images à redimensionner sous vba word...
Et place ensuite ce sujet comme "résolu".
Messages postés
17093
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
13 avril 2021
10 316
Bonjour,

Si le but est d'obtenir une image à une taille imposée, la macro est tout à fait inutile.
Il suffit de tracer une cellule de tableau à la bonne dimension de largeur, puis dans les propriétés du tableau, aller dans les options, et décocher l'option "Redimensionner automatiquement pour ajuster au contenu".
Ce qui aura aussi pour mérite de conserver les proportions de l'image.

m@rina
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Pfffffffff...

J'ai conservé ta proposition de code et, très naivement, j'ai transformé le petit (1) en (4) en me disant que c'était l'issue pour qu'il retrouve l'image collée.

Rien à faire, erreur 5941

En cherchant dans d'autres forums, j'ai aperçu des trucs disant que l'erreur 5941 était liée à une histoire d'ActiveDocument...
ça me parle pas, et toi ?
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Merci Marina !

Effectivement, c'est une approche simple et efficace. Je te remercie pour ce conseil.


Par contre, c'est ptèt buté, borné ou bêtement obstiné, mais maintenant que je tripote ce code depuis une semaine, j'avoue que j'ai du mal à lacher prise et abandonner... j'aimerai bien comprendre ce qui marche pas, juste pour ma culture perso...

Mais merci encore !!!
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
Oui je te comprends.
Ton problème dois venir du fait que, chaque fois que tu insères une image, le "compteur" de inlineshape s'incrémente et tu ne sais pas à combien il en est. Là tu aurais par exemple du mettre 5 parce que 4 c'était déjà fait...
Essaye comme ceci :

Dim i As Integer
i = ActiveDocument.InlineShapes.Count
Selection.InlineShapes(i).LockAspectRatio = msoTrue 
Selection.InlineShapes(i).Height = 200 
Selection.InlineShapes(i).Width = 200 


Sinon bien entendu je rejoinds Marina (salue!!).
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Ouais, c'est pas faux...

Tu m'as convaincue (même si ça m'enerve de pas avoir compris !)

Merci encore à vous deux
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

Pijaku, ça ne marche pas :( Merci pour ta persévérance.

Je ne comprends pas pourquoi et j'ai l'impression que je ne comprendrai jamais.

Je mets le topic en résolu ou pas ?
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
Test d'abord ceci :

Dim i As Integer
i = ActiveDocument.InlineShapes.Count
ActiveDocument.InlineShapes(i).Select
Selection.InlineShapes(i).LockAspectRatio = msoTrue
Selection.InlineShapes(i).Height = 20
Selection.InlineShapes(i).Width = 500

et si cela fonctionne met en résolu...
Messages postés
11
Date d'inscription
vendredi 12 février 2010
Statut
Membre
Dernière intervention
12 février 2010

rien à faire
Toujours la même erreur d'éxécution :(
je comprends pas
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 594
alors considérons que Marina a la meilleure solution.

comme d'hab rrrrrrh!!!
bonne journée à vous 2
Messages postés
17093
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
13 avril 2021
10 316
Re...

Je vois qu'on devient raisonnable !!! ;))

J'ai pas suivi si ce sont des shapes ou des inlineshapes, mais voici un code exemple (histoire de ne pas trop t'énerver !;)) qui va donner une largeur de 200 pt à tous les images Inlineshapes du document actif.

Sub dessins()
Dim image
For Each image In ActiveDocument.InlineShapes
image.Width = 300
image.LockAspectRatio = True
Next image
End Sub


m@rina
Bonjour,

J'ai une réponse directe à la question initiale : je pense que le pb vient de ce que le graphique qu'on vient d'insérer n'est pas sélectionné, alors toute commande faisant référence à la liste d'InlineShapes de la sélection provoque une erreur.

2 solutions : soit on sélectionne le graphique qu'on vient d'insérer :

Selection.InlineShapes.AddPicture FileName:="mon fichier graphique"
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.InlineShapes(1).LockAspectRatio = msoTrue
Selection.InlineShapes(1).Height = CentimetersToPoints(10)

ou alors on appelle la collection d'InlinesShapes depuis le document actif (ce qui me semble plus élégant) :

Selection.InlineShapes.AddPicture FileName:="mon fichier graphique"
ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).LockAspectRatio = msoTrue
ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Height = CentimetersToPoints(10)

J'espère que ça plaira à Pijaku (qui est peut être passé à autre chose depuis ...)