グッドデザイン賞を受賞したウォーターサーバー >>

エクセル2010を使っている者ですが、ファイル中に「入力」という名前のシートが左から3番目にあるのですが、そのシートのC5の値を変更したときに、A列が空白になっている行を非表示にするというマクロについてですが、以下のように書いても動きませんでした。

マクロを書いたシートのC5が変更になった場合はうまく動くので、
Worksheets("入力").Range("C5")
という書き方が問題だと思うのですが、どのように書けば良いのか、ご教示願います

もしくは、同じシートのC5は関数で値を取得しており、関数の戻り値で変更されてもマクロが起動しないようなのですが、戻り値での変更でも起動させるようにする方法をご教示願います。



Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Worksheets("入力").Range("C5")) Is Nothing Then
Exit Sub
Else

Dim LastRow As Long
Dim i As Long

LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LastRow
If Cells(i, 1) = "" Then Rows(i).Hidden = True
Next i

End If

End Sub

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

A 回答 (5件)

関数の戻り値が変わった場合はChangeイベントは発生しませんね。


Calculate(再計算)イベントは発生しますが、どこが再計算されたかは判断できないので使えません。
修正方法ですが、処理やシート構成などが良く判らないので…処理コードのところは適当に修正してください。

☆入力シートのシートモジュールに
--------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$5" Then Call 処理
End Sub
--------------------------------------------------------------
☆標準モジュールに
--------------------------------------------------------------
Sub 処理()
Dim i As Long
Sheets("Sheet1").Select
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 1) = "" Then Rows(i).Hidden = True
Next i
End Sub
--------------------------------------------------------------
    • good
    • 0
この回答へのお礼

遅くなりましたが、ありがとうございます。
書いていただいたコードでうまく動きました。

お礼日時:2016/06/28 17:09

関数が入っているセルの値が変わった時にマクロを動かす仕組みになります。


まず、下記のVBAを各オブジェクトの下に張り付けて下さい(非表示にするマクロは、qazxcvfr4さんの方で書き直してくださいね)。
その上で、「入力」シートのC5セルに入っている関数を下記のユーザ定義関数(MyChangeIf)で包みます。
具体的には、例えばC5セルに =IF(Sheet2!A1<10,"A","B") という式が入っている場合、それを =MyChangeIf(IF(Sheet2!A1<10,"A","B")) とします。

【ThisWorkbook】
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
If MyChange Then
Call 非表示にするマクロ
MyChange = False
End If
End Sub

【標準モジュール】
Public MyChange As Boolean 'パブリック変数で定義。

Function MyChangeIf(v As Variant) As Variant
If Application.ThisCell.Text <> CStr(v) Then
MyChange = True
End If
MyChangeIf = v
End Function

Sub 非表示にするマクロ()
MsgBox "A列が空白になっている行を非表示にするというマクロ"
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
関数の戻り値が変更された場合でも、イベントを発生させる方法があるということですね。
しかし、誠に申し訳ないのですが、この度は理解できないまま締切の期限を迎えてしまいました。

お礼日時:2016/07/07 18:02

このご質問の内容は、古典的で、昔は、Microsoft 側のサポートに載っていましたが、いつのまにか消えてしまいました。

特に、DDEから自動的に入ってくるものを取れないかという内容でしたが、今は、ActiveX やCOMアドインで、知らないままにセルの値が変わっていたりしますので、そちらがわで処理することが多いようです。

私の記憶違いかもしれませんが、Change イベントは、Enter (CRコード)が必要だったような気がします。CRコードがないものは、イベントが走りません。Calculate イベントも、本来、計算をしないと走らないので、やや扱いに難があります。必ず、そのシートに計算式があることが条件です。

そして、最大級は、API時計を使ってイベントを自分で作ってしまうことです。しかし、そんなものは常に時限爆弾を抱えているようなマクロになってしまいます。

以下は、難易度最大を10としたら、以下のマクロはレベル2ぐらいです。

でも、これって、そのままなら、一回きりのマクロですよね。(^^;

注意点は、一旦閉じて、ファイルを開ければ、myVal の中に値が入りますが、そうでなければ、人為的にmyValに値を入れたほうが良いと思います。
Private ステートメントがついていますから、ThisWorkbook モジュールで、

Sub Test1()
 myVal =Me.Worksheets("入力").Range("C5").Value
End Sub
と入れてください。

不安が残るなら、別のイベントで、値を入れてください。
マクロを書いた最初だけです。後は、ファイルを開けるとき、マクロが実行されますから、大丈夫です。

同じ型のマクロは、標準モジュールでも作れます。こちらが古いスタイルです。

'ThisWorkbook モジュールに貼り付けてください。

Private myVal As Variant 'モジュールスコープ変数
Private Sub Workbook_Open()
 With Me.Worksheets("入力")
    myVal = .Range("C5").Value '値を入れる
  End With
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim c As Variant
  If Me.Worksheets("入力").Range("C5").Value <> myVal Then
    For Each c In Me.Worksheets("Sheet1").Range("A1:A10")
      If c.Value = "" Then
        c.EntireRow.Hidden = True
      End If
    Next c
    myVal = Me.Worksheets("入力").Range("C5").Value
  End If
End Sub
    • good
    • 0
この回答へのお礼

ご回答いたがき、ありがとうございます。
内容が理解できなかったため、どうお礼を書こうかと思っているうちに遅くなってしまいました。

お礼日時:2016/07/07 17:43

変更が有ったシートでしか「Changeイベント」は発生しませんよ。


仕方が無いので、ChangeイベントにCall命令を書き込んで標準モジュールで処理することになります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
しかし、回答していただいたことについて理解できなかったのですが、具体的にどのように修正すれば良いのか教えていただくことは可能でしょうか。

もしくは、関数を入力してあるセルの戻り値が変わった場合でも、Changeイベントを発生させることはできないでしょうか。

お礼日時:2016/06/22 19:04

シートモジュールでは、他のシートを変更する事は出来ませんので、標準モジュールに処理するコードを書き込んで、それを「Call ○○」と呼び出します。


もちろん処理するコードはシート名などチャント指定しないととんでもない事になります。
    • good
    • 0
この回答へのお礼

すみません。
他のシートをマクロで変更するのではなく、他のシートの指定したセルに変更があった場合に、ワークシートのChangeイベントを発生させたいと思っております。

お礼日時:2016/06/22 18:44

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

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

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

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

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

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で、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。

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

Aベストアンサー

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

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 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]で、ステップモードでひとつずつ動かし...続きを読む

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だからです。

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

