Macro taille image collée dans Word 2007

Résolu/Fermé
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010 - 12 févr. 2010 à 10:04
 bibilac - 30 mars 2012 à 15:06
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
A voir également:

18 réponses

m@rina Messages postés 21078 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 13 novembre 2024 11 350
12 févr. 2010 à 11:52
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 10:29
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

0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 10:38
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...
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 10:45
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....
0

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

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 11:17
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
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 11:27
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 11:31
ç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".
0
m@rina Messages postés 21078 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 13 novembre 2024 11 350
12 févr. 2010 à 11:34
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
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 11:37
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 ?
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 11:44
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 !!!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 11:52
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!!).
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 11:57
Ouais, c'est pas faux...

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

Merci encore à vous deux
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 12:01
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 ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 12:13
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...
0
Vesper Lynd Messages postés 11 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 13:47
rien à faire
Toujours la même erreur d'éxécution :(
je comprends pas
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
12 févr. 2010 à 13:50
alors considérons que Marina a la meilleure solution.

comme d'hab rrrrrrh!!!
bonne journée à vous 2
0
m@rina Messages postés 21078 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 13 novembre 2024 11 350
12 févr. 2010 à 14:25
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
0
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 ...)
0