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

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column <> 13 And Target.Column <> 14 Then Exit Sub

If IsDate(Cells(Target.Row, 13).Text) And IsDate(Cells(Target.Row, 14).Text) Then
Application.EnableEvents = False
If Cells(Target.Row, 13).Value >= Cells(Target.Row, 14).Value Then
Cells(Target.Row, 8).Interior.ColorIndex = 3
Cells(Target.Row + 1, 8).Interior.ColorIndex = 3
Else
Cells(Target.Row, 8).Interior.ColorIndex = 1
Cells(Target.Row + 1, 8).Interior.ColorIndex = 1
End If

Else
Cells(Target.Row, 8).Interior.ColorIndex = xlColorIndexNone
Cells(Target.Row + 1, 8).Interior.ColorIndex = xlColorIndexNone

End If
Application.EnableEvents = True

---------------------下記のコードが動作致しません-------------------
If Target.Column <> 17 And Target.Row Mod 2 <> 0 Then Exit Sub
If IsDate(Cells(Target.Row, 17).Text) Then
Cells(Target.Row + 1, 17).Value = Cells(Target.Row, 17).Value
Cells(Target.Row + 1, 17).Font.ColorIndex = 5

Else
Cells(Target.Row + 1, 17).Value = ""
End If


End Sub
Application.EnableEvents = False のやり方が悪いのでしょうか。
また、 Cells(Target.Row + 1, 17)この書き方は問題ないのでしょうか。
教えてくれ方お願いします。

A 回答 (2件)

このコードは、ひとつづきのイベント型のマクロですか?


だったら、下の方は死んでしまっていますね。
> Cells(Target.Row + 1, 17)この書き方は問題ないのでしょうか。
特に問題はありません。

私なりに、コードを直してみました。こういう作り方もあるのだという参考までです。

If Target.Count >1 Then Exit Sub

必要に応じて入れても良いと思います。

'//
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim rw As Long
 rw = Target.Row
 If Target.Column = 13 Or Target.Column = 14 Then
  If IsDate(Cells(rw, 13).Text) And IsDate(Cells(rw, 14).Text) Then
   If Cells(rw, 13).Value >= Cells(rw, 14).Value Then
    Cells(rw, 8).Resize(1).Interior.ColorIndex = 3
   Else
    Cells(rw, 8).Resize(1).Interior.ColorIndex = 1
   End If
  Else
   Cells(rw, 8).Resize(1).Interior.ColorIndex = xlColorIndexNone
  End If

 ElseIf Target.Column = 17 Then '17行目だけに適用する
  If rw Mod 2 = 0 Then
   Application.EnableEvents = False 'なるべくピンポイントで使う
   If IsDate(Cells(rw, 17).Text) Then
    Cells(rw + 1, 17).Value = Cells(rw, 17).Value
    Cells(rw + 1, 17).Font.ColorIndex = 5
   Else
    Cells(rw + 1, 17).Value = "" '.ClearContents のほうが良いかもしれません。
   End If
   Application.EnableEvents = True
  End If
 End If
End Sub
    • good
    • 0

こんにちは




>------------下記のコードが動作致しません-----------
こちらで試したところ動作しています。
変更したセルが偶数行の場合だけ働いて、「同じ行の17列目(=Q列)の値がDate型なら次の行も同じ値として表示色を青に、そうでなければ空白にする」という動作をします。(奇数行を変更しても何もしません)

もっとも、最初に、
>If Target.Column <> 13 And Target.Column <> 14 Then Exit Sub
としているので、条件判定の
>If Target.Column <> 17 の部分は常にTrueになるのでほとんど意味がないですが、動作する/しないには無関係ですね。

・・・ということなので、ご提示の内容以外の何かが影響している可能性があるのかも知れません。


>Application.EnableEvents = False のやり方が悪いのでしょうか。
ご提示のマクロはシート内の値が変わったときに動作するものですが、マクロ内でセルの値を書き換えても同様のイベントが発生してしまいます。
そうすると、このマクロがまた呼び出されて・・・という循環を起こしてしまいますので、処理中のイベントを無効にするために一旦False値にしておいて、処理が終わったところで元に戻すためにTrueを設定するというのが普通の方法です。

ですので、
>Application.EnableEvents = True
の位置があまりよくはない(True値セット後にセル値の変更をする処理があるので)と言えますが、ご提示の処理に限って言えば、13、14列目以外の変更は無視するようになっているので、循環が延々と続いてオーバフローするようなことはなさそうです。
とはいえ、セルの値変更の処理が全て終了してからイベントを元に戻すようにしておく方がよいように思います。
(途中でExit Subしている処理があるので、戻し忘れの無いように注意が必要です。)

> Cells(Target.Row + 1, 17)この書き方は問題ないのでしょうか。
問題ありません。
計算結果(この場合は、Target.Row + 1)が0以下や行数の最大値より大きな値になるとエラーになりますが、ご提示の場合は「次の行」となるので、実質的にはまったく問題はないと思います。
    • good
    • 0
この回答へのお礼

計算結果(この場合は、Target.Row + 1)が0以下や行数の最大値より大きな値になるとエラーになりますが、ご提示の場合は「次の行」となるので、実質的にはまったく問題はないと思います。
ご指導有難うございます。

お礼日時:2017/10/25 16:32

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