アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問です。
以下のマクロを作成しましたが全く動作いたしません。
Application.EnableEvents = False
Application.EnableEvents = Trueの場所が悪いのか
いろいろ調べ、いろいろ実験しましたがうまく行きません。
おしえてくれませんでしょうか

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long

Application.EnableEvents = False
If Target.Column = 8 And Target.Row >= 4 Then

If Target.Row Mod 2 = 0 Then


If IsDate(Target.Text) Then
Cells(Target.Row, 12).Value = Cells(Target.Row, 8).Value + 6
Else
Cells(Target.Row, 12).ClearContents
End If
End If

ElseIf Target.Column = 4 And Target.Row >= 4 Then

If Target.Value = 123 Then

i = Range("A2").End(xlToRight).Column
Range(Cells(Target.Row, 1), Cells(Target.Row, i)).Borders.LineStyle = xlContinuous
End If

End If

ElseIf Target.Column = 8 And Target.Row >= 4 Then

If Target.Row Mod 2 = 1 Then
If IsDate(Target.Text) Then
Cells(Target.Row, 12).Value = Cells(Target.Row, 8).Value + 6
Else
Cells(Target.Row, 12).ClearContents
End If

End If

End If
Application.EnableEvents = True
End Sub

A 回答 (2件)

まず、最初に、こうしたイベント(ドリブン=起動)型マクロの調べ方を教えておきます。


(もしご存知でしたら、ここの部分は読み飛ばしてください。)
VBEditor の左枠の部分をワンクリックすると、●(ブレークポイント)が付きます。

●| Private Sub Worksheet_Change(ByVal Target As Range)

そこで、ワークシートで、該当するセルに入力したりすると、マクロが起動し、●の部分で止まりますので、
F8を押しながら、ステップインでひとつずつ進めていきます。

さて本題です。今回の場合は、

Application.EnableEvents = False
  'ワークシートの値をマクロで変える行に対して挟む'
Application.EnableEvents = True

なので、
------------------------
Application.EnableEvents = False
If IsDate(Target.Text) Then
 Cells(Target.Row, 12).Value = Cells(Target.Row, 8).Value + 6
Else
 Cells(Target.Row, 12).ClearContents
End If
Application.EnableEvents = True
------------------
この部分が最も適していると考えます。

今回のご質問のように、広い範囲を設けても、途中でマクロは抜けてしまいますので、False はTrue には戻りません。

Application.EnableEvents = False
の後に、
Application.EnableEvents = True に戻していないと、次からは、イベント・ドリブンが働きません。

働かなくなると、イミディエイトウィンドウで、
Application.EnableEvents = True
とプロパティを戻してやらなくてはいけません。Excelを再起動しても戻ります。

最近は、掲示板の回答者でも、Application.EnableEvents 自体を入れない風潮のようなものがありますが、それは、Excelのバージョンにもよるのですが、再帰(マクロの最中に、再び、同じマクロを呼び出す)が、古いExcelですと、何万回と呼び出すこともあるので、セルの値の変更に起動するイベントは、是非、Application.EnableEvents を忘れないでください。
    • good
    • 1
この回答へのお礼

お忙しいところありがとうございました。

お礼日時:2017/08/11 12:12

こんばんは!



コードを拝見すると最初の方に
>If Target.Column = 8 And Target.Row >= 4 Then
>If Target.Row Mod 2 = 0 Then

とあり、後半にも
>ElseIf Target.Column = 8 And Target.Row >= 4 Then
>If Target.Row Mod 2 = 1 Then

と同じ処理のコードが重複してますよね?
行番号が奇数、偶数関係なしに同じ処理をすることになると思います。

結局、下のような感じのコトがしたいのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastCol As Long
If Intersect(Target, Range("D:D,H:H")) Is Nothing Or Target.Count > 1 Then Exit Sub
lastCol = Range("A2").End(xlToRight).Column
With Target
If .Row >= 4 Then
If .Column = 8 Then
If IsDate(.Value) Then
Cells(.Row, "L") = .Value + 6
Else
Cells(.Row, "L").ClearContents
End If
Else
If .Value = 123 Then
Range(Cells(.Row, "A"), Cells(.Row, lastCol)).Borders.LineStyle = xlContinuous
End If
End If
End If
End With
End Sub

※ このまま投稿しても字下げができないので
こちらのVBE画面の画像を投稿しておきます。
「If」がどの「End If」までかかっているかが判ると思います。m(_ _)m
「Worksheet_Change(ByV」の回答画像2
    • good
    • 0

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

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


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