• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAマクロ 実行時エラーが出たり出なかったり)

VBAマクロ 実行時エラーが出たり出なかったり

このQ&Aのポイント
  • VBAマクロを実行する際に、実行時エラーが出たり出なかったりする問題が発生しています。
  • 実行時エラー '1004'というエラーが実行時にランダムに出現し、RangeクラスのPasteSpecialメソッドが失敗していることが原因です。
  • 問題の範囲内での数式処理を行う際に、ファイルを開いてコピーし、その後閉じる処理を行っています。この処理の間に待ち時間を挿入することでエラーが発生しにくくなるかもしれません。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 原因とその解決策を教えて頂きたいと思います。 遅すぎたかもしれませんが(汗)、自分の知っている範囲で・・・ (自分は専らAccess VBAばかり扱っているので) 【原因】 PasteSpecialを実行する前に、その参照元となるブックが 閉じられたことにより、その前に行った「Select」による選択が 無効化してしまっています。 (エラーにならないことがあるのは・・・別のブックが「Active  Workbook」と判断されて閉じられていたりしないでしょうか(汗)) 【解決策】 PasteSpecialを実行する前の「ActiveWindow.Close」を やめて、PasteSpecialの実行後に、コピー元のブックを 閉じるようにします。 このとき、閉じる対象を確実に「コピー元のブック」とするために、 コピー元を開く際の「Workbooks.Open」の戻り値を、変数に 記録しておき、これを使用してブックを閉じます。 【コード】 'コピー元を記録するための変数を宣言 Dim Wkb As Workbook, Rng As Range '変数「Wkb」に、コピー元を記録 '(Workbookなどの「オブジェクト」と総称されるものに値を記録する ' 場合は、先頭に「Set 」をつける必要があります。また、その際は、 ' Openメソッドの引数(ここではファイルパス)は「( )」で囲みます) Set Wkb = Workbooks.Open(Filename:=ActiveWorkbook.Path & "\" & ActiveCell.Offset(i, 0).Range("A1").Value) '先頭に「Wkb.」をつけて、同ブックの「E1~E500000」であることを '明示して変数に格納した後、コピー '(ここではSelectは省略した方が効率的です) Set Rng = Wkb.Range("E1:E500000") Rng.Copy 'できればここも「myfile」用の変数を別に用意して、上と同様に '対象を明示するとともに、Selectは省略した方がよいかと思います。 Workbooks(myfile).Activate If j = 1 Then  Range("G3").Select  Selection.PasteSpecial ElseIf j = 2 Then  Range("H3").Select  Selection.PasteSpecial ElseIf j = 3 Then  Range("I3").Select  Selection.PasteSpecial ElseIf j = 4 Then  Range("J3").Select  Selection.PasteSpecial End If 'コピー用の選択状態を解除 '(これにより、「クリップボードに~」のメッセージが表示されなくなる ' ので、DisplayAlertsの切り替えが不要になります) Application.CutCopyMode = False 'コピー元を閉じる Wkb.Close '念のため、明示的に変数を初期化してメモリを解放 Set Rng = Nothing Set Wkb = Nothing ・・・以上です。

ageedaa
質問者

お礼

ご丁寧にどうも有難う御座いました。 お礼が遅くなってしまって申し訳ありませんでした。 エラーはまだ出てしまうので、他にも原因がありそうですがその頻度は確実に下がりました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.1

件数が非常に多いので気になりますが このようにすれば比較的非力なPCでも高速に処理しますので大丈夫ではないかと思います。 if j = 1 Then sheets("Sheet1").Range("E1:E500000").Copy sheets("Sheet2").Range("G3") DoEvents:doevents:doevents

ageedaa
質問者

お礼

回答有難う御座います。 提示してくださったように、DoEventsを挟むような処理も試してみましたが、やはりエラーは出てしまうようです。。

すると、全ての回答が全文表示されます。