親子におすすめの新型プラネタリウムとは?

超初心者です。

セルの値が変化したときにマクロが実行されるようなものを作りたいです。

セルに入力されているのは、”関数”です。

なので、関数の”戻り値”が変化したときにマクロを実行したいのです。

今は、戻り値が変化しても式自体が変わっていないため
マクロが実行されません。

(セルの式を切り取ってもう一度貼りなおせば、マクロは実行される)

ちなみに今は
Private Sub Worksheet_Change(ByVal Target As Range)
で書いています。

まずVBAの勉強をしろと言われてしまいそうですが><;
何卒アドバイスのほどよろしくお願いいたします!

このQ&Aに関連する最新のQ&A

A 回答 (3件)

セルの数式が計算された時に実行されるイベントプロシージャとして


Worksheet_Calculate イベントがあります。
これを活用されると良いでしょう。

監視対象セル以外のセル範囲に数式が設定されていると、その再計算時にもイベントが発生しますので
別に作業用シートを用意したほうが無難。

例えば Sheet1 の X10 セルの関数の戻り値を監視したい場合。
1)新規シートを追加して、監視用シートとする。
2)追加した監視用シートの A1 セルに 数式で =Sheet1!X10 ..などのように監視対象のセルを参照。
3)監視用シートのシートモジュールに以下のプロシージャを置く。
Private Sub Worksheet_Calculate()
  If Range("A1").Value <> Range("B1").Value Then
    Range("B1").Value = Range("A1").Value
    MsgBox "change"
  End If
End Sub

基本的に、Sheet1 の X10 セルの数式が計算されて値が変化した時にCalculateイベントが発生しますが、
数式の内容によっては、値が変わらなくてもCalculateイベントが発生するケースもあります。
また、Sheet1の行削除や挿入時などでもCalculateイベントは反応します。
なので前回計算時の値を別セルに記憶させておいて、値を比較する必要があります。
前述の例では、A1に参照数式があるとして、B1セルを記憶用セルとして使うようにしています。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

Worksheet_Calculate イベントですか!
最近イベントプロシージャについて勉強をはじめたばかりで
calculateイベントについて知りませんでした。

ためしたところ、ばっちりです!できました^^

要領を得ない質問にも関わらず、丁寧なご回答を
ありがとうございました。

大変勉強になりました。

お礼日時:2012/10/26 10:55

こんばんは。



>関数の”戻り値”が変化したときにマクロを実行したいのです。
何がイベントの信号となるのか、書かれていませんので、私も#1さんと同様、はっきりとこれが良いとは言えません。

>Private Sub Worksheet_Change(ByVal Target As Range)
このイベントは、入力のEnter キーに対して反応するものです。

#2さんとは重複しますが、
Private Sub Worksheet_Calculate()
は、まさしく、Calculate の信号が発せられた時です。

リアルタイムスプレッドシート(RSS)は、この範疇に入ります。Calculateイベントは、私の記憶では、=Now()関数を、同じシートのどこかに置いておくと、値の変化に対してイベントが発生します。これは、OnDataイベントの代わりの役目があります。

OnDataイベントとは、DDEやOLEが入ってくるのを監視する役目を持っています。

'ローカルモジュールに入れる

Worksheets("Sheet1").OnData = "ValidateData" '←反応するマクロ名を入れます。


もう少し、詳しいお話があると、直接の回答に結びつくはずです。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

リアルタイムスプレッドシート…
はじめて聞きました。

なにぶん初心者なもので、かなり難しいですが
今からいろいろ調べてみたいと思います。

大変勉強になりました。ありがとうございました。

お礼日時:2012/10/26 10:58

詳細が分からないので、何とも言えませんが・・。


「戻り値が変化する元となるアクション」が何かしらあるはずですので、そこに着目したら良いかと思いますが。
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

なるほど、「戻り値が変化する元となるアクション」
という観点が抜けていました。

勉強になります。ありがとうございます!

お礼日時:2012/10/26 08:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

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

Aベストアンサー

こんにちは
お邪魔します。

