- ベストアンサー
ワークシート上のセルの値を変更したらVBAを実行させる。
Excelでシートの任意の箇所(FORM)を変更したらVBAを走らせたいのですがやり方がわかりません。 シート上の任意の箇所に「FORM」という名前をつけました。 その中でセルの値を変更したらVBAを走らせるために、以下のテストを作成しました。 ですが、入力したセルの値は消えて、さらに無限ループのようにいくつも値をみて、メッセージボックスも複数表示されます。 実際は無限ループではないので、フリーズはせずかえってくるのですが。 どのように変更したらいいのでしょうか? Private Sub Worksheet_Change(ByVal TARGET As Range) TARGET = Range("FORM") MsgBox Range("条件1") End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 こんな感じ? Private Sub Worksheet_Change(ByVal Target As Range) Dim rg As Range Set rg = Intersect(Range("FORM"), Target) If Not rg Is Nothing Then MsgBox "FORM内のセルが変更されました。" End If Set rg = Nothing End Sub
その他の回答 (4)
- maruru01
- ベストアンサー率51% (1179/2272)
再びNo.2です。 >動作したいシートが選ばれています。 選ばれているとかじゃなくって、そのシートのモジュールに記述してますか?と聞いているんです。 >その右のウィンドウの上では「Worksheet」と「Change」が選ばれている状態です。 そこは、この場合はどうでもいいです。 とにかく、該当のシートモジュールに、私のNo.2の回答欄のプロシージャ、 Private Sub Worksheet_Change(ByVal Target As Range) ・・・ ・・・ End Sub が記述してありますか? さらに、同じシートモジュール内に、 Private Sub Worksheet_Change(ByVal Target As Range) が他にありませんか? (あったら削除) それを確認した上で、そのシートのFORMの範囲内のセルの値を変更してみて下さい。
お礼
回答ありがとうございます。 >>動作したいシートが選ばれています。 >選ばれているとかじゃなくって、そのシートのモジュールに記述してますか?と聞いているんです。 すいません、言い方が悪かったですね。 そのシートにモジュールを書いています、という意味合いで選ばれています、と書きました。 どうしてもできなかったので、新規ブックを作成後やったらできました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
根本的におかしいのでは。 Private Sub Worksheet_Change(ByVal TARGET As Range) この TARGET はシステムがこのモジュールに飛んできたときに、背負ってやってくる大切なRange=範囲の情報です。 それを TARGET = Range("FORM") のように左辺に置くと 壊して仕舞うことになり、多分質問者の意図ではなかろうと思う。 むしろそのターゲットがFormと言う範囲に含まれるか調べ (その方法が#2のお答えのIntersectメソッドなど)です。 色々やっていると、列削除すると範囲の名前付けがくづれ て、以後おかしくなるようですね(テスト不十分)。 含まれればその後(>VBAを走らせたいのですがやり・・)の処理を実行する(=コードを書く)ことになります。 もしForm内のセルを変える処理を入れると、グルグル回りの循環処理になるので、#1のご指摘のApplication.EnableEvents = False Application.EnableEvents = Trueを入れて一時的に止めないといけない。
お礼
回答ありがとうございます。 はい、根本的におかしいと思いますが、わからなかったなりに書いてみました。 それで詳しい方に教えてもらおうと。 何もないよりはいいかなと思いまして…。
- maruru01
- ベストアンサー率51% (1179/2272)
No.2です。 >このままコピペしてみましたが、メッセージボックスが表示されません。 当該シートのシートモジュールに貼り付けていますよね? あと、元のWorksheet_Changeのプロシージャは削除してありますよね? それで、"FORM"と定義された範囲内のどこかのセルの値を変更しても、表示されませんか?
お礼
>当該シートのシートモジュールに貼り付けていますよね? VBAの画面で、プロジェクトウィンドウでは動作したいシートが選ばれています。 その右のウィンドウの上では「Worksheet」と「Change」が選ばれている状態です。 これでいいんですよね?
- marbin
- ベストアンサー率27% (636/2290)
マクロでセル内容を変更してもマクロが再度起動 しますので無限ループになります。 ↓ではいかがですか? *********************** Private Sub Worksheet_Change(ByVal TARGET As Range) Application.EnableEvents = False TARGET = Range("FORM") MsgBox Range("条件1") Application.EnableEvents = True End Sub ************************
お礼
回答ありがとうございます。 ループはなおりました。 ですがMsbBoxが働いてないようなんですが…(><。)
お礼
回答ありがとうございます。 このままコピペしてみましたが、メッセージボックスが表示されません。 なぜでしょうか???