Image de fond multipage
Bonjour à vous,
J'ai une question concernant la gestion des images de fonds d'un multipage dans un usf.
Je sais mettre une image de fond en allant la chercher dans un fichier présent sur l'ordinateur avec la propriété picture, néanmoins est il possible plutôt que d'indiquer un chemin d'accès pour récupérer celle-ci, de prendre une image déjà présente sur mon fichier excel ? (sans contourner le problème avec shape)
D'avance merci,
Belle journée à tous !
Pour être plus précis remplacer "C: ..." par une image présent sur le fichier excel
UserForm1
.MultiPage1.Pages(0).Picture = LoadPicture("C:...jpg")
J'ai fini par trouver la solution et je n'ai pas le choix de passer par shapes
C'est la solution de Stephen Bullen, coller dans un module :
Option Compare Text
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 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
Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
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
Const CF_BITMAP = 2
Const CF_PALETTE = 9
Const CF_ENHMETAFILE = 14
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = &H4
' 30 Oct 98 Stephen Bullen Created
Function PastePicture(Optional lXlPicType As Long = xlPicture) As IPicture
Dim h As Long, hPicAvail As Long, hPtr As Long, hPal As Long, lPicType As Long, hCopy As Long
lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)
hPicAvail = IsClipboardFormatAvailable(lPicType)
If hPicAvail <> 0 Then
h = OpenClipboard(0&)
If h > 0 Then
hPtr = GetClipboardData(lPicType)
If lPicType = CF_BITMAP Then
hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Else
hCopy = CopyEnhMetaFile(hPtr, vbNullString)
End If
h = CloseClipboard
If hPtr <> 0 Then Set PastePicture = CreatePicture(hCopy, 0, lPicType)
End If
End If
End Function
' 30 Oct 98 Stephen Bullen Created
Private Function CreatePicture(ByVal hPic As Long, ByVal hPal As Long, ByVal lPicType) As IPicture
Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPicture
Const PICTYPE_BITMAP = 1
Const PICTYPE_ENHMETAFILE = 4
With IID_IDispatch
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
With uPicInfo
.Size = Len(uPicInfo) ' Length of structure.
.Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE) ' Type of Picture
.hPic = hPic ' Handle to image.
.hPal = IIf(lPicType = CF_BITMAP, hPal, 0) ' Handle to palette (if bitmap).
End With
r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)
If r <> 0 Then Debug.Print "Create Picture: " & fnOLEError(r)
Set CreatePicture = IPic
End Function
' 30 Oct 98 Stephen Bullen Created
Private Function fnOLEError(lErrNum As Long) As String
Const E_ABORT = &H80004004
Const E_ACCESSDENIED = &H80070005
Const E_FAIL = &H80004005
Const E_HANDLE = &H80070006
Const E_INVALIDARG = &H80070057
Const E_NOINTERFACE = &H80004002
Const E_NOTIMPL = &H80004001
Const E_OUTOFMEMORY = &H8007000E
Const E_POINTER = &H80004003
Const E_UNEXPECTED = &H8000FFFF
Const S_OK = &H0
Select Case lErrNum
Case E_ABORT
fnOLEError = " Aborted"
Case E_ACCESSDENIED
fnOLEError = " Access Denied"
Case E_FAIL
fnOLEError = " General Failure"
Case E_HANDLE
fnOLEError = " Bad/Missing Handle"
Case E_INVALIDARG
fnOLEError = " Invalid Argument"
Case E_NOINTERFACE
fnOLEError = " No Interface"
Case E_NOTIMPL
fnOLEError = " Not Implemented"
Case E_OUTOFMEMORY
fnOLEError = " Out of Memory"
Case E_POINTER
fnOLEError = " Invalid Pointer"
Case E_UNEXPECTED
fnOLEError = " Unknown Error"
Case S_OK
fnOLEError = " Success!"
End Select
End Function
Puis utiliser la fonction :
Private Sub UserForm_Initialize()
ActiveWorkbook.Sheets("Image").Shapes("Image 2").CopyPicture xlScreen, xlPicture
Set Image2.Picture = PastePicture(xlPicture)
End Sub
Néanmoins comment puis je mettre l'image en arrière plan ? Car du coup c'est en premier plan et cache les txtbox
Bonjour,
Juste pour vous dire bonne chance
Quand on veut faire une usine à gaz et bien il faut savoir se débrouiller tout seul bien souvent
Bonjour Bruno et merci de ton retour,
Justement j'aimerais éviter de faire une machine à gaz ...
J'aurais juste aimé éviter d'alourdir mon fichier en mettant des images en arrière plan sur chaque page de mon multipage. Je me suis donc dit que mettre une seule image sur mon fichier excel puis de l'appeler serait plus ergonomique mais effectivement cela semble beaucoup plus complexe que ce que je pensais ...
Si j'ai bien compris il n'est pas possible d'appeler une image (shapes) avec loadpicture() qui doit obligatoirement contenir un chemin d'accès, ce que j'aimerais éviter.
Une idée ?
Bonjour,
Une image de bonne qualité ± 70 ko maximum Il faudrait déjà avoir un sacré multipage pour encombrer ton classeur.
Fait l'économie de quelques formats inutiles et tu auras regagné ça rapidement.
Après il reste à vérifier l'intéret d'avoir un multipage avec une image de fond ! mébon...
A+
Bonjour Galopin,
Je pense que tu as raison je me prends la tête pour pas grand chose et je vais intégrer les images et je verrais bien si cela alourdi réellement le fichier ou non.
C'est pour le côté esthétique que je veux faire cela, je trouve ça plus agréable qu'un usf gris
Belle journée à vous
Utilise Photoshop ou PowerPoint !