[[20230414124505]] 『特定のセルの値がが変更されたときのマクロ』(ピザ) ページの最後に飛ぶ

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

 

『特定のセルの値がが変更されたときのマクロ』(ピザ)

特定のセルの値がが変更されたときに処理を実行するマクロを組みましたが、上手く動きません

S13のセルの中身が変更されたら
メッセージボックスを表示
また、
S15こセルの中身が変更されたら
印刷という名前のマクロを実行したいのです。

参照されるS13とS15のセルの中身は、
計算式が入っており、いずれも数値です。
ためしに、日本語で文字を入れてエンターを
押したらマクロが動いたのですが、
計算式が入っていたり、一回セルをエンターで
確定させないかぎり動かないのでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Intersect(Target, Range("S13")) Is Nothing Then
        Exit Sub
    Else
        MsgBox "セルの値が変更されました"
    End If

If Intersect(Target, Range("S15")) Is Nothing Then

        Exit Sub
    Else
        Call 印刷
    End If
End Sub

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


 Change=セルの値が変更
 のいみですが、計算式で値が変わることを指しているわけではなく
 文字通り手入力やコピペで変更された場合を指します。

(稲葉) 2023/04/14(金) 12:55:21


 S13セルとS15セルの式が参照しているセルが変更されたかでチェックしてみては?
(ねむねむ) 2023/04/14(金) 13:03:32

 Worksheet_Calculateイベントとか...

    Private Sub Worksheet_Calculate()
        Static S13Value, S15Value

        Debug.Print Now; "[S13] ";
        If S13Value <> Me.[S13].Value Then
            Debug.Print S13Value; "=>";
            S13Value = Me.[S13].Value
            Debug.Print S13Value;
        End If
        Debug.Print

        Debug.Print Now; "[S15] ";
        If S15Value <> Me.[S15].Value Then
            Debug.Print S15Value; "=>";
            S15Value = Me.[S15].Value
            Debug.Print S15Value;
        End If
        Debug.Print

    End Sub

(白茶) 2023/04/14(金) 13:23:23


計算式の元を参照しても動きませんでした。
代替方法もないでしょうか泣

白茶さんのもシートのマクロに書いてみました
ありがとうございます
でもうまくいきませんでした泣

(ピザ) 2023/04/14(金) 13:29:57


 式で参照しているセルは同じシート内なのだろうか?
 もし別シートであればその別シートにマクロを作成することになる。
 (ThisWorkbookのWorkbook_SheetChangeイベントという手もあるが)
(ねむねむ) 2023/04/14(金) 13:38:55

ねむねむさん

参照は同じシートです
(ピザ) 2023/04/14(金) 13:44:49


 式ではどのセルを参照していて、どのようなVBAにしたのだろうか?
(ねむねむ) 2023/04/14(金) 14:02:15

ねむさん
実はオプションボタン(ラジオボタン)を
切り替えるたびに、それぞれマクロを実行したく。

でもうまくいかなかったので、ねむさんが最初おっしゃってましたが、
オプションボタンの「リンクするセル」で設定したセルを参照元に
かえてみましたが、できません。

(ピザ) 2023/04/14(金) 14:07:34


 説明と違う実例出されても、こちらが提示した方法では無理ですねとしか。
(ねむねむ) 2023/04/14(金) 14:15:24

 すまない、言い過ぎだった。
 この場合は説明不足か。
(ねむねむ) 2023/04/14(金) 14:26:53

既に話が進んでいる部分もありますが何点か。

■1
[Changeイベント]について、ちゃんと調べてみましょう。
そうすれば、値の書き換えが発動条件であると理解できるはずです。
すなわち、どこかのセルに入力した結果、数式の結果が変わったとしても、そのS13セルやS15セルの値が【書き変わった】わけではありませんから[Changeイベント]は発動しません。

■2
ステップ実行すれば容易に気づけると思いますが↓の問題があります

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, Range("S13")) Is Nothing Then
            Exit Sub 'Targetに【S15セルが含まれていても】、【S13が含まれていない】ならばここで終了します。
        Else
            MsgBox "セルの値が変更されました"
        End If

        If Intersect(Target, Range("S15")) Is Nothing Then
                Exit Sub
            Else
                Call 印刷
            End If
    End Sub

なので、Changeで対処できるものだとしても↓のようにすべきでしょう。

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("S13")) Is Nothing Then
            MsgBox "セルの値が変更されました"
        End If

        If Not Intersect(Target, Range("S15")) Is Nothing Then
            Call 印刷
        End If
    End Sub

■3
>実はオプションボタン(ラジオボタン)を切り替えるたびに、それぞれマクロを実行したく
ならば、オプションボタンのイベントをつかえばいいでしょう。(ActiveXコントロールの場合)

(もこな2) 2023/04/14(金) 14:46:41


 >でもうまくいきませんでした泣

 ええっと... ^^;

 念の為ですが、私のお示ししたコードは
 考え方の一例を書いただけのものですからね。

 何かを実行してくれる内容ではありませんので、
 そのまま書き写しただけでは当然何もしてくれませんよ。

 (うまくいく⇔いかない だけのお返事が返ってくるとは思ってなかったので一応)

(白茶) 2023/04/14(金) 14:51:43


オプションボタンのクリックによる「リンクされたセル」の変化は
Changeイベントプロシージャのトリガーになりませんね。

オプションボタンにマクロを登録する方法がありますが、
印刷とかの重い処理を結び付けてしまうのは一長一短あると思います。

人間というのは完全じゃないので、印刷するつもりはなく、単に変更してみただけなんです、
なんていうのは結構ありそうです。
やはり、何か印刷だけを目的としたボタンを別途作ったほうが固い(安全な)気がします。

# 議論に必要な情報として
・オプションボタンがフォームコントロールか、ActiveXコントロールなのか
・オプションボタンの個数はどの程度か
があると思います。
(xyz) 2023/04/14(金) 15:22:51


よく読んだら、計算式の入った式の内容変更の話と
オプションボタンのクリックによる話が混在していますね。
整理してもらえませんか?
そして話を途中で変えないようにしてください。

(xyz) 2023/04/14(金) 16:01:42


 >計算式の元を参照しても動きませんでした

 それは、どこのセルかは存じませんので仮に

 ・S13セル の参照元が D13セル
 ・S15セル の参照元が D15セル

 とした場合に、

 ・D13セル の値が変更なら処理1:実行
 ・D15セル の値が変更なら処理2:実行

 させるって事でどうなんでしょうか?

 Private Sub Worksheet_Change(ByVal Target As Range)

    Dim r As Range, v As String
    Set r = Range("D13,D15")
    v = Target.Address(False, False)
    If Intersect(Target, r) Is Nothing Then Exit Sub
    If Target.Count > 1 Then Exit Sub

    Application.EnableEvents = False
    Range("A1").Select
    If v = "D13" Then
        '' S13セルの参照元数値が、D13セルで変更の場合
        MsgBox "処理1:実行"
    Else
        '' S15セルの参照元数値が、D15セルで変更の場合
        MsgBox "処理2:実行"
    End If
    Application.EnableEvents = True

 End Sub

 ※尚、オプションボタンが、どれか?の回答もしてください。
(あみな) 2023/04/15(土) 19:46:00

コメント返信:

[ 一覧(最新更新順) ]


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