• ベストアンサー

セルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m 例えば、シート1のA1の値が変ると、マクロAが実行される。 シート1のA2の値が変ると、マクロBが実行される。 と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。 知恵をお貸し下さい。

  • mzakom
  • お礼率38% (129/338)

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは お邪魔します。 (1)まずはオーダー通りの基本型 Private Sub Worksheet_Change(ByVal Target As Range) ' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける If Target.Count > 1 Then Exit Sub ' ' 変更されたセルが1列めでない場合は処理を抜ける If Target.Column <> 1 Then Exit Sub ' ' 変更されたセルの行位置によって処理を分岐する Select Case Target.Row Case 1 ' A1 の場合の処理 MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case 2 ' A2 の場合の処理 MsgBox "A2" ' 確認用(確認が済んだら当行削除) End Select End Sub (2)セルの位置によってもっと細かく分岐したい場合 Private Sub Worksheet_Change(ByVal Target As Range) ' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける If Target.Count > 1 Then Exit Sub ' ' 変更されたセルの 列位置 によって処理を分岐する Select Case Target.Column Case 1 ' 1列めなら ' ' 変更されたセルの 行位置 によって処理を分岐する Select Case Target.Row Case 1 ' 1列め の 1行め なら ' A1 の場合の処理 MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case 2 ' 1列め の 2行め なら ' A2 の場合の処理 MsgBox "A2" ' 確認用(確認が済んだら当行削除) End Select Case 2 ' 2列めなら ' ' 変更されたセルの 行位置 によって処理を分岐する Select Case Target.Row Case 1 ' 2列め の 1行め なら ' B1 の場合の処理 MsgBox "B1" ' 確認用(確認が済んだら当行削除) Case 2 ' 2列め の 2行め なら ' B2 の場合の処理 MsgBox "B2" ' 確認用(確認が済んだら当行削除) End Select End Select End Sub (3)セルのアドレスを採り文字列で分岐したい場合    (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの) Private Sub Worksheet_Change(ByVal Target As Range) '' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する Select Case Target.Address(False, False) Case "A1" MsgBox "A1" ' 確認用(確認が済んだら当行削除) Case "A2" MsgBox "A2" ' 確認用(確認が済んだら当行削除) Case "B1" MsgBox "B1" ' 確認用(確認が済んだら当行削除) Case "B2" MsgBox "B2" ' 確認用(確認が済んだら当行削除) End Select End Sub とりあえず、単セルの場合だけ、理解を深めてみましょう。 複数セルに値変更があった場合については、その後でいいと思います。 (1)にある If Target.Count > 1 Then Exit Sub If Target.Column <> 1 Then Exit Sub のような記述はイベントプロシージャでは多用される基本中の基本ですから よーく咀嚼して呑み込んじゃってください。 一応、いわずもがなですが、 上に挙げたようなイベントプロシージャを複数併記することはできませんので 使わないものはコメントブロックして下さい。 VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば [コメントブロック]、[非コメントブロック]というボタンがありますので適宜。 また、イベントプロシージャで注意するべき点として 例えば今回のChangeイベントの処理中にセルの値を変更すれば 再度Changeイベントが呼び出される(再帰)ということを知っておいてください。 その場合、   Application.EnableEvents = False   ' 処理   Application.EnableEvents = True のような形で、再帰を回避します。 私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して 日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。 ・オブジェクトやプロパティの基本的な扱い方 ・条件分岐 などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。 以上です。 /// Re:#2 ちょっと違うかも。 それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then MsgBox Target.Address End If End Sub として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。 あしからず、、、

mzakom
質問者

お礼

とても丁寧な回答ありがとうございますm(_ _ )m 凄く勉強になります。 色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

