• ベストアンサー

ワークシート上のセルの値を変更したらVBAを実行させる。

Excelでシートの任意の箇所(FORM)を変更したらVBAを走らせたいのですがやり方がわかりません。 シート上の任意の箇所に「FORM」という名前をつけました。 その中でセルの値を変更したらVBAを走らせるために、以下のテストを作成しました。 ですが、入力したセルの値は消えて、さらに無限ループのようにいくつも値をみて、メッセージボックスも複数表示されます。 実際は無限ループではないので、フリーズはせずかえってくるのですが。 どのように変更したらいいのでしょうか? Private Sub Worksheet_Change(ByVal TARGET As Range) TARGET = Range("FORM") MsgBox Range("条件1") End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。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

w-inty
質問者

お礼

回答ありがとうございます。 このままコピペしてみましたが、メッセージボックスが表示されません。 なぜでしょうか???

その他の回答 (4)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

再び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の範囲内のセルの値を変更してみて下さい。

w-inty
質問者

お礼

回答ありがとうございます。 >>動作したいシートが選ばれています。 >選ばれているとかじゃなくって、そのシートのモジュールに記述してますか?と聞いているんです。 すいません、言い方が悪かったですね。 そのシートにモジュールを書いています、という意味合いで選ばれています、と書きました。 どうしてもできなかったので、新規ブックを作成後やったらできました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

根本的におかしいのでは。 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を入れて一時的に止めないといけない。

w-inty
質問者

お礼

回答ありがとうございます。 はい、根本的におかしいと思いますが、わからなかったなりに書いてみました。 それで詳しい方に教えてもらおうと。 何もないよりはいいかなと思いまして…。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

No.2です。 >このままコピペしてみましたが、メッセージボックスが表示されません。 当該シートのシートモジュールに貼り付けていますよね? あと、元のWorksheet_Changeのプロシージャは削除してありますよね? それで、"FORM"と定義された範囲内のどこかのセルの値を変更しても、表示されませんか?

w-inty
質問者

お礼

>当該シートのシートモジュールに貼り付けていますよね? VBAの画面で、プロジェクトウィンドウでは動作したいシートが選ばれています。 その右のウィンドウの上では「Worksheet」と「Change」が選ばれている状態です。 これでいいんですよね?

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

マクロでセル内容を変更してもマクロが再度起動 しますので無限ループになります。 ↓ではいかがですか? *********************** Private Sub Worksheet_Change(ByVal TARGET As Range) Application.EnableEvents = False TARGET = Range("FORM") MsgBox Range("条件1") Application.EnableEvents = True End Sub ************************

w-inty
質問者

お礼

回答ありがとうございます。 ループはなおりました。 ですがMsbBoxが働いてないようなんですが…(><。)

関連するQ&A