Bonjour Laurent,
Je ne crois pas que cela soit possible avec une macro.
Généralement, Les images sont stockées dans un répertoire et lorsque l'on
veut afficher une image, on passa la ligne de
commande suivante :
Merci de ta réponse.
Bonjour Laurent,
Je ne crois pas que cela soit possible avec une macro.
Généralement, Les images sont stockées dans un répertoire et lorsque l'on
veut afficher une image, on passa la ligne de
commande suivante :
Merci de ta réponse.
Bonjour Laurent,
Je ne crois pas que cela soit possible avec une macro.
Généralement, Les images sont stockées dans un répertoire et lorsque l'on
veut afficher une image, on passa la ligne de
commande suivante :
Merci de ta réponse.
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture'
du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" a écrit dans le message de
news:
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" <mpierron@europtest.com> a écrit dans le message de
news:uKo58uG9DHA.2752@TK2MSFTNGP09.phx.gbl...
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" <lassass@wanadoo.fr> a écrit dans le message de
news:c0odip$q53$1@news-reader5.wanadoo.fr...
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" a écrit dans le message de
news:
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans
le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" <lassass@wanadoo.fr> a écrit dans
le message de
news:c0odip$q53$1@news-reader5.wanadoo.fr...
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans
le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" a écrit dans le message de
news:
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" <mpierron@europtest.com> a écrit dans le message de
news:uKo58uG9DHA.2752@TK2MSFTNGP09.phx.gbl...
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" <lassass@wanadoo.fr> a écrit dans le message de
news:c0odip$q53$1@news-reader5.wanadoo.fr...
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
Bonjour Michel,
Bravo ! Ta procédure fonctionne très bien.
Je ne vais pas te demander de la commenter ligne par ligne ;-))
mais en la testant, je suis demeurer perplexe.
Voilà j'ai appelé toute la procédure soumise par cette ligne de code :
SaveBmp 1
Je pensais que le 1 était l'index de l'image dans l'appellation du nom de
l'image. Cependant après avoir faire varier le
nom de l'image et de son index, le 1 "semble" représenter plutôt l'index retenu
par excel quant à l'ordre avec lequel
l'objet "image" a été créé sur la feuille
Ma question: Comment fait-on pour pouvoir déceler cet ordre? La feuille de
calcul possède la propriété "CodeName" qui
nous met à l'abri de la modification des noms des onglets de la feuille.
Existe-t-il l'équivalent pour les images créées
dans une feuille de calcul ?
Merci pour ta collaboration. Et encore merci pour cette solution.
Salutations!
"Michel Pierron" a écrit dans le message de
news:
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CopyImage Lib "user32" (ByVal handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal As Long, ByVal
lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA, &H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True, IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " & idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins d'images.
Mon but, c'est de faire en vba une routine qui vient piocher une de ses
images, et le balourde dans un cadre graphique d'un userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin, mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans
le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" <lassass@wanadoo.fr> a écrit dans
le message de
news:c0odip$q53$1@news-reader5.wanadoo.fr...
Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.
-----Message d'origine-----
Bonjour Laurent;
Moyennant quelques API, tu peux sauvegarder sur le
disque, l'image à copier au
format Bmp par l'intermédiaire du pressse-papiers et
ensuite charger ce fichier
dans ton contrôle image avant de détruire la copie de
l'image. Au passage, la
méthode peut être utilisée pour sauvegarder les images
d'une feuille au format
Bmp.
Exemple:
Option Explicit
Private Declare Function IsClipboardFormatAvailable Lib _
"user32" (ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" _
(ByVal wFormat As Integer) As Long
Private Declare Function CloseClipboard Lib "user32" ()
As Long
Private Declare Function OleCreatePictureIndirect
Lib "olepro32.dll" _
(PicDesc As uPicDesc, RefIID As GUID _
, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As
Long
Private Declare Function CopyImage Lib "user32" (ByVal
handle As Long _
, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long _
, ByVal un2 As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type
Private Function PasteBmp() As IPicture
Dim hCopy As Long
If IsClipboardFormatAvailable(2) Then
If OpenClipboard(0&) Then
hCopy = CopyImage(GetClipboardData(2), 0, 0, 0, &H4)
CloseClipboard
If hCopy Then Set PasteBmp = CreateBmp(hCopy, 0, 2)
End If
End If
End Function
' IPicture requires a reference to "OLE Automation"
Private Function CreateBmp(ByVal hPic As Long, ByVal hPal
As Long, ByVal lPicType)
As IPicture
Dim i As Long, PicInfo As uPicDesc, OlePicStore As
GUID, IPic As IPicture
With OlePicStore
.Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A
For i = 1 To 8
.Data4(i - 1) = Choose(i, &H8B, &HBB, &H0, &HAA,
&H0, &H30, &HC, &HAB)
Next i
End With
With PicInfo
.Size = Len(PicInfo)
.Type = 1
.hPic = hPic
.hPal = hPal
End With
If OleCreatePictureIndirect(PicInfo, OlePicStore, True,
IPic) Then
MsgBox "Impossible de créer le bitmap !", 48
End If
Set CreateBmp = IPic
End Function
Sub SaveBmp(Optional idx As Integer = 1)
On Error GoTo Fin
Dim oPic As IPictureDisp, BmpFile As String
ThisWorkbook.Sheets(1).Shapes("Picture " &
idx).CopyPicture xlScreen, xlBitmap
BmpFile = ThisWorkbook.Path & "Temp.bmp"
Set oPic = PasteBmp: SavePicture oPic, BmpFile
UserForm1.Image1.Picture = LoadPicture(BmpFile)
Kill BmpFile: Set oPic = Nothing
Exit Sub
Fin: MsgBox "Image non trouvée !", 48
End Sub
MP
"Laurent Lassasseigne" a écrit dans
le message de
news:c0odip$q53$Bonsoir.
Voilà ce que je veux faire :
Dans une page d'un classeur EXCEL, j'ai copié pleins
d'images.
Mon but, c'est de faire en vba une routine qui vient
piocher une de ses
images, et le balourde dans un cadre graphique d'un
userform. Un
'copier-coller' d'une feuille vers le userform quoi.
J'ai recherché un peu partout, la seule possibilité que
j'ai apparemment,
c'est d'indiquer un chemin pour le graphique dans la
propriété 'Picture' du
cadre du Userform, impossible d'y mettre une référence
du style
activesheet.shapes("Picture 1").
Une autre solution serait de créer autant d'userform
que j'ai d'image, et
d'appeller le userform avec l'image dont j'ai besoin,
mais c'est lourd et
pas pratique pour moi.
Quelqu'un a une idée ?
.