Macro sous Word insertion photos

Macro sous Word insertion photos - VB/VBA/VBS - Programmation

Marsh Posté le 15-10-2008 à 11:15:07    

Hello les truffes.  
 
Je vous passe les détails (pas le temps), mais pour le taf, j’ai besoin de pouvoir insérer rapidement sur un document word un nombre important de photos.  
 
L’idéal serait de créer une macro qui permettre d’insérer toutes les photos d’un dossier, genre au lancement de la macro une boite s’ouvre demandant le chemin du dossier à traiter, et pouf, une fois la macro exécutée, toutes les images au format jpeg de ce fichier se trouvent insérées, dans l'ordre croissant des noms des photos, idéalement encore avec, intercalé entre chaque photo 2 lignes blanches et une troisième ligne au milieu avec un caractère « $ ».  
 
       Style :  
 
        Photo  
        Ligne blanche  
        $  
        ligne blanche  
        photo  
        Ligne blanche  
        $  
        .........  
 
Bref, ça me ferait gagner un temps considérable.  
 
Si quelqu’un pouvait me créer la macro et ensuite me balancer le code VBA de la macro, ce serait nickel.  
 
A vos propales, Messieurs les Pro  
 
: hello :  
 
ha oui, c'est URGENTISSIME !!!!
 


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 11:15:07   

Reply

Marsh Posté le 15-10-2008 à 11:33:21    

Une "geekette" qui ne sais pas écrire une macro Word... c'est pas une geekette ! :p
 
Le plus simple, c'est de faire "insérer une image", et ensuite, de tout sélectionner... là il va t'ajouter toutes les images... je vois pas l'intérêt d'une macro dans ce cas.
 
Sinon, tu peux, pour insérer une image utiliser la commande
Selection.InlineShapes.AddPicture FileName:="CHEMIN\NOM_FICHIER.EXTENSION", LinkToFile:=False, SaveWithDocument:=True
 
Et pour passer une ligne, la commande
Selection.TypeParagraph

Reply

Marsh Posté le 15-10-2008 à 11:36:27    

dslée, les macro je m'les fais avec la commande enregistrer :D
 
