VBA Coller image sur Document issue d'une PictureBox [Résolu]

Signaler
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Salut

Mon appli sous Word VBA doit fabriquer un nouveau Document sur lequel je dois coller un logo.
J'ai aussi une UserForm et j'ai mis une PictyureBox (ou Image) sur ma forme afin de stocker mon image, rendant ainsi "autonome" (sans fichier supplémentaire) mon fichier DOC contenant les macros.

Mon problème, c'est pour faire le copier/coller de la Picture (que renferme ma PictureBox) sur le document.
J'ai bien trouvé comment faire le Coller de la "Selection", mais je ne sais pas comment je peux charger/copier la "Picture" de ma UserForm vers "Selection"

Si qqun a une idée ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

3 réponses

Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour,

je ne suis pas vraiment certain d'avoir tout compris...
Je dirais simplementque si ton contrôlecontenant le logo possède une propriété picture, je te suggèrerais alors l'utilisation des fonction CopyImage et celles de gestion du Clipboard de l'Api de Windows, genre :

Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const CF_BITMAP = 2

toto = CopyImage(Picture1.Picture, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
OpenClipboard Me.hwnd
EmptyClipboard
SetClipboardData CF_BITMAP, toto

puis de "décharger" où tu l'entends ce que tu as dans le press-papier, à l'aide de GetClipboardData

 
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut jmf0 et merci beaucoup, tu as trouvé l'astuce.
En fait, je persistais à vouloir trouver une solution liée au langage alors qu'il faut s'adresser au presse-papier, plutôt qu'à ses saints !

Voici le bout de code que j'utilise avec succès :
Dans mon contexte, j'insère cette image Logo (*) dans une cellule d'un tableau
(*) dimensionnée en StdPicture dans le paramètre de ma fonction

    ' Insertion du logo dans la 1ère cellule
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    ' Charge l'image et fournit son adresse, on lui écrira
    r = CopyImage(Logo, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
    ' Ouvre le presse-papier (= Selection en VBA)
    OpenClipboard ByVal 0&
    ' Nettoyage avant insertion
    EmptyClipboard
    ' Insersion de l'adresse de l'image dans la zone graphique du presse-papier
    SetClipboardData CF_BITMAP, r
    ' Referme le presse-papier
    CloseClipboard
    ' Sélectionne quelque chose dans le Document
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    ' Rappelle l'image et l'insère sur le document
    Selection.Paste

Merci encore
Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Pour nos futurs lecteurs, les fonctions utilisées autour du presse-papier trouvent leurs définitions dans http://logiciel.codes-sources.com/logiciels/API-Guide-197.aspx
et sont (à mettre dans la partie déclaration):

' Déclarations nécessaires à la copie du Logo depuis l'Image de "frmReporter" vers "Selection"
Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const CF_BITMAP = 2
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long, _
                                                 ByVal imageType As Long, _
                                                 ByVal newWidth As Long, _
                                                 ByVal newHeight As Long, _
                                                 ByVal lFlags As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
                                                        ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long