[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『特定のセルの値がが変更されたときのマクロ』(ピザ)
特定のセルの値がが変更されたときに処理を実行するマクロを組みましたが、上手く動きません
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
オプションボタンにマクロを登録する方法がありますが、
印刷とかの重い処理を結び付けてしまうのは一長一短あると思います。
人間というのは完全じゃないので、印刷するつもりはなく、単に変更してみただけなんです、
なんていうのは結構ありそうです。
やはり、何か印刷だけを目的としたボタンを別途作ったほうが固い(安全な)気がします。
# 議論に必要な情報として
・オプションボタンがフォームコントロールか、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.