2016-08-18 1 views
0

私は、セルが特定の値を含むように更新されるたびに実行したいSubを持っています。セルの値が更新されるたびにExcel VBAマクロを起動するにはどうすればよいですか?

今私は、次のようなコードを使用しています:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    If Target.Cells.Count = 1 Then 
    If Target.Value = XYZ Then 
     my_sub a, b, c 
    End If 
    End If 
End Sub 

問題は、今私が直接これらのセルを編集するマクロのみ火災は、他の細胞の変化はこれらの細胞を強制しない場合は変更するということです。

さらに、これらのセルは明確に定義されていないため、たとえば「A5が変更されたとき」はハードコーディングできません。私は、ワークブック内のセルが更新されるたびに(手動または数式を通じて)自分の条件を満たすたびにこれを実行する必要があります。あなたのターゲットを監視する必要がある式を持つ単一のセルのみで、これは動作します提供

+2

ここでは何が正しく機能していませんか?数式が変更されたときにこれが捕捉されないという事実はありますか?その場合は、 'Worksheet.Calculate'イベント(https://msdn.microsoft.com/en-us/library/office/ff838823.aspx)を参照してください。 – Mikegrann

+2

また、上記のコードが実際に使用しているものと異なることを確認してください。そうであれば、代わりに 'If target.value =" XYZ "'を使用しますか?マクロでは何が動作しませんか? – BruceWayne

+0

セルを直接編集すると起動します。他のセルの変更によって強制的に変更された場合は発生しません。 Target引数がないので、Worksheet.Calculateでそれを動作させる方法がわかりません。そして、いいえ、これはまさにコードではないので、XYZの引用符は問題ではありません – user1923052

答えて

2

Option Explicit 

Dim tarVal As Variant 

Private Sub Worksheet_Activate() 

    tarVal = ActiveSheet.Range("A1").Value ' change range parameter to the address of the target formula 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim tempVal As Variant 

    tempVal = ActiveSheet.Range("A1").Value 

    If tempVal <> tarVal Then 
     tarVal = tempVal 

     ' your code here 

     MsgBox "The value of A1 has changed" ' for testing purposes only, delete later 
    End If 

End Sub 

編集

次のコードでは、セルの全範囲で動作し、自動計算がオンになっている場合のみです。監視対象のセルが連続していない場合は、ターゲット範囲を定義するときにunion文を使用してください。 (この例では、ターゲット範囲はA1:A10です)。これは、対象範囲内の式の1つのみが一度に値を変更できるという前提の下にあります。複数のターゲット式で実行できる場合は、Worksheet_ChangeサブルーチンのExit forを削除してください。

Option Explicit 

Dim tarCellCount As Long 
Dim tarRng As Range 
Dim tarVals As Variant 

Private Sub Worksheet_Activate() 

    Dim i As Long 
    Dim cll As Range 

    Set tarRng = ActiveSheet.Range("A1:A10") ' change range parameter to the addresses of the target formulas 

    tarCellCount = tarRng.Cells.count 
    ReDim tarVals(1 To tarCellCount) As Variant 

    For Each cll In tarRng 
     i = i + 1 
     tarVals(i) = cll.Value 
    Next cll 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim changeBool As Boolean 
    Dim i As Long 
    Dim cll As Range 
    Dim tempVal As Variant 

    For Each cll In tarRng 
     tempVal = cll.Value 
     i = i + 1 

     If tempVal <> tarVals(i) Then 
      tarVals(i) = tempVal 
      changeBool = True 
      Exit For 
     End If 
    Next cll 

    If changeBool Then 

     ' your code here 

     MsgBox "The value of one of the cells in the target range has changed" ' for testing purposes only, delete later 
    End If 

End Sub 
-1

ターゲットは、より多くのセルを含むことができる範囲です。このコードはあなたのために働くはずです。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    For Each cell In Target.Cells 
    If cell.Value = XYZ Then 
     my_sub a, b, c 
    End If 
    Next cell 
End Sub 

編集:私はあなたが式が定義された値を更新されたときにもその火をたいていることがわかり。すべてのセルをチェックすると遅くなることがありますが、実際にはファイルのサイズによって異なります。それを行う方法をあなたに教えるためのコードがいくつかあります。

Private Sub Workbook_SheetCalculate(ByVal sh As Object) 
    For Each cell In sh.Cells.SpecialCells(xlCellTypeFormulas).Cells 
     If cell.Value = XYZ Then 
      my_sub a, b, c 
     End If 
    Next cell 
End Sub 
1
  1. 命名式(名前付き範囲)を追跡するためにあなたの細胞を追加します。私は、発生箇所の数が

コードを変更するかどうかをチェックするためにCalculateイベントを使用して追跡したい値が

  • この範囲内で発生した回数を追跡する静的変数を使用し
  • rngValueを使用しました

  • +0

    私は、静的な 'CountIf'と 'Worksheet_Calculate'イベントです。しかし1つの欠点は、監視されているすべての計算式の値が同じであることを前提としていることです。これは常に当てはまるとは限りません。しかし一般に、値が何らかの種類のチェックサムまたはそれ以外の場合を除き、完全に同じ値を含む数式のセルの全範囲を持つことは珍しいことです。 – Miqi180

    関連する問題