どうも   > 色々試してわかったことがあるのですが、セル値の変更はwebクエリで更新された場合は判定されないのでしょうか。   答えは「はい(No)」です。 Changeイベントは、WEBクエリの更新を契機(トリガー)にすることはできません。 「Webクエリの更新に連動したイベント」ということになると、 かなり高度な複合技という感じでしょうか。 いくつか方法はあるようですが私にとっては不得手なジャンルですし '回答というレベル'で書けるものは持ち合わせていませんので、ご容赦を。 もしそのテーマについて、別途質問されるのでしたら使用環境などの詳細を示した方が良さそうです。   (私宛ではないですが) > 例えばChangeターゲットのセルはA1なのですが、A1は(=B1)の数式の場合、B1の数値が変ってもターゲットがA1の場合は更新の判定がされません。   Changeイベントは計算の結果として値変更されたものを返しませんから その意味では正常な動作です。 方法としては Worksheet_Calculateイベントを使って工夫する手もありますが この例では参照先(B1)の変更をChangeイベントで追う方が 一般的でしょうね。   それでは、また

mzakom
質問者

お礼

大変勉強になりました。 回答ありがとうございましたm(_ _ )m

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

シート1のシート見出しを右クリックして「コードの表示」を選択します。 コードは次のようにすることでもしA1が変わればマクロAがA2が変わればマクロBが実行されますね。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then 'マクロAの内容 End If If Target = Range("A2") Then 'マクロBの内容 End If End Sub または 例えばマクロAの内容を Sub マクロA() マクロAの内容 End Sub マクロBの内容を Sub マクロA() マクロAの内容 End Sub と別に用意しておきそれらを呼び出すような形にします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("A1") Then Call マクロA End If If Target = Range("A2") Then Call マクロB End If End Sub

mzakom
質問者

補足

思っていた通りの事が出来ましたm(_ _ )mありがとうございます。 ただ、ひとつ疑問点が・・・ 例えばChangeターゲットのセルはA1なのですが、A1は(=B1)の数式の場合、B1の数値が変ってもターゲットがA1の場合は更新の判定がされません。 これを判定する方法などありますでしょうか。

  • mekuriya
  • ベストアンサー率27% (1118/4052)
回答No.1

【VBA】エクセルシート上のある1つのセルの値が更新される度にVBAを実行する方法 - Yahoo!知恵袋 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1228057787

