セルの取得が式によって変更されるたびにVBAコードを実行する方法を知りたいですか?私はセルがその値をユーザーによって変更されるとコードを実行することができましたが、動作しません。セルのgetが式によって値が変更されるたびに、どのようにVBAコードを実行できますか?
答えて
セルA1(たとえば= B1 * C1)の式があり、いずれかのセルB1やC1への更新のために、コード毎時間A1の変化は、私が使用することができます以下
Private Sub Worksheet_Calculate()
Dim target As Range
Set target = Range("A1")
If Not Intersect(target, Range("A1")) Is Nothing Then
//Run my VBA code
End If
End Sub
アップデートを
は、私の知る限りではWorksheet_Calculate
に問題があることである
式を含むすべてのセルで発生するスプレッドシートにはどのセルが再計算されたかを特定できません(つまり、 Worksheet_Calculate
はTarget
オブジェクトを提供しません)
これを回避するには、列Aに多数の数式があり、どのセルが更新されているかを特定して特定のセルにコメントを追加する場合は、次のコード
説明するには、式を更新するには、その式の入力セルの1つを変更する必要があります。 A1
の式が=B1 * C1
の場合、B1
またはのいずれかをA1に変更する必要があります。
Worksheet_Change
イベントを使用して、s /シートのセル変更を検出し、Excelの監査機能を使用して依存関係をトレースすることができます。セルA1はB1
とC1
の両方に依存し、この場合、コードTarget.Dependents.Address
は、B1
またはC1
に変更すると$A$1
を返します。
これを考えると、従属アドレスが列Aにあるかどうかを確認するだけです(Intersect
を使用)。列Aにある場合は、適切なセルにコメントを追加できます。
これは、セルに一度だけコメントを追加する場合にのみ有効です。同じセル内のコメントを上書きし続けたい場合は、コメントの存在を最初に確認し、必要に応じて削除するコードを変更する必要があります。
それはうまくいった!もう1つだけ必要ですが、範囲が列範囲( "A:A")であると言うと、どの行/セルがその値を変更したのか知りたいのですが、どうすればいいですか?もう一度ありがとう。 AddComment Text:= "aaaaaaa" – Cloaky
@Cloaky - わかりやすく、Worksheet_Calculateイベントは、ワークシートの式を含むすべてのセルに対して実行されます。したがって、複数の数式を含む列でどのセルが更新されたのかを簡単に把握することはできません。私はこれをハックすると思うかもしれませんが、シートの構造や入力があなたの公式のどこにあるかによって決まります... –
@ Cloaky - 私はypour問題の解決策を得ていると思います...更新された投稿を見てください... –
ここに、クラスを使用する別の方法があります。クラスはセルの初期値とセルアドレスを格納できます。計算イベントでは、アドレスの現在の値と格納されている初期値を比較します。以下の例では、1つのセルのみ(「A2」)を聴くようにしていますが、モジュール内でより多くのセルを聴取したり、クラスを変更してより広い範囲で動作させることができます。 "クラス1" と呼ばれる
クラスモジュール:
Public WithEvents MySheet As Worksheet
Public MyRange As Range
Public MyIniVal As Variant
Public Sub Initialize_MySheet(Sh As Worksheet, Ran As Range)
Set MySheet = Sh
Set MyRange = Ran
MyIniVal = Ran.Value
End Sub
Private Sub MySheet_Calculate()
If MyRange.Value <> MyIniVal Then
Debug.Print MyRange.Address & " was changed from " & MyIniVal & " to " & MyRange.Value
StartClass
End If
End Sub
normallモジュールでクラスを初期化します。ここで
Dim MyClass As Class1
Sub StartClass()
Set MyClass = Nothing
Set MyClass = New Class1
MyClass.Initialize_MySheet ActiveSheet, Range("A2")
End Sub
は私のコードです:
私はそれはひどい見えます知っているが、それは動作します! もちろん、はるかに優れたソリューションがあります。コードの
説明:ブックが開くと、N15までのセルB15の値をPrevValnまで可変PrevValbに
保存されています。 Worksheet_Calculate()イベントが発生すると、以前の値がセルの実際の値と比較されます。値が変更された場合、セルは赤色でマークされます。このコードは、関数を使って書くことができるので、読む時間がずっと短くて簡単です。 カラーリセットボタン(Seenchanges)があります。これにより、色が前の色にリセットされます。
ワークブック:
Private Sub Workbook_Open()
PrevValb = Tabelle1.Range("B15").Value
PrevValc = Tabelle1.Range("C15").Value
PrevVald = Tabelle1.Range("D15").Value
PrevVale = Tabelle1.Range("E15").Value
PrevValf = Tabelle1.Range("F15").Value
PrevValg = Tabelle1.Range("G15").Value
PrevValh = Tabelle1.Range("H15").Value
PrevVali = Tabelle1.Range("I15").Value
PrevValj = Tabelle1.Range("J15").Value
PrevValk = Tabelle1.Range("K15").Value
PrevVall = Tabelle1.Range("L15").Value
PrevValm = Tabelle1.Range("M15").Value
PrevValn = Tabelle1.Range("N15").Value
End Sub
MODUL:
Sub Seenchanges_Klicken()
Range("B15:N15").Interior.Color = RGB(252, 213, 180)
End Sub
シート1:
Private Sub Worksheet_Calculate()
If Range("B15").Value <> PrevValb Then
Range("B15").Interior.Color = RGB(255, 0, 0)
PrevValb = Range("B15").Value
End If
If Range("C15").Value <> PrevValc Then
Range("C15").Interior.Color = RGB(255, 0, 0)
PrevValc = Range("C15").Value
End If
If Range("D15").Value <> PrevVald Then
Range("D15").Interior.Color = RGB(255, 0, 0)
PrevVald = Range("D15").Value
End If
If Range("E15").Value <> PrevVale Then
Range("E15").Interior.Color = RGB(255, 0, 0)
PrevVale = Range("E15").Value
End If
If Range("F15").Value <> PrevValf Then
Range("F15").Interior.Color = RGB(255, 0, 0)
PrevValf = Range("F15").Value
End If
If Range("G15").Value <> PrevValg Then
Range("G15").Interior.Color = RGB(255, 0, 0)
PrevValg = Range("G15").Value
End If
If Range("H15").Value <> PrevValh Then
Range("H15").Interior.Color = RGB(255, 0, 0)
PrevValh = Range("H15").Value
End If
If Range("I15").Value <> PrevVali Then
Range("I15").Interior.Color = RGB(255, 0, 0)
PrevVali = Range("I15").Value
End If
If Range("J15").Value <> PrevValj Then
Range("J15").Interior.Color = RGB(255, 0, 0)
PrevValj = Range("J15").Value
End If
If Range("K15").Value <> PrevValk Then
Range("K15").Interior.Color = RGB(255, 0, 0)
PrevValk = Range("K15").Value
End If
If Range("L15").Value <> PrevVall Then
Range("L15").Interior.Color = RGB(255, 0, 0)
PrevVall = Range("L15").Value
End If
If Range("M15").Value <> PrevValm Then
Range("M15").Interior.Color = RGB(255, 0, 0)
PrevValm = Range("M15").Value
End If
If Range("N15").Value <> PrevValn Then
Range("N15").Interior.Color = RGB(255, 0, 0)
PrevValn = Range("N15").Value
End If
End Sub
あなたが使用したコードの細胞変化は式電池ではありませんので動作しませんが、売る...変更されている:)
あなたがワークシートのモジュールに追加したものを次に示します。
(Udated:行rdependents = Target.Dependentsは、扶養家族がいない場合、エラーを発生させます。このアップデートでは、このの世話をする。)当該セルアドレスの配列をSETINGすることにより、多くの依存性細胞がある場合は、これを拡張することができ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rDependents As Range
On Error Resume Next
Set rDependents = Target.Dependents
If Err.Number > 0 Then
Exit Sub
End If
' If the cell with the formula is "F160", for example...
If Not Application.Intersect(rDependents, Range("F160")) Is Nothing Then
Call abc
End If
End Sub
Private Sub abc()
MsgBox """abc()"" is running now"
End Sub
。次に、配列内の各アドレスをテストし(ループ構造を使用できます)、変更されたセルに対応するサブルーチンを実行します(SELECT CASE ...を使用)。
ようこそStackOverflow ...あなたは答えを与える4歳の質問は、すでに受け入れられた答えを知っていましたか?最近の質問や、受け入れられていない質問に回答することで担当者を育てることをお勧めします(回答が改善されると感じる場合を除いて、答えを参照する必要がある場合を除いて)。 – Chrismas007
コメントありがとうございました。はい、私はそれが古いQであることを認識しますが、人々は答えを探し続けると、ここでは "受け入れられた答え"は私の意見では良いenouphではありません。 –
- 1. C#で変数の値が変更された場合、どのようにコードを実行できますか?
- 2. ロックされたセルのvba excel式が数値に変更されます
- 3. 別のワークシートでセルが変更されたときにVBAを実行
- 4. 別のバックエンドサービスによってデータベース値が変更されたときに、Springでアクションを実行します。
- 5. パワーポイントでスライドを変更するときに、どのようにvbaコードを実行しますか?
- 6. VBAオブジェクトが、私は、コードを実行したときに、VBAを使って、これまでに値を変換しようとしています日付
- 7. VBA型の不一致にコードが実行され、セルが空であるか、if文を、私は次のように持っている何の価値
- 8. $ state.reload()がAngular JSで呼び出された後、どのようにコードを実行できますか?
- 9. Excel VBA - セルに入力すると保存された値の形式が変更されます
- 10. 別のセルの値が変更されたとき(式によって計算される)のセルの自動日付更新
- 11. 圧縮によってハッシュ値が変更されますか?
- 12. 選択したセルの列でのみ実行するようにVBAマクロを変更するにはどうすればよいですか?
- 13. onchangeイベント値がプログラムによって変更されました
- 14. C#コンボボックスの値が入力によって変更されたときに呼び出されるイベントハンドラ
- 15. プレハブに行った変更をどのように保存できますか?
- 16. セルが式で変更されたときにセルをハイライトする
- 17. どのような行がgitで誰によって変更されたかを確認するにはどうすればよいですか?
- 18. 例外の後にコードがどのように実行されますか?
- 19. 変数が変更されたときにどのようにブレークすることができますか?
- 20. セルの値が更新されるたびにExcel VBAマクロを起動するにはどうすればよいですか?
- 21. セルに既に入力されたデータが変更されないようにするコードを修正する
- 22. Excelワークシートがロードされたときに実行するVBAコード
- 23. 変数の値が変更されたときは、どのように確認できますか?
- 24. クエリを実行するときにデータファイルがどのように圧縮されるのかをHiveがどのように知っていますか?
- 25. ユーザーが手動で変更するのではなく、API呼び出しによってセルの値が変更されたときにスクリプトをトリガーするにはどうすればよいですか?
- 26. Google App Engine:cronハンドラがcronによって呼び出されましたが、コードは実行されません
- 27. このコードでAdapterNameの値をどのように変更できますか?
- 28. Zapierによってシートが更新されたときにonEditトリガーを実行
- 29. どのモジュールが変更されたのかは、どのようにグラデルビルドが知っていますか?
- 30. 変数の値とグループによってネストループを実行するにはどうすればよいですか?
特定のセル、またはすべてのセル?手動での変更だけに対応したいのですか、または再計算によって引き起こされた変更にも対応しますか? –
リプレイをありがとう!さて、その特定の列、と私はちょうどrecalcによって引き起こされたイベントをつかむために。ここで私は何をしようとしているのですか?B列には数式があり、A1 = 2と言うことができます。 – Cloaky