QWorksheet_Changeが動かない

エクセル自動実行のマクロを作成中にうまく動かないので
サンプルをコピーして、変更してみたのですが
そのサンプルも動いません、マクロとは違う何か悪いのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim intColor As Integer
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub
Select Case Target.Value
Case Is <= 20
intColor = 3
Case 21 To 40
intColor = 46
Case 41 To 60
intColor = 9
Case 61 To 80
intColor = 10
Case Is > 80
intColor = 5
End Select
Target.Font.ColorIndex = intColor
Application.EnableEvents = True
End Sub

エクセル自動実行のマクロを作成中にうまく動かないので
サンプルをコピーして、変更してみたのですが
そのサンプルも動いません、マクロとは違う何か悪いのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim intColor As Integer
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub
Select Case Target.Value
Case Is <= 20
intColor = 3
Case 21 To 40
int...続きを読む

Aベストアンサー

こんばんは。

Application.EnableEvents = False
が実行されたあとにエラーが発生し、
Application.EnableEvents = True
が実行されることなく、Falseになったままに
なっているのでは無いでしょうか?

以下を実行してTRUEに戻してみてください。
Sub test()
 Application.EnableEvents = True
End Sub

Q”戻り値”が変化したときに、マクロを実行したい

超初心者です。

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

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

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

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

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

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

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

Aベストアンサー

セルの数式が計算された時に実行されるイベントプロシージャとして
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セルを記憶用セルとして使うようにしています。

セルの数式が計算された時に実行されるイベントプロシージャとして
Worksheet_Calculate イベントがあります。
これを活用されると良いでしょう。

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

例えば Sheet1 の X10 セルの関数の戻り値を監視したい場合。
1)新規シートを追加して、監視用シートとする。
2)追加した監視用シートの A1 セルに 数式で =Sheet1!X10 ..などのように監視対象のセルを参照。
3)監視用シー...続きを読む

QVBA 特定セル変更時に指定セルに日付代入方法

初心者のため、伝わるかわかりませんが、
次のような動作をVBAで行えなくて困っています。

・行いたい事 (※前提として"行"ごとに実行します)
J列が"1"だった場合、
L列にJ列が"1"になった日付(yyyy/mm/dd)を入力する

ただし、J列には関数を使用し"1"と表示されているため
セルの値変更ではありません。

・現在のVBA
Private Sub Worksheet_Calculate()
If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then
With Target.Offset(, 2)
.Value = Now()
.NumberFormatLocal = "yyyy/mm/dd"
End With
End If
End Sub

※J列が関数を使用しているため、Calculateにしています。
2行目の↓の部分でエラーになってしまっています。
> If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then

どなたかご教授いただけたら助かります。
よろしくお願いします。

初心者のため、伝わるかわかりませんが、
次のような動作をVBAで行えなくて困っています。

・行いたい事 (※前提として"行"ごとに実行します)
J列が"1"だった場合、
L列にJ列が"1"になった日付(yyyy/mm/dd)を入力する

ただし、J列には関数を使用し"1"と表示されているため
セルの値変更ではありません。

・現在のVBA
Private Sub Worksheet_Calculate()
If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then
With Target.Offset(, 2)
.Value = Now()
.NumberFormatLocal = "yyyy/mm/dd"
End W...続きを読む

Aベストアンサー

ANo.4です。

> 最初の説明で一部抜けていたのですが、
> L列(日付代入列)にはすでに関数が入っており、
> これを実行するためには、
> J="1"の場合"L"を一度クリア ⇒ 日付入力
> の手順にすればよいのでしょうか。

今現在は、J列の値が1でL列が空白の場合のみ、L列に日付を入れています。
現在L列に入っている関数が何をする物かわかりませんので、消して良いのかどうかの判断は私ではできません。
ご自分でよく検討してどのような場合なら日付で書き換えてしまって良いのか考え、マクロに反映してください。

そうでなければ、マクロでチェックと日付を入れる列を別な列にして、L列の関数はその列に日付が入っていれば日付を、入っていなければ今までの関数の結果を表示する様にすればよいでしょう、

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


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

人気Q&Aランキング