
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件)
- 最新から表示
- 回答順に表示
No.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
No.1
- 回答日時:
こんにちは
>------------下記のコードが動作致しません-----------
こちらで試したところ動作しています。
変更したセルが偶数行の場合だけ働いて、「同じ行の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以下や行数の最大値より大きな値になるとエラーになりますが、ご提示の場合は「次の行」となるので、実質的にはまったく問題はないと思います。
計算結果(この場合は、Target.Row + 1)が0以下や行数の最大値より大きな値になるとエラーになりますが、ご提示の場合は「次の行」となるので、実質的にはまったく問題はないと思います。
ご指導有難うございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
エクセルvbaで、別シートの最下...
-
特定のセルが空白だったら、そ...
-
VBA実行後に元のセルに戻りたい
-
VBAでセルをクリックする回...
-
Application.Matchで特定行の検索
-
Excelで指定した日付から過去の...
-
エクセルVBAで結合セルの真ん中...
-
Excel VBA、 別ブックの最終行...
-
vb.netによるEXCEL値取得
-
任意フォルダから画像をすべて...
-
VBAのオブジェクトブラウザの見方
-
セルに抜けた番号の代わりに空...
-
VBAでセル同士を比較して色付け
-
i=cells(Rows.Count, 1)とi=cel...
-
VBAコマンドボタンを押すたびに...
-
指定した条件で行セルを非表示...
-
vbsのセル値の取得について
-
特定の文字を条件に行挿入とそ...
-
Excel VBA マクロ ある列の最終...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
Excelで指定した日付から過去の...
-
エクセルvbaで、別シートの最下...
-
特定のセルが空白だったら、そ...
-
VBA実行後に元のセルに戻りたい
-
【Excel VBA】指定行以降をクリ...
-
任意フォルダから画像をすべて...
-
【Excel】指定したセルの名前で...
-
VBAでセルをクリックする回...
-
【VBA】シート上の複数のチェッ...
-
EXCELのVBA-フィルタ抽出後の...
-
Excelのプルダウンで2列分の情...
-
Excel vbaで特定の文字以外が入...
-
TODAY()で設定したセルの日付...
-
”戻り値”が変化したときに、マ...
-
ExcelのVBAで数字と文字列をマ...
-
VBA ユーザーフォーム ボタンク...
-
Excel VBA マクロ ある列の最終...
-
Excel VBA、 別ブックの最終行...
おすすめ情報