[[20200513102529]] 『ワークシートのChangeイベントについて』(ざがいも) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ワークシートのChangeイベントについて』(ざがいも)

ワークシートのChangeイベントについて質問です。

特定のセルの値が変更された時にマクロを起動する
Worksheet_Changeのイベントは、関数で計算された値の変更には対応できないのでしょうか?

先日、こちらの掲示板にてご指南頂きました以下のコード、

Sub Worksheet_Change(ByVal Target As Range)
Dim iR As Long
Application.EnableEvents = False
If Target.Address = "$A$1" Then
iR = Application.Max(Range("A" & Rows.Count).End(xlUp).Row + 1, 3)
Range("A" & iR).Value = Target.Value
End If
Application.EnableEvents = True
End Sub

A1セルに文字が入力されるとA3セル以下の行にA1で入力された値をコピー
していくものなのですが、今回、A1のセルに次の関数を入れました。
=ABS(B1-B2)
B1とB2に入力された数字を引き算した絶対値がA1セルに反映されるのですが、
この場合だと、A1セルの数値が変化しても上記のマクロが実行されませんでした。

A1セルに値を直接入力するとマクロはきちんと実行されるので
関数を用いた値の変化には対応できないのでしょうか・・・?

宜しくお願い致します。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 どのタイミングでマクロを実行するのでしょうか。
 B1 の値が変更されたとき?
 B2 の値が変更されたとき?
 B1 または B2 のどちらかが変更されたとき?

(tora) 2020/05/13(水) 11:16


 それとも B1 または B2 にも関数が入っている?

(tora) 2020/05/13(水) 11:22


>Worksheet_Changeのイベントは、関数で計算された値の変更には対応できないのでしょうか?
はい。そのとおりです。

関数で計算されて"見た目"の数字が変わるのは、再計算の結果であって、
値(数式)が書き換えられたものではないからです。

すでに、toraさんが確認されてますが、どのような数式になってますか?

(もこな2 ) 2020/05/13(水) 11:46


失礼。
>今回、A1のセルに次の関数を入れました。
>=ABS(B1-B2)
と、書いてありましたね。

その場合、たとえば、B1あるいはB2セルの値が"直接"変更されたときにchangeイベントを使いたいなら、こんな感じでしょうか。

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Range("B1:B2"),Target) Is Nothing Then
            Application.EnableEvents = False
            Cells(Application.Max(Range("A" & Rows.Count).End(xlUp).Row + 1, 3), "A").Value = Range("A1")
            Application.EnableEvents = True
        End If
    End Sub

(もこな2 ) 2020/05/13(水) 12:03


 別案です。条件にそわないかもしれませんが、Calculateイベントを捉えたものです。

 Private Sub Worksheet_Calculate()
    Dim iR As Long
    Static VAL_A1
    If VAL_A1 <> Range("A1").Value Then
        VAL_A1 = Range("A1").Value
        iR = Application.Max(Range("A" & Rows.Count).End(xlUp).Row + 1, 3)
        Range("A" & iR).Value = VAL_A1
    End If
 End Sub
(助六) 2020/05/13(水) 13:20

 もう一つ別案です。A1セルの参照先の変更を捉えたものです。

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim iR As Long
    Application.EnableEvents = False
    If Not Intersect(Range("A1").Precedents, Target) Is Nothing Then
        iR = Application.Max(Range("A" & Rows.Count).End(xlUp).Row + 1, 3)
        Range("A" & iR).Value = Range("A1")
    End If
    Application.EnableEvents = True
 End Sub
(助六) 2020/05/13(水) 13:39

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.