プロが教えるわが家の防犯対策術!

エクセルがおかしいです。
ファイルが壊れてるのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

Range("a2") = Empty
Range("a3") = Empty

という、単純なコードなのですが
イベントが発生すると
「メモリ不足です。完全に表示できません。」となったり、
実行時エラー -'-2147417848(80010108)
'_default'メソッドは失敗しました 'range'オブジェクト
となります。

Range("a2") = Empty
の部分で発生します。

そして強制終了され、再起動されます。

コードとしては問題ないですよね?
バージョンは2010です。

「実行時エラー -'-2147417848」の質問画像

A 回答 (2件)

こんにちは。



>実行時エラー -'-2147417848(80010108)
これは、アプリケーション側のエラーのようですね。

>'_default'メソッドは失敗しました 'range'オブジェクト
プログラムのメモリがどんどん上がっていくようです。
私のExcel 2010 では、一度エラーが出た後は、そのワークブックのみが使えなくなる状態でした。

>Range("a2") = Empty
よく、ここが問題だと分かりましたね。
Empty と入力する時点で、再び、「Private Sub Worksheet_Change」に戻ることは確認できましたか?

>コードとしては問題ないですよね?
入門者としては、#1の方のように、Application.EnableEvent のFalse で、再び、戻らないようにして、終わる時に、True にしてあげればよいのです。

もし、余裕があるなら、以下も読んでみてください、強要はしませんが。

ワークシート側には、実際には、Empty値自体は、存在しないのです。
当たり前のような気がしますが、Empty値というのは、Variant 型の変数に、何も入れない状態か、値がある場合は、Empty値を入れるというように考えています。あくまでも、VBAで使われるものだと思っています。

他にも似たようなものに、Null値というものがあります。

数値型なら、0 で、文字型なら、 ""(長さ0の文字列) ですが、今回の場合は、"" と同等なのです。
つまり、Range("A2").ClearContents と同等なのです。

それから、入門レベルを越えたら、正しく、プロパティ Valueを入れたほうがよいです。
Range("A2").Value = ""

'//(以下は、論理的矛盾は無視します)
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
 Range("A2").ClearContents
 Range("A3").ClearContents
Application.EnableEvents = True
End Sub
    • good
    • 0

Range("a2") = Empty


これがまたchangeイベントをトリガして、一種の無限ループに陥っています。
状況に依ってはエクセルが自動復帰する場合もありますが、スタックオーバーフローで停止したりご質問のケースではエラーになります。

Private Sub Worksheet_Change(ByVal Target As Range)
application.enableevents = false
Range("a2") = Empty
Range("a3") = Empty
application.enableevents = true
end sub

などのような手で、再帰的にならないように工夫します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A