• ベストアンサー

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

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

  • w-inty
  • お礼率72% (1169/1618)

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

  • ベストアンサー
  • 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/17068)
回答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

  • Excelでセルの値を変化させた時にマクロを実行するには?

    "A1"のセルに値を入れるとマクロが実行するように組んだのですが、問題が発生しました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then      cells(1,2)=5      ・・・・ End If End Sub ここでA1に"5"を入力すると、B1に5と入力されるのですが、Target=5と認識してしまい、A1と同じ値になるので無限ループになってしまいます。 なにか回避策はないでしょうか? よろしくお願いします。

  • セルの値をワークシート名にする(エクセル2013)

    インストラクターのネタ帳さんより http://www.relief.jp/itnote/archives/003382.php 下記「セルの値をワークシート名にする?Worksheet_Change」 を拝借し利用させていただこうと思いましたが ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "H1" Then ActiveSheet.Name = Range("H1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のH1セルの値はシート名にできません。" End Sub ---------------------- はそのまま出来るのですが、 H1セルにデータの入力規則:リストを指定しますと エラーとなりシート名が変わりません sheet1のリストA1:A50をsheet2のH1セルにリスト表示させ その表示名をそのままシート名に出来ませんでしょうか? ---------------------- Sub copy Range("H1").Copy Range("P1") End Sub ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "P1" Then ActiveSheet.Name = Range("P1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のP41セルの値はシート名にできません。" End Sub ---------------------- としてH1のセルをP1にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • セルの値を変更した時に日付けが入るマクロ

    エクセル2010を使っている者です。 19行以内、19列以内の範囲において変更があった場合は、変更のあった行の 20列目に日付けが入るようしたくて、以下のVBAを書いたつもりなんですが、 うまく動きません。 セルの値を変えたり、セルをダブルクリックして編集可能な状態にすると、 日付けは入るのですが、そのセルより右の19列目までのセルが全て 「41602」といった数字に変わってしまいます。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Target.Row > 19 Then Exit Sub If Target.Column > 19 Then Exit Sub Target.Offset(0, 1).Value = Date End Sub なお、上記のVBAは以下のサイトを見て作ったものです。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html どなたか、どこがおかしいのかお教えください。

  • エクセルVBAでセル変化したら別のセルへコピーする

    おはようございます。VBAをはじめて浅い初心者です。 あるセルに数字および文字列が入力されたら違うセルへコピーしたいのですがどのようにすればできますか。 Private Sub Worksheet_Change(ByVal Target As Range)とか 使用してつくればいいのですか?教えてください。

  • Excel VBA セルの双方向同期のエラーについ

    エラーが発生して理由がわからないので、どなたか助言をお願いします。 以下のVBAにて、目的のセルにデータを入力すると、1回目は必ず添付写真の通りのエラーが出まして、デバッグをすると3行目が黄色でハイライトされます。 記述は以下の通りです。どうぞよろしくお願いします。 シートAへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("シートB").Range("$B$1").Value = Sheets("シートA").Range("$A$1").Value End If End Sub シートBへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("シートA").Range("$A$1").Value = Sheets("シートB").Range("$B$1").Value End If End Sub

  • ワークシートのChangeイベントについて

    シート1のA1セルの値を変更したらシート2のA1・A2・A3と変更内容を順に記録するような以下のようなコードがありますが、うまく動作しません。問題点を指摘していただければ大変助かります。 【Worksheet】 Private Sub Worksheet_Change(ByVal Target As Range) Static r Dim s As Range Set s = Sheets("sheet1").Range("$a$1").Value If s Is Nothing Then Else If r = "" Then r = 1 Sheets("sheet2").Cells(r, 1) = Sheets"sheet1").Range("$a$1").Value r = r + 1 End If End Sub

  • VBAにおけるセルの名前の参照方法

    現在、Aシート、Bシートがあり、BシートのA1セルに test という名前を付けました。(範囲はブック) Aシートが再計算されれば、BシートのA1セルをメッセージボックスで表示したいのですが、調べましたが、よくわかりませんでしたので、詳しい方教えてください。 範囲はブックになっているし、他に同じセルの名前もつけれないようになっているので、 このような記述で大丈夫かと思いましたがエラーが出でしまいました。 なぜでしょうか?やはりわざわざ毎回シート名から記述が必要なのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Range("test").Value) End Sub このようにシート名から書けば表示されました。 Private Sub Worksheet_Change(ByVal Target As Range)      MsgBox (Worksheets("B").Range("test").Value) End Sub

  • セルの値をファイル名にするには

    現在下記のマクロを入力しています。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub この時 ファイル名を SHEET1のA1 セルの値を利用してファイル名にするために下記の内容を入れてブックを保存したいと考えています。 上記のマクロが入っていないときは上手く行くのですが下記を追加するにはどうすればいいかご指導いただけませんでしょうか。 宜しく御願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If End Sub

専門家に質問してみよう