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 !

Rechercher des sujets similaires à "image fond multipage"