CopyPicture method of range class failed - sometimes
charts, copy-paste, excel, vba
Solution
i have found a way to force excel to wait until the clipboard has a picture in it, because sometimes it's too fast:
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'just after copypicture, add this: (in my case i added it inside pastepicture, or i'd have too much coding )
Dim T#
Do
Waiting (2)
Loop Until IsClipboardFormatAvailable(2) Or Timer - T > 0.3
Sub Waiting(ByVal Mili_Seconds&)
Sleep Mili_Seconds
End Sub
Problem
I have a VBA code which I am using to copy ranges as a picture and paste them into a chart. It does this so I can save it into a picture. This code has like a 70% success rate, and when it doesn't work, it gives out the error "CopyPicture method of range class failed". I don't understand why it can sometimes work and sometimes doesn't given that it is taking the same inputs. Can anyone help? ``` Public Sub ExportRange(workbookPath As String, sheetName As String, rangeString As String, savepath As String) Set tempWorkBook = Workbooks.Open(workbookPath) Dim selectRange As range Set selectRange = Worksheets(sheetName).range(rangeString) Dim numRows As Long numRows = selectRange.Rows.Count Dim numCols As Long numCols = selectRange.Columns.Count ' Transfer selection to a new sheet and autofit the columns selectRange.Copy Dim tempSheet As Worksheet Set tempSheet = Sheets.Add tempSheet.range("A1").PasteSpecial xlPasteAll ActiveSheet.UsedRange.Columns.AutoFit Set selectRange = ActiveSheet.UsedRange selectRange.Select selectRange.CopyPicture xlScreen, xlPicture Dim tempSheet2 As Worksheet Set tempSheet2 = Sheets.Add Dim oChtobj As Excel.ChartObject Set oChtobj = tempSheet2.ChartObjects.Add( _ selectRange.Left, selectRange.Top, selectRange.Width, selectRange.Height) Dim oCht As Excel.Chart Set oCht = oChtobj.Chart oCht.Paste oCht.Export filename:=savepath oChtobj.Delete Application.DisplayAlerts = False tempSheet.Delete tempSheet2.Delete tempWorkBook.Close Application.DisplayAlerts = True End Sub ```