関連するQ&A

  • マクロの自動実行などについて

    エクセル2003のVBAマクロについて質問です あるワークシートに値が入力されたら、マクロを自動実行するように出来ないでしょうか? 又、そのセルの値を別のセルにコピーしたいのですが、データを入力する度にセルの場所が ひとつ下へずれます。この最終列のセルの値を必ず拾うようにするにはどうすればよいでしょうか? ややこしくてすいません

  • セルの値が●ならば▲のマクロを自動で実行

    エクセルで、セルの値が●ならば▲のマクロを自動で実行するということはできるのでしょうか? セルの値が●月(TODAY関数)なら、自動的に置換をするように設定したいのです。

  • 値によって違うマクロの実行

    表題の質問をさせていただきます。よろしくお願いいたします。 A1セルには、別シートで計算された値が転記されるようになっており、1から45までのいずれかの数値が入っています。 その数値によって異なる動きをするマクロが3個あります。  1から15の時はマクロA  16から30の時はマクロB  31から45の時はマクロC おのおののマクロはフォームのボタンから実行できるように登録してあります。 現在はA1セルの数値を見て該当するボタンを押してマクロを実行しています。 たとえばA1の値が「25」の時はマクロCが登録してあるボタンCを押しています。 そこで質問させていただきたいのは 既存のボタンを撤廃し 新たに設置するひとつのボタンで3個のマクロを制御したいと思ったのです。 新たなマクロでA1の値を取得し、そのマクロ内で既存のマクロへ割り振るためには どのような記述をすればよいのでしょうか。 よろしくお願いいたします。

  • セルの値によって、どちらのマクロを実行するか分岐?

    ■もしも A1セルの値が 「課長」「部長」という文字列を含んでいる場合は、    ”マクロA” を実行する。 ■そうではなく、 A1セルに、 「社長」「社員」という文字列があったなrば、 ”マクロBを実行する”  ・・・というマクロを作りたいのですが、教えていただけませんでしょうか。  どうぞ、よろしくお願いいたします。  

  • エクセル:シート1のセルA1が0でなければ任意のマクロを実行したい

    エクセルマクロ(VBA)初心者です。よろしくお願いします。 (1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ (2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。) このようなマクロ(標準モジュール)の書き方を教えてください。 よろしくお願いいたします。

  • 【EXCEL】あるセルにAという値が入力されたら既定範囲にマクロを自動実行したい

    「あるセルにAという値が入力されると,既定範囲にマクロを自動実行する」ということはできますか? たとえばB2に「欠席」という値が入ったらその下のB3~B8までセルを斜線にする.     C3に「欠席」という値が入ったらその下のC3~C8までセルを斜線にする. という感じです.マクロサイトもいくつかみたのですが分かりません.お願いします.

  • エクセルのマクロで、セルの値を参照してジャンプ

    エクセルのマクロで、セルの値を参照して、 別シートにジャンプして貼り付けたいと思っています。 <Sheet1>  |  A  B  C ------------------------------------ 1|  A1  あ  100 2|  B5  い  50 3|  C7  う  80 4|  D3  え  20 5|  E9  お  40 <Sheet2>  |  A  B  C  D  E ------------------------------------ 1|  あ 2|  100 3|         え 4|         20 5|    い 6|    50 7|       う 8|       80 9|            お 10|            40 といったイメージです。(お分かり頂けますか?) Sheets1!B1:C1を選択し、A1のセルの値を参照して、Sheets2!A1にジャンプして、 行列入れ替えて貼り付ける、といったマクロを組みたいのですが、 セルの値を参照する部分が分かりません。 実際はSheets2の様なシートは複数あり、1つのリストから複数の形式を変えた表を 作りたいと思っています。 Sheets2以降のシートに見出し行を加え、VLOOK関数を組み込んだ表を作っておき、 結果を貼り付けて見出し行を削除する、といったマクロは組めるのですが、 セルを参照してジャンプして貼り付けてくれると便利だと思い質問させて頂きました。 どなたかお知恵を拝借できましたら嬉しいです。 宜しくお願い致しますm(_ _)m

  • セルの値変更でマクロ実行

    セルに値を入力すると、他のシートで演算され結果がセル"A1"にTRUE、FALSEと表示される関数式ができています。 セル"A1"の変化によりマクロ実行させたいと思います。プログラムの案をお願いします。

  • マクロの自動実行について

    マクロの自動実行についてお伺いします。 今、エクセルに一定のデータを貼り付けたら、(例えばナンバーを元に)自動的にソートされるマクロを作ろうとしてます。 以下流れになります。 **************************** 以下貼り付け(エクセル以外からの元データ) (プログラムの詳細は分かりませんが、エクセルなどにコピペできるものらしいです。) 1|Aさん 3|Bさん 2|Cさん ~ N|XXさん ↑をエクセルをシートに貼り付けしたら、別シートにソートされて 1|Aさん 2|Cさん 3|Bさん ~ N|XXさん という表が出来上がる。 **************************** 自動実行だとworksheet_changeというイベントがあるようですが、特定の範囲なりセルなりが指定されてる場合にいきる処理のように見えます。 そんなに広範囲ではないことは予想できますが、はっきりとしたデータの範囲も量も分からない場合、ループで範囲を覚え、それをソートするのがいいのでしょうか。 ちょっと質問が曖昧な気もしますが、アドバイスお願いします。

  • EXCL のマクロ自動実行(イベントによる)についてお教えください。

    EXCL のマクロ自動実行(イベントによる)についてお教えください。 エクセルのあるセル(たとえばA1セル)に入力するとマクロが自動実行する方法をお教えください。 よろしくお願いいたします。

専門家に質問してみよう