電子書籍の厳選無料作品が豊富!

昨日、エクセルVBAで、隣のセルにマクロを実行した日付けを自動入力する方法を質問した者ですが、またまた教えて下さい!

こちらで教えてもらい、昨日の質問は解決したのですが、自動入力した箇所(例えばa1からb1)を消した場合、エラーに、なってしまい、その後マクロが起動しません。
そこでエラーを回避する方法を教えて下さい!
入力してあるコードは
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Then Exit Sub
Application.EnableEvents = False
If Target.Value = "" Then
Target.Offset(0, 1).Value = ""
Else
Target.Offset(0, 1).Value = Date
End If
Application.EnableEvents = True
End Sub
どうか、よろしくお願います!

A 回答 (2件)

おそらくですが、複数のセルを選択してDELETEキーを押されたのではないかと想定します。

記載のマクロだと、複数選択の場合にColumnやRowと言ったRangeプロパティに関するデータの保存方法が変わりますので、参照するプロパティに正常な値が入っていないためのエラーです。
上記を解決するためには
If Target.Column <> 1 Then Exit Sub
の前に
If Selection.Count > 1 Then Exit Sub
を挿入してください。
おそらくいけると思いますが...

また、現在マクロ停止中となっているハズです。そのため以降の処理が一切行われなくなっています。実行タブのリセットを押して処理を停止してください。ツールバーが表示されているなら■ボタンでも構いません
    • good
    • 0
この回答へのお礼

仰る通り、複数選択でデリートしました!教えていただいた構文を入れ、無事解決しました!ありがとうございます!!!

お礼日時:2019/05/21 17:36

こんにちは



No1もご指摘なさっていますが、原因はおそらく複数セルが変更される場合への対応を省いていることでしょうか。

コピペやデリートなどで同時に複数セルの値が変更される可能性はありますので、そのような場合でも対応できるような構造に変えてみました。

元のコードはA列全体に対して動作するようになっていますが、以下(↓)では定数定義で範囲を指定するようにしています。
(ひとまず、A1:A20の範囲に設定してあります)

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim tc As Range, c As Range, v

 Const targetRange = "A1:A20" '←処理対象とするセル範囲

 Set tc = Intersect(Target, Range(targetRange))
 If tc Is Nothing Then Exit Sub
 Application.EnableEvents = False
 For Each c In tc
  If c.Value = "" Then v = "" Else v = Date
  c.Offset(0, 1).Value = v
 Next c
 Application.EnableEvents = True
End Sub


なお、現在はマクロが停止中なだけではなく
>Application.EnableEvents = False
の状態にある可能性が高いです。
(割り込みが発生しない状態なので、マクロが反応しない)
もしも、そのような場合には、一旦、以下のマクロを手動で実行すれば元に戻ると思います。
Sub reset()
Application.EnableEvents = True
End Sub
    • good
    • 0
この回答へのお礼

現状況からの回復方法も詳しく教えていただき、ありがとうございます!
今回のような作業はふつうに行なっている事ですが、その部分にも処理が必要とは知りませんでした、、、、。
とても勉強になりました!ありがとうございます!!

お礼日時:2019/05/21 17:42

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