(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と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(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" ' 確認用(確認が済んだら当行削除)
...続きを読む

QExcelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。

タイトルの通りです。
Excelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。
ご存知の方がいらっしゃいましたら教えて下さい。

Aベストアンサー

WorksheetのChangeイベントで出来ます。
イベントの引数で値の変わったセルのRangeオブジェクトがわたってくるので、マクロを実行させることができます。

QPrivate Sub Worksheet_Calculate()のことでお聞きします

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の温度変化で
Application.Speech.Speak "温度接近", True
などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか
その場合、Private Sub Worksheet_Change(ByVal Target As Range)内の
Target.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?
それとも、もしかしたら標準モジュールに書くのでしょうか?

うまく説明できていませんが、どなたか教えてください

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の...続きを読む

Aベストアンサー

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用のマクロを持っているはずです。

>特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
>変化した時の処理はどこに書いたらいいのでしょうか?

ふつうは、どこでもよいので、
=Now()
という式を書いて、
Private Sub Worksheet_Calculate()
に、イベントを拾わせるわけです。
しかし、少し、工夫が必要で、時々、これが困った動きをします。

Calculate のイベントが、ワークブック全体に働いてしまい、どこのシートを使っても、Calculateイベントが動いてしまいます。この方針で話が本格的になった時に、この対処法は、あらためて紹介します。

>(Worksheet_Change)のTarget.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?

単に、モジュール変数を使って橋渡しするのか、それとも、同時で働くということなら、 Worksheet_Calculateのイベントでなくてもよいはずです。どのように使うのか、こちらではわかりかねます。本来、別の働きをするものです。もちろん、キーで入力した際は、Worksheet_Calculateのイベントは、起動します。

>Application.Speech.Speak "温度接近", True
>などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか

ActiveX コントロールで入ってきた値が、どのように加わっていくのかにもよりますが、セルの位置は、Worksheet_Changeイベントのようにセルの位置は感知しませんから、インプットの場所が動いていくのでしたら、マクロで最後尾を探さなくてはなりません。

>それとも、もしかしたら標準モジュールに書くのでしょうか?
同様のコマンドで、標準モジュールに書く方法もあります。とても古い方法で、オブジェクト・ウィンドウにも出てこないはずです。しかし、まだ、同様の働きはしますが、今は、シートモジュールが主流になっています。

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用の...続きを読む

QEXCEL あるセルに数字が入力されれば既存マクロ実行させたい

ボタン等のグラフィックオブジェクトのマクロ実行は簡単なのですが、
ある位置のセルにデーターが入力されれば、
既存のマクロを自動実行させることできますか?

Aベストアンサー

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range(ある位置) <>"" then call 既存のマクロ名
End Sub

ある位置と既存のマクロ名を変更して使ってみてください。
あと このVBAは 操作するワークシートのほうに記述します。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Q【Excel VBA】セルの値が変更されたらマクロを実行

こんにちは

B4の値を変更する度に、
標準モジュールにあるMacro1が実行されるようにするには、
どうしたら良いでしょうか。

Excel2013です。

Aベストアンサー

WorksheetのChangeイベントを書けばいいです。
【Worksheet Change】
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Row = 4 Then
Call Module1.Macro1
End If
End Sub

【Module1】
Public Sub Macro1()
MsgBox "B4の値変更(元の値と変更がなくても走行する)"
End Sub

QExcel VBAでのWorksheet_Changeが動作しない原因

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = Falseを入れてあります。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C3")) Is Nothing Then
Exit Sub
Else
Application.EnableEvents = False
Call test
Application.EnableEvents = True
End If
End Sub

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = ...続きを読む

Aベストアンサー

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かします。そしてマクロが、正しく動いているかチェックします。そして、そのマクロが、再び、戻ってくるかどうか、様子をみます。
ただし、今回のマクロは途中で止めると、Application.EnableEvents = True に戻っていないことがありますから、イミディエイトウィンドウあたりで、設定を戻したほうがよいです。

また、初心者ならでは失敗は、Test プロシージャが、標準モジュールか、そのシートモジュールのどちらかに置いていないのが原因だったりします。

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かし...続きを読む

Qエクセル イベントマクロ Changeイベントを複数作りたい

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub

以下マクロの内容

End Sub

これでセルA1が変わるとイベントマクロが発生しますが
セルB1が変わると別のマクロが発生し
セルC1が変わるとまた別のマクロが発生し…とするには
どうすればよいのですか
単純に並べて書いたらだめみたいだったんですけど

Aベストアンサー

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$A$1"
 A1のマクロ文
Case "$B$1"
 B1のマクロ文
Case "$C$1"
 C1のマクロ文
・・・・
End Select
End Sub
こんな感じでは?

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QExcelにおけるDDEデータのイベントプロシージャについて

DEEをつかって、Excelのセルにデータを出力しています。
そのセルのデータが変更された時に、自動でそのデータをコピーし別のシートにペーストしたいのですが、よろしければ助言をお願い致します。
イベントプロシージャの(worksheet_change)で試してみたのですが、任意でセルの値を変えないとプロシージャが動かず行き詰りました。
VBAも超初心者なのですが、よろしくお願い致します。

Aベストアンサー

こんにちは。Wendy02です。

返事が遅くなりました。あれから、折に触れて考えてみました。

以下のサイトにある方法が出来るのではないか、と思いました。(ドイツ語ですから、マクロだけをみてください)

http://www.herber.de/forum/archiv/24to28/t24099.htm

Auto_Open で、Activeなシートを、OnData で監視させます。(お分かりだと思いますが、全部、標準モジュールにおきます)そこに、DDEのデータが入ってくると、その設定された、マクロが動くという仕掛けです。(まだ、このメソッドは生きていると思います)

ActiveSheet.OnData = "Update" 


一応、OnDataのHelpを置いておきます。

# 機能 Ver5 マクロヘルプより

DDE または OLE でリンクされたデータが、Microsoft Excel に届いたときに実行されるプロシージャの名前を返します。ここで設定したプロシージャが実行されるのは、他のアプリケーションからデータが届いたときだけです。値の取得および設定ともに可能です。

こんにちは。Wendy02です。

返事が遅くなりました。あれから、折に触れて考えてみました。

以下のサイトにある方法が出来るのではないか、と思いました。(ドイツ語ですから、マクロだけをみてください)

http://www.herber.de/forum/archiv/24to28/t24099.htm

Auto_Open で、Activeなシートを、OnData で監視させます。(お分かりだと思いますが、全部、標準モジュールにおきます)そこに、DDEのデータが入ってくると、その設定された、マクロが動くという仕掛けです。(まだ、このメソッドは生きていると...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング