- ベストアンサー
エクセルVBAでセルの値が増えたかどうかの判断
たびたびお世話になります。 最近VBAを少しずつ勉強しています。 F5の値が変化したときにその値が増えたか減ったかの判断をするにはどう書いたら良いでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 皆さんの回答で解決してないのかな? F5にSUM関数が入っているなら Calculate を使ったら? シート名タブを右クリックして「コードの表示」 出てくるVBE画面にコピペします。 セル IV1 を判定用セルにしています。 Private Sub Worksheet_Calculate() If IsNumeric(Me.Range("F5").Value) Then Select Case Me.Range("F5").Value Case Is > Me.Range("IV1").Value Me.Range("F7").Value = 1 Case Is < Me.Range("IV1").Value Me.Range("F7").Value = 0 End Select Me.Range("IV1").Value = Me.Range("F5").Value End If End Sub
その他の回答 (7)
- KenKen_SP
- ベストアンサー率62% (785/1258)
#5 のコードは撤回します。 改めてコードを書きました。まず、実行してみて下さい。うまくいかない場合 は、次の点を明記して、再度補足して下さい。 ・どのように動いてほしいのか(動作の仕様) ・どこがうまくいかないのか(問題点) 【 手順 】 1. シート選択タブ上で右クリックメニューから[コードの表示] --> Visual Basic Editor(以下 VBE) が立ち上がります 2. VBE 画面の大きなスペースに下記のコードをコピー&ペースト 3. VBE を閉じる 4. 動作を確認 '----- 以下コード ------------------------------------------------ '前回値記録用変数(モジュールレベル変数)の宣言 Private mvntPrevDat As Variant 'このシートがアクティブになったとき実行される(イベント) Private Sub Worksheet_Activate() '前回値記録用変数に現在のF5セルの値を代入 mvntPrevDat = Me.Range("F5").Value End Sub 'このシート上のセルの値が変更された時に実行される(イベント) Private Sub Worksheet_Change(ByVal Target As Range) 'F5セルの内容(Target.Value)と前回値(変数mvntPrevDatの値)を比較 Select Case Range("F5").Value Case Is > mvntPrevDat '増加 Range("F7").Value = 1 Case Is < mvntPrevDat '減少 Range("F7").Value = 0 End Select '前回値記録用変数の値を更新 mvntPrevDat = Range("F5").Value End Sub
お礼
たった今うまくいきました。 何度もお世話になりました。 教えて頂いたとおりにそのままコピーすると ちゃんと3つに分かれて よく出来てるなあと一人感心しています。 どこに書くかはVBAが自動でやってくれるんですね まだこの程度で恥ずかしいです 遅くまでつきあって頂きましてありがとうございました
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 増えた時はF7に1を、減ったときはF7に0を書き込む... Msgbox の行を修正するだけです。 増えた時: MsgBox "増加" → Me.Range("F7").Value = 1 減った時: MsgBox "減少" → Me.Range("F7").Value = 0 (#1 の補足欄引用) > ...常に数値で式が書いてあります。 > ...ブックを開いた直後からF5の値は何度も変化します。 その数式ですが、例えば、Today とか Now などの関数(揮発性関数)または、 別ブックへのリンクなどが使われてますか? それにより、回答が変わってくるかもしれません。
お礼
Me.Range("F7").Value = 1 を今日覚えることが出来ました 感謝いたします
補足
何度もお世話になります。また私の説明が足りず、親切に教えてもらっているのに申し訳ありません。 式は数値のセル(入力するセル)の単なる合計です 別のブックのリンクはありません
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 > 最近VBAを少しずつ勉強しています。 混乱させてしまうかも、、こんな方法もあるということで、ご参考まで。 シートモジュールでモジュールレベル変数に前回値を保持しておきます。ブックが開かれ、シートが存在している限り、この値は保持されています。 注意しないといけないのは、ブックを閉じるとこの変数の値は消えてしまいます。これが不都合であれば、別のセルなどに前回値を記録しておくしかありません。 Worksheet_Activate イベントを使っているので大丈夫だと思いますが、、 Private mvntPrevDat As Variant Private Const cnsTARGET = "$F$5" Private Sub Worksheet_Activate() mvntPrevDat = Me.Range(cnsTARGET).Value End Sub Private Sub Worksheet_Change(ByVal Target As Range) 'F5セル以外なら終了 If Target.Address <> "$F$5" Then Exit Sub '比較できるか判定 If IsNumeric(mvntPrevDat) And IsNumeric(Target.Value) Then Select Case Target.Value Case Is = mvntPrevDat MsgBox "同一" Case Is > mvntPrevDat MsgBox "増加" Case Is < mvntPrevDat MsgBox "減少" End Select Else MsgBox "比較できません" End If '保持している値の更新 mvntPrevDat = Me.Range(cnsTARGET).Value End Sub
補足
早速教えて頂きましてありがとうございます。 私の説明が足りませんでした。 MsgBox を使う代わりに、増えた時はF7に1を、減ったときはF7に0を書き込むにはどうしたら良いでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
シートモジュールに Dim x Private Sub Worksheet_SelectionChange(ByVal Target As Range) x = Target End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Target If x <> Target Then MsgBox x & "から" & Target & "に値が変わりました。" End If End Sub 上記でシート全体で、セルの変化が捉えられるようです。 Selectionの方が早く反応するようですので。 ただ少数テストではうまくいくようですが、エクセルのエベントについて(理解不足もあるでしょうが)不安があります。 どなたかから、不適当の指摘があるかもしれません。 本質問はF5だけなら、上記コードでTarget.Adressが$F$5以外なら 通りぬけるようにすれば良いと思います。 また増減の判別は、上記Changeイベントの中でで>=<と3つに分けければ良いです。
お礼
お礼が遅くなりました Dim xやMsgBox、Target理解できました ありがとうございました
補足
親切に教えて頂きましてありがとうございます VBAはまだまだ初歩の初歩です コードの書き方が分かりました もう少し理解に時間がかかります 決してうまく行かない分けではありません あと二日ほど時間をください
- merlionXX
- ベストアンサー率48% (1930/4007)
シートのモジュールに下記をコピペしてみてください。 F5が数値の場合のみ対応します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$5" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x .EnableEvents = True .ScreenUpdating = True End With On Error GoTo line h = x - y m = IIf(h < 0, " 減少", " 増加") MsgBox Abs(h) & m & "しました。" line: End Sub
お礼
お礼が遅くなりました ほぼ理解できました With End With 勉強になりました ありがとうございました
補足
親切に教えて頂きましてありがとうございます VBAはまだまだ初歩の初歩です コードの書き方が分かりました もう少し理解に時間がかかります 決してうまく行かない分けではありません あと二日ほど時間をください
こんにちは。 >F5の値が変化したとき これは、Worksheet_Changeイベントを使うととらえることが出来ます。 しかし、変更前の値は何処にもないので比べる事はこのままではできません。 そこでシートのどこかに変更前の値を保存しておきます。例えばF5がSheet1として、Sheet2のA1に保存します。 まず、ブックを開いたときに値を保存するようにします。 ThisWorkbookモジュールに Private Sub Workbook_Open() Worksheets("Sheet2").Range("A1").Value = _ Worksheets("Sheet1").Range("F5").Value End Sub 次にSheet1のシートモジュールに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$F$5" Then If Target.Value < Worksheets("Sheet2").Range("A1").Value Then MsgBox "数値が減りました。" Else MsgBox "数値が増えました。" End If Worksheets("Sheet2").Range("A1").Value = _ Target.Value End If End Sub どうでしょうか。
お礼
お礼が遅くなりました お陰様で動作確認できました シートモジュールやThisWorkbookモジュール やっと理解できました ありがとうございました
補足
親切に教えて頂きましてありがとうございます VBAはまだまだ初歩の初歩です コードの書き方が分かりました もう少し理解に時間がかかります 決してうまく行かない分けではありません あと二日ほど時間をください
- papayuka
- ベストアンサー率45% (1388/3066)
どんな状況においてでしょうか? セルの値変化や差分を前後で捕らえるのは結構面倒だと思います。 そもそも前後の値が数値であるとは限りませんし。 やりやすいのは Worksheet_Change で別セルに値を保持してしておいて、その値と比較する方法でしょうか。
補足
こんにちは、私の説明が足りませんでしたので補足させてください。 F5は常に数値で式が書いてあります。その値が増えた時と減った時(変化なしは判断しません)の判断がしたいのです。ブックを開いた直後からF5の値は何度も変化します。変化するたびに、他のマクロでも応用が利くようにしようと思えば、たとえばですがF7に数値の1を書き込むマクロを書きたいと思っています。 まだ説明が足りませんが何ともうまく説明できません
お礼
休日に何度も遅くまでお世話になりました。 お陰様でうまくいきました。 Select Case やMe.Range("F7").Value = 1 IsNumeric(Me.Range("F5").Value) シート名タブを右クリックして「コードの表示」 など新たに勉強になりました。 まだこの程度ですから恥ずかしい限りです。 どうもありがとうございました。