質問
2021年2月19日金曜日 2:13
VBAコードについて質問です。 シートモジュールに以下のコードが入力されていますがエラーになります。 どう直せばいいかどなたか教えて下さい。 エラー内容は 実行時エラー'1004' 'Range'メゾットは失敗しました。'Worksheet' オブジェクト Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) '変数を使う場合は変数の定義を忘れずに If Intersect(Target, Range("B1")) Is Nothing Then '変更されたセルがB1セルの場合 If Range("A1").Value <= Range("B1").Value Then 'B1セルの値がA1セルの値以上になる場合 Range("C1") = Now ThisWorkbook.Save Else 'B1セルの値がA1セルの値以上でない場合 ';何もしない End If Else '変更されたセルがB1セルでない場合 ';何もしない End If End Sub
すべての返信 (3)
2021年2月19日金曜日 6:38 ✅回答済み
Sakura0515さん、こんにちは。
残念ながら、別のエラーコードのエラーは発生したものの、1004のエラーは発生しませんでしたので、何をしたら1004のエラーになるのか分かりませんが、やりたいことは、提示されているコードが別スレッドのSakura0515さんのご質問内容に対する小生の返事のアウトラインにコードが記入されたものであるので、そのご質問内容と同じであるという理解でご返事します。
まず、Intersect についてよく調べて理解して修正する必要があります。ご呈示のコードでは、B1セル以外のセルの値が変化したときにイベント処理が実行されます。やりたいことと真逆です。このため、C1セルへの記入などでもイベント処理が実行されるため、スタックがオーバーしてしまいます。「Intersect(~)」は「Not Intersect(~)」と修正する必要があります。
次に、「Range("C1") = Now」は全く動かないわけではないけれど「Range("C1").Value = Now」とすべきです。その行の前には、念のため、イベント処理を無効にするコマンド、後ろには、イベント処理を有効に戻すコマンドを記入しておくと、無駄な処理をさせなくて済むのでよいのではないかと思います。
また、「Range("B1")」等の「Range()」についても、「Me.Rnage()」という具合に、どのシートのRange()なのか特定するようにしたらよいと思います。ご質問のタイトルからすると、ここら辺が1004エラーの原因かもしれません。
今は、ネット上にいろいろ情報がアップされていますので、これかな?、あれかな?、という知りたいことを検索すると出ていますし、入門サイトもありますので、そちらを参考にして作り上げるとよろしいかと存じます。
2021年2月19日金曜日 7:33
'Range'メゾットは失敗しました。
メゾット (mezot) ではなく
メソッド (method) ですね。
どう直せばいいかどなたか教えて下さい。
C1 セルに現在日時をセットした段階で、再度 Worksheet_Change が発生することになります。
そのため、無限に呼び出しが繰り返されてしまい、実行制限を超過してエラーとなっています。
イベントの再入を防ぐため、セル値を書き換える際に、EnableEvents プロパティをオフにしてみてください。
Dim bEnableEvents As Boolean
bEnableEvents = Application.EnableEvents
Application.EnableEvents = False
Range("C1").Value = Now
Application.EnableEvents = bEnableEvents
2021年2月19日金曜日 12:00
返信ありがとうございます。
現在マクロ勉強中につきご提示ありがとうございます。
色々ネットで調べてみます。