How do I save a bitmap image on clipboard to a .bmp file

parmel

Active Member
Joined
Aug 24, 2005
Messages
324
I would like to copy an image to the clipboard and save it as a .bmp file. Can anyone point me to code that does this?
 

Excel Facts

Copy formula down without changing references
If you have =SUM(F2:F49) in F50; type Alt+' in F51 to copy =SUM(F2:F49) to F51, leaving the formula in edit mode. Change SUM to COUNT.
Paste it into msPaint and save it. Do this by performing your copy, opening paint, choose Edit-Paste or just CTRL-V.
 
Upvote 0
Sorry, I left out one detail. I want to do this entirely in VBA. I'd also prefer not using OLE to open another application.
 
Upvote 0
Minor detail? :)

What is the object you wish to save to file? An inserted image within a worksheet?
 
Upvote 0
What is the object you wish to save to file? An inserted image within a worksheet?

I want to be able to save any image I've copied to the clipboard, not necessarily an inserted image, to a .bmp file .

Will this require the Windows API or is there some VBA approach within Excel itself?
 
Upvote 0
Run SaveClip2Bit. It will save a bitmap to file if there is a bitmap on the clipboard...

<table width="100%" border="1" bgcolor="White" style="filter:progid:DXImageTransform.Microsoft.Gradient(endColorstr='#C0CFE2', startColorstr='#FFFFFF', gradientType='0');"><tr><TD><font size="2" face=Courier New>  <font color="#008000">'***************************************************************************</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* MODULE NAME: Paste Picture</font>
  <font color="#008000">'* AUTHOR & DATE: STEPHEN BULLEN, Office Automation Ltd</font>
  <font color="#008000">'* 15 November 1998</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* CONTACT: Stephen@oaltd.co.uk</font>
  <font color="#008000">'* WEB SITE: http://www.oaltd.co.uk</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* DESCRIPTION: Creates a standard Picture object from whatever is on the clipboard.</font>
  <font color="#008000">'* This object can then be assigned to (for example) and Image control</font>
  <font color="#008000">'* on a userform. The PastePicture function takes an optional argument of</font>
  <font color="#008000">'* the picture type - xlBitmap or xlPicture.</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* The code requires a reference to the "OLE Automation" type library</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* The code in this module has been derived from a number of sources</font>
  <font color="#008000">'* discovered on MSDN.</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* To use it, just copy this module into your project, then you can use:</font>
  <font color="#008000">'* Set Image1.Picture = PastePicture(xlPicture)</font>
  <font color="#008000">'* to paste a picture of whatever is on the clipboard into a standard image control.</font>
  <font color="#008000">'*</font>
  <font color="#008000">'* PROCEDURES:</font>
  <font color="#008000">'* PastePicture The entry point for the routine</font>
  <font color="#008000">'* CreatePicture Private function to convert a bitmap or metafile handle to an OLE reference</font>
  <font color="#008000">'* fnOLEError Get the error text for an OLE error code</font>
  <font color="#008000">'***************************************************************************</font>

  <font color="#0000A0">Option</font> <font color="#0000A0">Explicit</font>
  <font color="#0000A0">Option</font> <font color="#0000A0">Compare</font> <font color="#0000A0">Text</font>

  <font color="#008000">''' User-Defined Types for API Calls</font>

  <font color="#008000">'Declare a UDT to store a GUID for the IPicture OLE Interface</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Type</font> GUID
       Data1 <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
       Data2 <font color="#0000A0">As</font> <font color="#0000A0">Integer</font>
       Data3 <font color="#0000A0">As</font> <font color="#0000A0">Integer</font>
       Data4(0 <font color="#0000A0">To</font> 7) <font color="#0000A0">As</font> <font color="#0000A0">Byte</font>
  <font color="#0000A0">End</font> <font color="#0000A0">Type</font>

  <font color="#008000">'Declare a UDT to store the bitmap information</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Type</font> uPicDesc
       Size <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
       <font color="#0000A0">Type</font> <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
       hPic <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
       hPal <font color="#0000A0">As</font> <font color="#0000A0">Long</font>
  <font color="#0000A0">End</font> <font color="#0000A0">Type</font>

  <font color="#008000">'''Windows API Function Declarations</font>

  <font color="#008000">'Does the clipboard contain a bitmap/metafile?</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> IsClipboardFormatAvailable <font color="#0000A0">Lib</font> "user32" (ByVal wFormat <font color="#0000A0">As</font> Integer) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Open the clipboard to read</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> OpenClipboard <font color="#0000A0">Lib</font> "user32" (ByVal hwnd <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Get a pointer to the bitmap/metafile</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> GetClipboardData <font color="#0000A0">Lib</font> "user32" (ByVal wFormat <font color="#0000A0">As</font> Integer) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Close the clipboard</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CloseClipboard <font color="#0000A0">Lib</font> "user32" () <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Convert the handle into an OLE IPicture interface.</font>
  <font color="#0000A0">Private</font> <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> OleCreatePictureIndirect <font color="#0000A0">Lib</font> "olepro32.dll" (PicDesc <font color="#0000A0">As</font> uPicDesc, RefIID <font color="#0000A0">As</font> GUID, <font color="#0000A0">ByVal</font> fPictureOwnsHandle <font color="#0000A0">As</font> Long, IPic <font color="#0000A0">As</font> IPicture) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Create our own copy of the metafile, so it doesn't get wiped out by subsequent clipboard updates.</font>
  <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CopyEnhMetaFile <font color="#0000A0">Lib</font> "gdi32" <font color="#0000A0">Alias</font> "CopyEnhMetaFileA" (ByVal hemfSrc <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> lpszFile <font color="#0000A0">As</font> String) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Create our own copy of the bitmap, so it doesn't get wiped out by subsequent clipboard updates.</font>
  <font color="#0000A0">Declare</font> <font color="#0000A0">Function</font> CopyImage <font color="#0000A0">Lib</font> "user32" (ByVal handle <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> un1 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> n1 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> n2 <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> un2 <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'The API format types we're interested in</font>
  <font color="#0000A0">Const</font> CF_BITMAP = 2
  <font color="#0000A0">Const</font> CF_PALETTE = 9
  <font color="#0000A0">Const</font> CF_ENHMETAFILE = 14
  <font color="#0000A0">Const</font> IMAGE_BITMAP = 0
  <font color="#0000A0">Const</font> LR_COPYRETURNORG = &H4

  <font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
  <font color="#008000">''' Subroutine: PastePicture</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Purpose: Get a Picture object showing whatever's on the clipboard.</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Arguments: lXlPicType - The type of picture to create. Can be one of:</font>
  <font color="#008000">''' xlPicture to create a metafile (default)</font>
  <font color="#008000">''' xlBitmap to create a bitmap</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Date Developer Action</font>
  <font color="#008000">''' --------------------------------------------------------------------------</font>
  <font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
  <font color="#008000">''' 15 Nov 98 Stephen Bullen Updated to create our own copies of the clipboard images</font>
  <font color="#008000">'''</font>


  
  <font color="#0000A0">Public</font> <font color="#0000A0">Sub</font> SaveClip2Bit()
       <font color="#0000A0">On</font> <font color="#0000A0">Error</font> <font color="#0000A0">Resume</font> <font color="#0000A0">Next</font>
       SavePicture PastePicture, Application.GetSaveAsFilename("MyBitmap.bmp", "Bitmap Files (*.bmp), *.bmp")
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
  


  <font color="#0000A0">Function</font> PastePicture(Optional lXlPicType <font color="#0000A0">As</font> <font color="#0000A0">Long</font> = xlPicture) <font color="#0000A0">As</font> IPicture

  <font color="#008000">'Some pointers</font>
  <font color="#0000A0">Dim</font> h <font color="#0000A0">As</font> Long, hPicAvail <font color="#0000A0">As</font> Long, hPtr <font color="#0000A0">As</font> Long, hPal <font color="#0000A0">As</font> Long, lPicType <font color="#0000A0">As</font> Long, hCopy <font color="#0000A0">As</font> <font color="#0000A0">Long</font>

  <font color="#008000">'Convert the type of picture requested from the xl constant to the API constant</font>
  lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)

  <font color="#008000">'Check if the clipboard contains the required format</font>
  hPicAvail = IsClipboardFormatAvailable(lPicType)

  <font color="#0000A0">If</font> hPicAvail <> 0 <font color="#0000A0">Then</font>
      <font color="#008000"> 'Get access to the clipboard</font>
       h = OpenClipboard(0&)

       <font color="#0000A0">If</font> h > 0 <font color="#0000A0">Then</font>
          <font color="#008000"> 'Get a handle to the image data</font>
           hPtr = GetClipboardData(lPicType)

          <font color="#008000"> 'Create our own copy of the image on the clipboard, in the appropriate format.</font>
           <font color="#0000A0">If</font> lPicType = CF_BITMAP <font color="#0000A0">Then</font>
               hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
           <font color="#0000A0">Else</font>
               hCopy = CopyEnhMetaFile(hPtr, vbNullString)
           <font color="#0000A0">End</font> <font color="#0000A0">If</font>

          <font color="#008000"> 'Release the clipboard to other programs</font>
           h = CloseClipboard

          <font color="#008000"> 'If we got a handle to the image, convert it into a Picture object and return it</font>
           <font color="#0000A0">If</font> hPtr <> 0 <font color="#0000A0">Then</font> <font color="#0000A0">Set</font> PastePicture = CreatePicture(hCopy, 0, lPicType)
       <font color="#0000A0">End</font> <font color="#0000A0">If</font>
  <font color="#0000A0">End</font> <font color="#0000A0">If</font>

  <font color="#0000A0">End</font> <font color="#0000A0">Function</font>


  <font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
  <font color="#008000">''' Subroutine: CreatePicture</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Purpose: Converts a image (and palette) handle into a Picture object.</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Requires a reference to the "OLE Automation" type library</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Arguments: None</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Date Developer Action</font>
  <font color="#008000">''' --------------------------------------------------------------------------</font>
  <font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
  <font color="#008000">'''</font>

  <font color="#0000A0">Private</font> <font color="#0000A0">Function</font> CreatePicture(ByVal hPic <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> hPal <font color="#0000A0">As</font> Long, <font color="#0000A0">ByVal</font> lPicType) <font color="#0000A0">As</font> IPicture

  <font color="#008000">' IPicture requires a reference to "OLE Automation"</font>
  <font color="#0000A0">Dim</font> r <font color="#0000A0">As</font> Long, uPicInfo <font color="#0000A0">As</font> uPicDesc, IID_IDispatch <font color="#0000A0">As</font> GUID, IPic <font color="#0000A0">As</font> IPicture

  <font color="#008000">'OLE Picture types</font>
  <font color="#0000A0">Const</font> PICTYPE_BITMAP = 1
  <font color="#0000A0">Const</font> PICTYPE_ENHMETAFILE = 4

  <font color="#008000">' Create the Interface GUID (for the IPicture interface)</font>
  <font color="#0000A0">With</font> 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
  <font color="#0000A0">End</font> <font color="#0000A0">With</font>

  <font color="#008000">' Fill uPicInfo with necessary parts.</font>
  <font color="#0000A0">With</font> uPicInfo
       .Size = Len(uPicInfo) ' Length of structure.
       .Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE) ' <font color="#0000A0">Type</font> of Picture
       .hPic = hPic ' Handle to image.
       .hPal = IIf(lPicType = CF_BITMAP, hPal, 0) ' Handle to palette (if bitmap).
  <font color="#0000A0">End</font> <font color="#0000A0">With</font>

  <font color="#008000">' Create the Picture object.</font>
  r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)

  <font color="#008000">' If an error occured, show the description</font>
  <font color="#0000A0">If</font> r <> 0 <font color="#0000A0">Then</font> Debug.Print "Create Picture: " & fnOLEError(r)

  <font color="#008000">' Return the new Picture object.</font>
  <font color="#0000A0">Set</font> CreatePicture = IPic

  <font color="#0000A0">End</font> <font color="#0000A0">Function</font>

  <font color="#008000">''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''</font>
  <font color="#008000">''' Subroutine: fnOLEError</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Purpose: Gets the message text for standard OLE errors</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Arguments: None</font>
  <font color="#008000">'''</font>
  <font color="#008000">''' Date Developer Action</font>
  <font color="#008000">''' --------------------------------------------------------------------------</font>
  <font color="#008000">''' 30 Oct 98 Stephen Bullen Created</font>
  <font color="#008000">'''</font>

  <font color="#0000A0">Private</font> <font color="#0000A0">Function</font> fnOLEError(lErrNum <font color="#0000A0">As</font> Long) <font color="#0000A0">As</font> <font color="#0000A0">String</font>

  <font color="#008000">'OLECreatePictureIndirect return values</font>
  <font color="#0000A0">Const</font> E_ABORT = &H80004004
  <font color="#0000A0">Const</font> E_ACCESSDENIED = &H80070005
  <font color="#0000A0">Const</font> E_FAIL = &H80004005
  <font color="#0000A0">Const</font> E_HANDLE = &H80070006
  <font color="#0000A0">Const</font> E_INVALIDARG = &H80070057
  <font color="#0000A0">Const</font> E_NOINTERFACE = &H80004002
  <font color="#0000A0">Const</font> E_NOTIMPL = &H80004001
  <font color="#0000A0">Const</font> E_OUTOFMEMORY = &H8007000E
  <font color="#0000A0">Const</font> E_POINTER = &H80004003
  <font color="#0000A0">Const</font> E_UNEXPECTED = &H8000FFFF
  <font color="#0000A0">Const</font> S_OK = &H0

  <font color="#0000A0">Select</font> <font color="#0000A0">Case</font> lErrNum
  <font color="#0000A0">Case</font> E_ABORT
       fnOLEError = " Aborted"
  <font color="#0000A0">Case</font> E_ACCESSDENIED
       fnOLEError = " <font color="#0000A0">Access</font> Denied"
  <font color="#0000A0">Case</font> E_FAIL
       fnOLEError = " General Failure"
  <font color="#0000A0">Case</font> E_HANDLE
       fnOLEError = " Bad/Missing Handle"
  <font color="#0000A0">Case</font> E_INVALIDARG
       fnOLEError = " Invalid Argument"
  <font color="#0000A0">Case</font> E_NOINTERFACE
       fnOLEError = " No Interface"
  <font color="#0000A0">Case</font> E_NOTIMPL
       fnOLEError = " <font color="#0000A0">Not</font> Implemented"
  <font color="#0000A0">Case</font> E_OUTOFMEMORY
       fnOLEError = " Out of Memory"
  <font color="#0000A0">Case</font> E_POINTER
       fnOLEError = " Invalid Pointer"
  <font color="#0000A0">Case</font> E_UNEXPECTED
       fnOLEError = " Unknown Error"
  <font color="#0000A0">Case</font> S_OK
       fnOLEError = " Success!"
  <font color="#0000A0">End</font> <font color="#0000A0">Select</font>

  <font color="#0000A0">End</font> <font color="#0000A0">Function</font>

</FONT></td></tr></table><button onclick='document.all("592007192210359").value=document.all("592007192210359").value.replace(/<br \/>\s\s/g,"");document.all("592007192210359").value=document.all("592007192210359").value.replace(/<br \/>/g,"");window.clipboardData.setData("Text",document.all("592007192210359").value);'>Copy to Clipboard</BUTTON><textarea style="position:absolute;visibility:hidden" name="592007192210359" wrap="virtual">
'***************************************************************************
'*
'* MODULE NAME: Paste Picture
'* AUTHOR & DATE: STEPHEN BULLEN, Office Automation Ltd
'* 15 November 1998
'*
'* CONTACT: Stephen@oaltd.co.uk
'* WEB SITE: http://www.oaltd.co.uk
'*
'* DESCRIPTION: Creates a standard Picture object from whatever is on the clipboard.
'* This object can then be assigned to (for example) and Image control
'* on a userform. The PastePicture function takes an optional argument of
'* the picture type - xlBitmap or xlPicture.
'*
'* The code requires a reference to the "OLE Automation" type library
'*
'* The code in this module has been derived from a number of sources
'* discovered on MSDN.
'*
'* To use it, just copy this module into your project, then you can use:
'* Set Image1.Picture = PastePicture(xlPicture)
'* to paste a picture of whatever is on the clipboard into a standard image control.
'*
'* PROCEDURES:
'* PastePicture The entry point for the routine
'* CreatePicture Private function to convert a bitmap or metafile handle to an OLE reference
'* fnOLEError Get the error text for an OLE error code
'***************************************************************************

Option Explicit
Option Compare Text

''' User-Defined Types for API Calls

'Declare a UDT to store a GUID for the IPicture OLE Interface
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

'Declare a UDT to store the bitmap information
Private Type uPicDesc
Size As Long
Type As Long
hPic As Long
hPal As Long
End Type

'''Windows API Function Declarations

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

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

'Get a pointer to the bitmap/metafile
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) 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

'Create our own copy of the metafile, so it doesn't get wiped out by subsequent clipboard updates.
Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long

'Create our own copy of the bitmap, so it doesn't get wiped out by subsequent clipboard updates.
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

'The API format types we're interested in
Const CF_BITMAP = 2
Const CF_PALETTE = 9
Const CF_ENHMETAFILE = 14
Const IMAGE_BITMAP = 0
Const LR_COPYRETURNORG = &H4

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: PastePicture
'''
''' Purpose: Get a Picture object showing whatever's on the clipboard.
'''
''' Arguments: lXlPicType - The type of picture to create. Can be one of:
''' xlPicture to create a metafile (default)
''' xlBitmap to create a bitmap
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
''' 15 Nov 98 Stephen Bullen Updated to create our own copies of the clipboard images
'''



Public Sub SaveClip2Bit()
On Error Resume Next
SavePicture PastePicture, Application.GetSaveAsFilename("MyBitmap.bmp", "Bitmap Files (*.bmp), *.bmp")
End Sub


Function PastePicture(Optional lXlPicType As Long = xlPicture) As IPicture

'Some pointers
Dim h As Long, hPicAvail As Long, hPtr As Long, hPal As Long, lPicType As Long, hCopy As Long

'Convert the type of picture requested from the xl constant to the API constant
lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)

'Check if the clipboard contains the required format
hPicAvail = IsClipboardFormatAvailable(lPicType)

If hPicAvail <> 0 Then
'Get access to the clipboard
h = OpenClipboard(0&)

If h > 0 Then
'Get a handle to the image data
hPtr = GetClipboardData(lPicType)

'Create our own copy of the image on the clipboard, in the appropriate format.
If lPicType = CF_BITMAP Then
hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Else
hCopy = CopyEnhMetaFile(hPtr, vbNullString)
End If

'Release the clipboard to other programs
h = CloseClipboard

'If we got a handle to the image, convert it into a Picture object and return it
If hPtr <> 0 Then Set PastePicture = CreatePicture(hCopy, 0, lPicType)
End If
End If

End Function


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: CreatePicture
'''
''' Purpose: Converts a image (and palette) handle into a Picture object.
'''
''' Requires a reference to the "OLE Automation" type library
'''
''' Arguments: None
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
'''

Private Function CreatePicture(ByVal hPic As Long, ByVal hPal As Long, ByVal lPicType) As IPicture

' IPicture requires a reference to "OLE Automation"
Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPicture

'OLE Picture types
Const PICTYPE_BITMAP = 1
Const PICTYPE_ENHMETAFILE = 4

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

' Fill uPicInfo with necessary parts.
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

' Create the Picture object.
r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic)

' If an error occured, show the description
If r <> 0 Then Debug.Print "Create Picture: " & fnOLEError(r)

' Return the new Picture object.
Set CreatePicture = IPic

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Subroutine: fnOLEError
'''
''' Purpose: Gets the message text for standard OLE errors
'''
''' Arguments: None
'''
''' Date Developer Action
''' --------------------------------------------------------------------------
''' 30 Oct 98 Stephen Bullen Created
'''

Private Function fnOLEError(lErrNum As Long) As String

'OLECreatePictureIndirect return values
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
</textarea>
 
Upvote 0
Thanks Right_Click. This is exactly what I need. Sorry for the slow reply - I went on vacation for a few days just as you sent the code.
 
Upvote 0

Forum statistics

Threads
1,214,653
Messages
6,120,750
Members
448,989
Latest member
mariah3

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top