Macro taille image collée dans Word 2007
Résolu
Vesper Lynd
Messages postés
11
Statut
Membre
-
bibilac -
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
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:
- Macro taille image collée dans Word 2007
- Comment réduire la taille d'un fichier - Guide
- Word 2013 - Télécharger - Traitement de texte
- Save as pdf office 2007 - Télécharger - Bureautique
- Reduire taille image - Guide
- Tableau word - Guide
18 réponses
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
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
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 :
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
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...
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...
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....
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....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
Shapes et InlineShapes ont les mêmes propriétés donc après cela devrait aller avec .width et .height
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
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
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
ç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".
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".
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
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
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 ?
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 ?
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 !!!
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 !!!
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 :
Sinon bien entendu je rejoinds Marina (salue!!).
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!!).
Ouais, c'est pas faux...
Tu m'as convaincue (même si ça m'enerve de pas avoir compris !)
Merci encore à vous deux
Tu m'as convaincue (même si ça m'enerve de pas avoir compris !)
Merci encore à vous deux
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 ?
Je ne comprends pas pourquoi et j'ai l'impression que je ne comprendrai jamais.
Je mets le topic en résolu ou pas ?
Test d'abord ceci :
et si cela fonctionne met en résolu...
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...
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.
m@rina
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 ...)
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 ...)