LoginSignup
5
2

図として貼り付けで「時々」起こる実行時エラー(1004)に負けない

Last updated at Posted at 2023-10-29

やりたかったこと

  1. マクロファイルAのセルをコピーして、マクロファイルBに図として貼り付け
  2. マクロファイルAのシートをコピーして新規ブックを作成し、シート中のグラフ(参照先:マクロファイルAの別シート)を図に変換
1.のコードの抜粋
    'マクロファイルAのセルのコピー
    rngMacroFileA.Copy
    'マクロファイルBのシートをアクティベート
    sheetMacroFileB.Activate
    '図として貼り付け
    sheetMacroFileB.Pictures.Paste.Select
2.のコードの抜粋
    'グラフを画像としてコピー
    objChart.CopyPicture
    'ペースト
    sheetMacroFileB.Paste

問題

必ずではないが、実行時エラー(1004)が発生する。
VBEが開きデバッグモードになるが、再開すると処理が正常に行われる。
image.png

調査

下記のサイトを参考にした。

どうも、クリップボードを介した処理は不安定であるらしい。。。

暫定対応

  • DoEvents関数でOSに処理を渡してみる
  • Sleep関数でPasteを待ってみる
  • 失敗したら3回までリトライするようにエラーハンドリングする
1.のコードの改良版の抜粋 ※2.のコードも同じ改良を施した
'Sleep関数の準備
#If VBA7 Then
  'For 64 Bit Systems
  Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
  'For 32 Bit Systems
  Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub XXX()

(中略)

    'エラー回数を初期化
    Dim intErrCnt As Integer
    intErrCnt = 0
      
    On Error GoTo ERROR_HANDLE
    
    'マクロファイルAのセルのコピー
    rngMacroFileA.Copy
    'マクロファイルBのシートをアクティベート
    sheetMacroFileB.Activate

    '★実行時エラー(1004)対応:OSに処理を渡す&Pasteを待ってみる
    DoEvents
    Sleep (100)
    
    '図として貼り付け
    sheetMacroFileB.Pictures.Paste.Select
    
    On Error GoTo 0

(中略)

    Exit Sub

ERROR_HANDLE:
    '★実行時エラー(1004)対応:エラー3回まではリトライする
    intErrCnt = intErrCnt + 1
    If intErrCnt <= 3 Then Resume
    
    '更新中のマクロファイルBを保存せずに閉じる
    sheetMacroFileB.Parent.Close SaveChanges:=False
    
    MsgBox "処理に失敗しました。" & vbCrLf & _
    "XXXボタンを押下し、再度実行してください。"
    
    End

End Sub

結果

処理を3回までリトライするようにしたことで、
実行時エラー(1004)が表示されることは今のところない。
暫くはこれで様子見するか。。。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2