No2です。
このようなパターンでないですか?
DoEventsを入れてある無限ループ中にSheet1を手動で削除してみて下さい。
wsはNothingではありませんが、wsの実体がなくなってしまうと
オートメーションエラーになります。
新規ワークbookで試して下さい。
Sub Sample()
Dim ws As WorkSheet
Set ws = WorkSheets(1) '一番左のワークシートをセット
Do
DoEvents
If Not ws Is Nothing Then 'wsがNothingでないなら
Debug.Print ws.Name 'シートを削除すると、ここでオートメーションエラー
End If
Loop
End Sub
例はワークシートですが、UserFormへの参照や他諸々のオブジェクト変数の実体が
なくなる様な操作またはコーディングをしていませんか?
DoEventsは諸刃の剣と書きましたが、DoEventsをループ毎に読み込むのは逆に
処理速度を下げてしまいます。
Sub Sample2()
Dim i As Long
Dim s As Single
s = Timer
For i = 0 To 300000
DoEvents
Next
MsgBox Timer - s
End Sub
Sub Sample3()
Dim i As Long
Dim s As Single
s = Timer
For i = 0 To 300000
If (i mod 10000) = 0 Then 'iが10000で割り切れる時だけDoEventsを実行
DoEvents
End If
Next
MsgBox Timer - s
End Sub
ループ中にキャンセルを受け入れるのにはDoEventsは必要ですが、使用する回数は
極力少なくするのがいいと思います。(少なくするとキャンセルを受け入れるまで少しもた
つきますが。そこは加減で調整です。)
お礼
ご回答ありがとうございます。その後、色々試してみました。あるシートのセルにある程度まとまったデータを書き込むループがあったので、その中にDoEventsを入れていたのですが、そのループに入る前にScreenUpdatingをFalseにしていました。これをTrueにしたらエラーが出なくなりました。これが直接の原因だったのかはよく判らないのですが、とりあえずこれで進めてみます。色々お教えいただきましてありがとうございました。