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:
Apó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”.
- 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
Amigo Otimo trabalho.
Mas onde esta o arquivo para baixarmos e podermos estuda-lo.?
Obrigado !
CurtirCurtir