범위 클래스의 CopyPicture 메서드에 실패했습니다.
범위를 사진으로 복사하여 차트에 붙여넣기 위해 사용하는 VBA 코드가 있습니다.이렇게 해서 사진으로 저장할 수 있습니다.이 코드는 성공률이 70% 정도로, 작동하지 않을 때 "CopyPicture method of range class failed"라는 오류가 나타납니다.저는 왜 그것이 때때로 작동할 수 있고 때때로 같은 입력을 받고 있다는 것이 주어지지 않는지 이해할 수 없습니다.
누가 도와줄 수 있습니까?
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
클립보드에 그림이 포함될 때까지 Excel을 강제로 기다리는 방법을 찾았습니다. 너무 빠른 경우가 있기 때문입니다.
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
저는 당신과 같은 문제로 어려움을 겪고 있었고 우리의 VBA 코드나 프로그래밍 능력 부족과는 무관하다고 생각합니다.오류는 너무 무작위입니다.
또한 오류 메시지를 받은 후 DEBUG를 클릭하고 단계적으로 코드를 계속 실행하도록 누르면 오류를 건너뛸 수 있었습니다.문제가 발생한 라인 이후에 나는 일반 실행 모드로 계속 진행하기 위해 눌렀습니다.
물론 위 내용은 해결책은 아니지만 제 코딩에 문제가 없음을 밝힙니다.
제가 해봤는데 효과가 있었어요
이 문장 전에
rgToPic.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
이것도 추가했습니다.
rgToPic.Copy 'just for nothing
한 번도 실수한 적이 없어요CopyPicture
메소드 어게인
다른 곳에서 이 문제를 찾다가 일부 사용자가 이 문장을 소개하여 오류를 건너뛸 수 있다는 것을 알게 되었습니다.CopyPicture
방법:
application.CutCopyMode=false
CopyPicture 방법 전에 지연을 추가하는 것이 저에게 유일하게 효과가 있었습니다.입력할 때 더 짧게 조정하고 있지만, 50ms 지연은 정상적으로 작동한 것으로 알고 있습니다.
PtrSafe 하위 슬립 Lib "kernel32" 선언(ValdwMilliseconds의 길이 기준)
'캡처할 범위를 설정합니다.
범위별 DimrgExp:rgExp = 범위 설정("B2:D6")
Sleep (50)' CopyPicture의 런타임 오류를 방지하기 위해 밀리초 단위로 일시 중지합니다. 시스템에서 더 짧은 sleep을 사용할 수 있거나 더 오랜 시간이 필요할 수 있습니다.
' 범위를 그림으로 클립보드에 복사
rgExp.사진 모양 복사:=xl화면, 형식:=xl비트맵
비록 이것은 오래된 게시물이지만, 아마도 이것은 누군가에게 도움이 될 것입니다.저는 오랫동안 비슷한 문제로 힘들어 했습니다.CopyPicture
내장된 PNG 사진이 포함된 범위를 복사할 때 일부 컴퓨터에서 오류가 발생했습니다(다른 컴퓨터보다 더 자주 발생하지만 노트북에서는 복제하기 어렵습니다).은 단지을에서 했습니다.Application.Visible=0
모드,Application.Visible=1
정상적으로 작동했습니다(제 애플리케이션의 경우 엑셀을 보이지 않는 모드로 실행해야 함).으로 CPU때할 수 했습니다.로 CPU 1할 VM때를할 100%수을다게는국서다게을y는수e할i국ne0tinudmna1uh0m1m다음 해결 방법은 이상하지만, 제 문제를 완전히 해결하고 있는 것 같습니다.
는 PNG입니다.Shape
Excel API 용어로 표시됩니다.전화를 하기 전에 모양을 반복적으로 훑어보고(아무것도 하지 않음) 전화를 걸었습니다.CopyPicture
:
# 'rng' is a range that I want CopyPicture on
for shape in rng.Shapes: pass
rng.CopyPicture(xlScreen, xlBitmap)
제 발견은 이 해결책과 유사합니다.CopyPicture
차트와의 범위에서 실패하고 있었습니다.그들의 경우 워크북과 범위를 활성화하는 것이 도움이 되었습니다.
가정해보면, 느린 컴퓨터나 부하가 많은 컴퓨터에서 엑셀은 페이지의 복잡한 객체들을 "게으른 처리", 즉 어떤 방식으로든 객체에 접근할 때까지 그것들을 렌더링하지 않는 것처럼 보입니다.하는 한 을로한은지는은지noens을한로goVisible=1
mode..mode를 입니다. 다른 방법은 객체들을 순환하는 것입니다.런다면fa 버그입니다.CopyPicture
복사하기 전에 복잡한 객체를 렌더링하도록 강요하지 않는 구현.복사 메서드에서 대상 범위에 대한 렌더링이 준비되지 않은 것을 발견하면 범위를 강제로 렌더링하는 대신 오류만 발생합니다.적어도 그건 내 이론입니다.
이에 대한 제 작업은 루프를 하는 동안 오류 잡기에 던져 놓고 오류 메시지 없이 범위를 완전히 복사할 수 있을 때까지 계속 재시도하는 것이었습니다.이제 매력적으로 느껴집니다.
가 있었던 은, 가 사진을 복사하기 전에 를 지우는 이었습니다.Application.CutCopyMode = False
가장 좋은 방법은 필요한 것을 붙여 넣은 후 클립보드를 직접 지우는 것입니다.
Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ xlScreen
그리고.xlPrinter
인에selectRange.CopyPicture
이게 도움이 됐으면 좋겠습니다.
CopyPicture
를 clipboard에 .그러나 Win10은 보안상의 이유로 화면이 잠긴 상태에서 클립보드에 접근하는 것을 금지합니다.따라서 화면을 잠근 상태에서 매크로를 실행하면CopyPicture
메소드가 에러 코드 1004와 함께 실패합니다.
가에도 같은 합니다.Worksheet.Pictures.Paste
.
단순한 ㅇㅇCopy
그리고.PasteSpecial
오류가 발생하지 않습니다.클립보드에 액세스할 수 없는 경우 컨텐츠는 클립보드에 복사되지 않지만 VBA는 이에 대해 불평하지 않습니다.
도,PasteSpecial
사진으로 붙여넣는 옵션이 없습니다.
매크로를 실행하는 동안 컴퓨터의 잠금을 해제한 상태로 두는 것이 간단한 해결 방법입니다.
위의 모든 솔루션이 여전히 문제를 해결하지 못했기 때문에 계속 검색해 보았고 vba에서 TRY/CATCH를 사용하도록 요청한 후 ChatGPT를 통해 다음 코드를 만들 수 있었습니다.
..
Dim retryCount As Integer
retryCount = 0
retry_CopyPicture:
On Error GoTo ErrorHandler
oRng.CopyPicture xlPrinter, xlPicture
GoTo ContinueExecution
ErrorHandler:
retryCount = retryCount + 1
If retryCount <= 10 Then
Application.Wait (Now + TimeValue("0:00:01"))
Resume retry_CopyPicture
Else
MsgBox "Error while trying to copy the picture 10 times. Macro Aborts."
Exit Sub
End If
ContinueExecution:
...
이 접근 방식을 사용하기 때문에 나는 한 번씩 재시도 횟수를 1 또는 2로 셉니다.이제 코드가 완벽하게 작동합니다.
저는 몇 달간 어려움을 겪던 이 문제를 쉽게 해결할 수 있는 방법을 찾았습니다.나는 이것이 "나쁜 코드"라는 것을 알고 있지만, 그것은 나에게 완벽하게 도움이 되고 효과가 있었습니다.내 경우 세부 정보가 복사되고 있지만 디버그 오류 창이 가득 찼습니다.그래서 디버그 창을 그냥 건너뛰었고 제 삶은 더 쉬워졌습니다.
수정은 VBA의 "복사" 코드 앞에 아래 코드를 추가하면 됩니다.이렇게 하면 이 오류가 확실히 해결됩니다.
On Error Resume Next
언급URL : https://stackoverflow.com/questions/24740062/copypicture-method-of-range-class-failed-sometimes
'programing' 카테고리의 다른 글
Enter key without submit 버튼으로 양식을 제출하시겠습니까? (0) | 2023.09.18 |
---|---|
Python의 bz2 모듈은 기본적으로 컴파일되지 않습니다. (0) | 2023.09.18 |
UNION과 LIMIT를 조합하여 사용할 경우 MariaDB의 이상한 동작 (0) | 2023.09.18 |
XML에서 한 줄을 주석으로 달려면 어떻게 해야 합니까? (0) | 2023.09.18 |
요구사항을 사용하는 방법JS와 jQuery가 같이? (0) | 2023.09.18 |