[VBA] Inserir qualquer imagem ou intervalo da planilha em um userform (Extra: Inserir um PDF no Userform)

Uma questão frequente que observo nos fóruns em que participo é como inserir uma imagem ou um intervalo da planilha em um userform desenvolvido no VBA.

Já vi alguns métodos para isso, mas quero compartilhar um método que aprendi e achei o mais prático, pois não necessita salvar o intervalo ou objeto como imagem e depois inserir no userform.

Neste método, é desenvolvido uma função chamada “PastPicture” que é responsável por inserir em uma caixa de imagem no userform o que estiver na área de transferência (Clipboard). O código que deve ser colado em um novo módulo é:

Option Explicit

'Requer a referência "OLE Automation"

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

'----------------------------------------------------------------------------
'Windows API Declarações
'----------------------------------------------------------------------------

'Does the clipboard contain a Metafile Picture?
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long

'Open the Clipboard
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long

'Get a handle on the Picture
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long

'Create a copy of the metafile
Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long

'Close the clipboard
Private Declare Function CloseClipboard Lib "user32" () As Long

'Convert the handle into an OLE IPicture interface.
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

Function PastePicture() As IPicture

Const lMETAFILE As Long = 14

Dim lPictureAvailable As Long
Dim lClipHandle As Long
Dim lPicHandle As Long
Dim lCopyHandle As Long
Dim uInterGUID As GUID
Dim uPictureInfo As uPicDesc
Dim lOLEHandle As Long
Dim iTempPicture As IPicture

    'Check if the clipboard contains a picture file
    lPictureAvailable = IsClipboardFormatAvailable(lMETAFILE)

    If lPictureAvailable <> 0 Then

        'Get a Handle on the Clipboard
        lClipHandle = OpenClipboard(0&)

        If lClipHandle > 0 Then

            'Get a Handle on the Picture
             lPicHandle = GetClipboardData(lMETAFILE)

             'Make a local copy, in case the clipboard is changed
             lCopyHandle = CopyEnhMetaFile(lPicHandle, vbNullString)

            'Release Handle from Clipboard
            lClipHandle = CloseClipboard

            'Only Continue if we have a handle on the Picture
            If lPicHandle <> 0 Then

                ' Create the Interface GUID (for the IPicture interface)
                With uInterGUID
                    .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

                ' Fill UPictureInfo with necessary parts.
                With uPictureInfo
                    .Size = Len(uPictureInfo)   ' Length of structure.
                    .Type = 4                   ' Type of Picture = Metafile
                    .hPic = lCopyHandle         ' Handle to image.
                    .hPal = 0                   ' Handle to palette.
                End With

                'Create the IPicture Object
                lOLEHandle = OleCreatePictureIndirect(uPictureInfo, uInterGUID, True, iTempPicture)

                If lOLEHandle = 0 Then
                    Set PastePicture = iTempPicture
                End If
            End If
        End If
    End If
End Function

Para funcionar, é preciso que a referência OLE Automation esteja habilitada. Observe a imagem:

OLE AutomationApós isso, você já está apto para desenvolver o seu Userform, inserindo uma caixa de imagem e aplicando a função ‘PastPicture’ para definir sua imagem (propriedade Picture).

Por exemplo, o código:


Private Sub UserForm_Initialize()
    ThisWorkbook.Worksheets(1).ChartObjects(1).Chart.CopyPicture xlScreen, xlPicture, xlScreen
    Set Me.Image1.Picture = PastePicture
End Sub

Este código vai inserir um gráfico (ChartObjects) na caixa de imagem (Image1) inserida no Userform.

Para deixar a imagem ajustada ao frame da imagem, ajuste a propriedade PictureSizeMode para “3 – fmPictureSizeModeZoom”.

Excelmaniacos - Inserir Imagem Zoom

  • Inserir primeira página de um PDF no Userform

É possível até pensar além e trabalhar com inserção de outros objetos, como por exemplo um arquivo PDF. Para isso, é necessário primeiramente inserir o pdf desejado na planilha como um objeto OLE, copiá-lo, aplicar a função no seu userform e mandar apagar o objeto inserido na planilha. Um exemplo de código para isso seria:

Private Sub UserForm_Initialize()

    'inserir o arquivo pdf como objeto na planilha
    ActiveSheet.OLEObjects.Add(Filename:= _
    "C:\endereço do arquivo\Nome do arquivo.pdf", Link:= _
    False, DisplayAsIcon:=False).Select

    'Copiar a imagem que já fica selecionada automaticamente ao inserí-la
    Selection.Copy

    'Aplicar a função PastPicture
    Set Me.Image1.Picture = PastePicture

    'Apagar o objeto pdf inserido na planilha
    Selection.Delete

End Sub

A primeira página do PDF vai ser inserida como imagem no userform.

Posteriormente postarei uma video aula sobre o assunto e também um arquivo modelo.

Referência: DKenny

Um comentário em “[VBA] Inserir qualquer imagem ou intervalo da planilha em um userform (Extra: Inserir um PDF no Userform)

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Gravatar
Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s