Et trop de projets en hard pour mettre les mains dans le soft en ce moment :(
 
En plus, ça urge vraiment, et je suis une bille en prog.


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 12:06:22    

Eh bien ma réponse convient... donc désolé, j'ai aussi plein de trucs urgents moi aussi à faire avant de faire ceux des autres !
 
Tu fais ça avec la commande enregistrer... et ensuite tu modifies le code, donc rien de bien compliqué là dedans ! faut pas pousser non plus.
 
Dans tous les cas, la sélection multiple lors de l'insertion reste le meilleur moyen... pourquoi ne pas faire ça ?

Reply

Marsh Posté le 15-10-2008 à 12:23:19    

parce que ça marche pas !!!!!
 
dslée si je t'ai froissé, et merci du coup de main, j'vais tenté de regarder, mais je ne connais vraiment rien à la programmation, je suis de formation juridique : monter un pc de A à Z ok, mais le code c'est pas mon truc.
 
En tout cas encore merci.


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 12:30:47    

Si si... ça marche très bien, j'ai fait le test.
 
Tu fais "insertion d'image"
ensuite, tu vas dans le répertoire qui t'intéresse... et là tu sélectionnes plusieurs fichiers images... (avec ctrl pour une sélection multiple par exemple).
 
Il t'insère alors toutes les images sélectionnées.
 
(je ne suis pas froissé mais le "faites moi tout parce que moi je suis super pressé"... bof... c'est pas trop la conception d'un forum d'entre aide)

Reply

Marsh Posté le 15-10-2008 à 12:30:48    

j'ai oublié de préciser, on bosse avec WORD 97, en raison des spécificités de notre logiciel preofessionnel.


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 13:34:23    

Et Word 97 ne sait pas faire ça ???... il veux pas de multi sélection ? il dit quoi ?
 
Sinon, pour la macro, y'a pas besoin de savoir écrire les macros... tu fais du copier coller de la ligne que j'indique autant de fois que d'images, et tu indiques le nom du fichier image... ça ne nécessite aucune connaissance en programmation, simplement de savoir remplacer "CHEMIN" par le chemin où se trouvent les images... je pense que c'est à la portée de quiconque qui sait se servir un minimum d'un ordinateur.

Reply

Marsh Posté le 15-10-2008 à 13:38:41    

Ptit loup a écrit :

Si si... ça marche très bien, j'ai fait le test.
 
Tu fais "insertion d'image"
ensuite, tu vas dans le répertoire qui t'intéresse... et là tu sélectionnes plusieurs fichiers images... (avec ctrl pour une sélection multiple par exemple).
 
Il t'insère alors toutes les images sélectionnées.
 
(je ne suis pas froissé mais le "faites moi tout parce que moi je suis super pressé"... bof... c'est pas trop la conception d'un forum d'entre aide)


 
je t'assure, impossible de sélectionner plusieurs photos que ce soit avec cTRL ou shift.
 
avec ton code ok, mais la difficulté, pour moi, c'est de créer une boucle pour lui faire insérer toutes les photos ou une fourchette de numéros préalablement définie  :sweat:  


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 13:40:50    

Ptit loup a écrit :

Et Word 97 ne sait pas faire ça ???... il veux pas de multi sélection ? il dit quoi ?
 
Sinon, pour la macro, y'a pas besoin de savoir écrire les macros... tu fais du copier coller de la ligne que j'indique autant de fois que d'images, et tu indiques le nom du fichier image... ça ne nécessite aucune connaissance en programmation, simplement de savoir remplacer "CHEMIN" par le chemin où se trouvent les images... je pense que c'est à la portée de quiconque qui sait se servir un minimum d'un ordinateur.


 
en fait je veux automatiser l'opération : pour rédiger des PV de constats de travaux, avec insertion de 200 photos en moyenne.... donc le but ce serait d'insérer toutes photos d'un coup et taper le texte ensuite.
 
en fait la macro doit être à vocation générale, avoir une boite de dialogue où on entre le fichier spécifié.
je sais pas si c'est très clair... :(


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 13:40:50   

Reply

Marsh Posté le 15-10-2008 à 14:20:27    

Bon... j'ai pas pris le temps de faire une boite de dialogue pour "naviguer" sur le disque pour choisir le répertoire... mais ça devrait déjà bien te dépanner...
(regarde ce que fait cette macro, ça peut être intéressant).
 

Sub InsertionImages()
 
Dim Repertoire As String
Dim Extension As String
Dim Fichier As String
 
'Saisie du nom du répertoire
Repertoire = InputBox("Chemin complet du répertoire (\ à la fin)", "Répertoire", "D:\Mes images" )
'Saisie du type d'extension
Extension = InputBox("Type de fichier (sans le point, ex : jpg, png, bmp)", "Type de fichier", "jpg" )
 
'Récupération du premier fichier du répertoire
Fichier = Dir(Repertoire & "*" & Extension, vbDirectory)
 
Do While Fichier <> ""
    i = i + 1
    'Insertion de l'image
    Selection.InlineShapes.AddPicture FileName:=Repertoire & Fichier
    'Insertion d'une ligne vide
    Selection.TypeParagraph
    'Récupération du prochain fichier du répertoire
    Fichier = Dir
Loop
 
End Sub


 
Je vais insérer ta question ainsi que la réponse dans le topic unique Word... histoire que ça puisse resservir à d'autres !

Reply

Marsh Posté le 15-10-2008 à 14:27:34    

ok, je vais tester ça de suite, merci mille fois.


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 15:23:00    

Encore un grand grand merci, c'est tout simplement impec, ça va me fare gagner un temps fou !!!!
 
j'vais voir si je peux aussi par ce biais déterminer directement la taille des photos.
 
Pour la mise en page, c'est déjà fait.
 


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 15:35:59    

J'ai essayé d'ajouter la ligne en rouge, pour la taille, mais ça ne veut pas, je supose qu'il ne sait pas kel objet est à traiter : mais je sais pas comment lui dire non plus  :cry:
 
Sub InsertionImages()
 
Dim Repertoire As String
Dim Extension As String
Dim Fichier As String
 
'Saisie du nom du répertoire
Repertoire = InputBox("Chemin complet du répertoire (\ à la fin)", "Répertoire", "D:\Mes images" )
'Saisie du type d'extension
Extension = InputBox("Type de fichier (sans le point, ex : jpg, png, bmp)", "Type de fichier", "jpg" )
 
'Récupération du premier fichier du répertoire
Fichier = Dir(Repertoire & "*" & Extension, vbDirectory)
 
Do While Fichier <> ""
    i = i + 1
    'Insertion de l'image
    Selection.InlineShapes.AddPicture FileName:=Repertoire & Fichier
    Selection.InlineShapes.Width = 200
    'Insertion d'une ligne vide
    Selection.TypeParagraph
    'Récupération du prochain fichier du répertoire
    Fichier = Dir
Loop
 
End Sub


Message édité par bibou_62 le 15-10-2008 à 15:54:55

---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 15:56:41    

J'ai :  
 
erreur de compilation
membre de méthode ou de donnée introuvable


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 15:58:46    

Bonsoir,
essaye ceci:
remplacer    Selection........ par: set ILS = Selection.....
 
et ta "ligne en rouge" par:     ILS.Width=200
 
width ne change que la largeur, il fauda aussi changer Heigth

Reply

Marsh Posté le 15-10-2008 à 16:01:10    

en fait un truc du genre, pour la taille image :
 
If eight < Width,     Selection.InlineShapes.Width = 200  
else eight=200
 
mais ça doit pas être la bonne syntaxe  :whistle:
 
>>> et aussi lui dire de le faire en sélectionnant l'image, ça arrangera mon message d'erreur, je suppose  :sweat:


Message édité par bibou_62 le 15-10-2008 à 16:02:04

---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 16:09:06    

Re,
je tenterai ceci:
 
Wio = ils.Width
       ils.Width = 200
       ils.Height = ils.Height * 200 / Wio

Reply

Marsh Posté le 15-10-2008 à 16:10:43    

seniorpapou a écrit :

Bonsoir,
essaye ceci:
remplacer    Selection........ par: set ILS = Selection.....
 
et ta "ligne en rouge" par:     ILS.Width=200
 
width ne change que la largeur, il fauda aussi changer Heigth


 
 
je mets koi à la places des ..... ?
si je mets une ligne en-dessous de ma ligne "selection"...
style : "Set ILS = Selection" ça marche pas, j'ai "erreur... propriété ou méthode non gérée par cet objet"
et si je mets "Set ILS=" devant ma ligne Selection, j'ai une erreur de compilation.
 
 :sweat:


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 16:11:20    

tu dois mettre des parenthèses je crois:
set ILS =Selection.InlineShapes.AddPicture (FileName:=Repertoire & Fichier )

Reply

Marsh Posté le 15-10-2008 à 16:14:08    

Je dois m'absenter, je repasse la main à ptit loup que je salue.


Message édité par seniorpapou le 15-10-2008 à 16:14:20
Reply

Marsh Posté le 15-10-2008 à 16:31:23    

Voilà le nouveau code à utiliser alors pour la partir "insertion de l'image"...
 

   'Insertion de l'image
    Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
    With objShape
        .LockAspectRatio = msoTrue
        .Width = 200
    End With


 
Libre à toi de choisir autre chose que 200 comme largeur !

Reply

Marsh Posté le 15-10-2008 à 16:57:44    

Possible d'avoir un truc de ce style (traduit en bonne syntaxe):
 
   'Insertion de l'image
    Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
    With objShape
        .LockAspectRatio = msoTrue
if width > eight  
        .Width = 200
        .else eight =200

    End With
 
 
merci  :hello:


Message édité par bibou_62 le 15-10-2008 à 17:01:07

---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 17:07:14    

j'ai essayé ça, mais y'a pas bon :
 
Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
    With objShape
        .LockAspectRatio = msoTrue
If objShape.Width > objShape.eight Then objShape.Width = 200
        objShape.eight = 200
    End With


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 17:08:01    

Oui, tu peux en effet faire ça...
Il va te falloir plutôt utiliser le .width et le .height pour que la syntaxe soit correcte... et ça devrait marcher (et virer le . du else :) )

Reply

Marsh Posté le 15-10-2008 à 17:09:46    

Comme ça
 

Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
    With objShape
        .LockAspectRatio = msoTrue
        If .Width > .Height Then
            .Width = 200
        else
            .Height = 200
        end if
    End With


 
Le With rend en fait le "objShape" implicite quand tu utilises la notation pointée.


Message édité par Ptit loup le 15-10-2008 à 21:42:03
Reply

Marsh Posté le 15-10-2008 à 17:19:36    

ça marche pas, j'ai "erreur... propriété ou méthode non gérée par cet objet"  


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 17:24:07    

apparemment c'est le test qui le chagrine " If .Width > .Eight Then"


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 17:51:25    

bonsoir, mettre un H a eight  c'est: Height

Reply

Marsh Posté le 15-10-2008 à 18:14:19    

lol j'ai trouvé depuis, merci.
 
Par contre, je n'arrive pas à avoir un raport correct hauteur / largeur, du coup j'ai essayé ça :
 
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
Set ratio = (objShape.with / objShape.Height)
    With objShape
         If .Width > .Height Then
            .Width = 405.35
            .Height = 405.35 / ratio
        Else
            .Height = 405.35
            .Width = 405.35 / ratio
                         
        End If
             
    End With

 
Mais à mon avis faut autre chose à la place de "ratio", non ?


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 18:46:52    

pas le temps de tester, mais j'aurais mis  
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter  
Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)  
    ratio = (objShape.width / objShape.Height) <-------width et non with
    With objShape  
         If .Width > .Height Then  
            .Width = 405.35  
            .Height = 405.35 / ratio  
        Else  
            .Height = 405.35  
            .Width = 405.35 * ratio  
                         
        End If  
             
    End With


Message édité par seniorpapou le 15-10-2008 à 20:12:13
Reply

Marsh Posté le 15-10-2008 à 20:36:33    

j'ai un message : erreur de compilation objet requis, en arrivant sur "set ratio"


---------------
Mes Achats/Ventes // Achète Portables à réparer
Reply

Marsh Posté le 15-10-2008 à 21:03:49    

tu remarqueras que j'ai supprimé le SET dans cette ligne là

Reply

Marsh Posté le 15-10-2008 à 21:41:03    

Le pb du rapport hauteur/largeur.... c'est que comme des saloupiauds, vous avez dégagé la ligne qui le conservait ce rapport ! grrr !
=> .LockAspectRatio = msoTrue  
 
Donc aucun intérêt de calculer le ratio et de fixer ET hauteur ET largeur...
On fait le test sur la plus grande longueur... et on fixe cette longueur (qui est souvent la largeur, et parfois la hauteur (enfin, ça dépend du type d'image) à la valeur que l'on veut...
Tout ça comme dans mon code... (avec le H en plus :p) j'ai repris le code rapidos sans en vérifier la syntaxe... sorry.

Reply

Marsh Posté le 15-10-2008 à 21:49:01    

Bonsoir,
j'avais cru comprendre qu'il navait pas réussi à conserver les proportions avec le .LockAspectRatio = msoTrue  
 
Voir son message Posté le 15-10-2008 à 18:14:19  
 

Reply

Marsh Posté le 15-10-2008 à 22:04:24    

ça devait venir de l'erreur d'ortho je suppose...
 
En tout cas, le LockAspectRatio fonctionne très bien, comme indiqué plus haut, je l'ai testé.

Reply

Marsh Posté le 15-10-2008 à 22:15:40    

Je n'avais pas testé, mais je viens de le faire avec ce que tu indiques au "Posté le 15-10-2008 à 17:09:46"  , l'image est déformée. Pourtant cela devrait fonctionner, je suis d'accord avec toi. Bonne nuit.

Reply

Marsh Posté le 15-10-2008 à 22:23:09    

avant de fermer, j'ai trouvé ceci:
 
http://social.msdn.microsoft.com/F [...] 2161e476b/

Reply

Marsh Posté le 15-10-2008 à 22:27:13    

Bon... eh bien j'ai refait le test... et je confirme que pour moi, tout est OK avec cette macro (Word 2007, mais les fonctions utilisées n'ont rien de particulier ni de récent)
J'ai fait le test avec plusieurs répertoires images... en paysage et en portrait... en différents formats, et aucune n'est déformée.
(ensuite, si la valeur indiquée est plus grande que la largeur possible sur la page, j'ai pas fait de tests, mais ça peut jouer)
 

Sub InsertionImages()
 
'Macro qui permet une insertion d'une série d'images d'un répertoire donné,
'Avec une ligne blanche entre chaque image
 
Dim Repertoire As String
Dim Extension As String
Dim Fichier As String
 
'Saisie du nom du répertoire
Repertoire = InputBox("Chemin complet du répertoire (\ à la fin)", "Répertoire", "D:\Mes images" )
'Saisie du type d'extension
Extension = InputBox("Type de fichier (sans le point, ex : jpg, png, bmp)", "Type de fichier", "jpg" )
 
'Récupération du premier fichier du répertoire
Fichier = Dir(Repertoire & "*" & Extension, vbDirectory)
 
Do While Fichier <> ""
    i = i + 1
    'Insertion de l'image
    Set objShape = Selection.InlineShapes.AddPicture(FileName:=Repertoire & Fichier)
    With objShape
        .LockAspectRatio = msoTrue
        If .Width > .Height Then
            .Width = 200
        Else
            .Height = 200
        End If
    End With
    'Insertion d'une ligne vide
    Selection.TypeParagraph
    'Récupération du prochain fichier du répertoire
    Fichier = Dir
Loop
 
End Sub

Reply

Marsh Posté le 15-10-2008 à 22:29:52    

OK pour le lien... ou alors peut être un bug corrigé seulement sur les versions récentes d'Office...
Il reste l'autre solution, de calculer le ratio à la main, et de le reporter sur hauteur et largeur à chaque fois...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed