2016-07-19 27 views
0

worksheet_changeイベントが私のために機能しないように、値が式に応じて変更され、ユーザー入力ではなく名前付き範囲のいくつかの変更を監視したいとします。Excel名前付き範囲変更イベント

VBAで次のC#コードと同等の処理を実行できますか?

range.Change += new DocEvents_ChangeEventHandler((Range Target) => { 
    // do something 
}); 
+0

「selection_change」はどのように役立ちますか? –

+0

ええ、あなたはユーザーの介入がない場合、そのトリッキー。選択の変更はそれ以降は役に立たない。 – cyboashu

+0

Thx。自由に下で答えると私は受け入れます。 –

答えて

0

Name.Commentプロパティを使用して、古い値を保存できます。

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
    With ThisWorkbook 
     If .Names("SumOfNumbers").Comment <> Range("SumOfNumbers").Value Then 
      Debug.Print "SumOfNumbers has changed", .Names("SumOfNumbers").Comment, Range("SumOfNumbers").Value 
      .Names("SumOfNumbers").Comment = Range("SumOfNumbers").Value 
     End If 

     If .Names("CountOfNumbers").Comment <> Range("CountOfNumbers").Value Then 
      Debug.Print "CountOfNumbers has changed", .Names("CountOfNumbers").Comment, Range("CountOfNumbers").Value 
      .Names("CountOfNumbers").Comment = Range("CountOfNumbers").Value 
     End If 

    End With 
End Sub 

enter image description here

0

あなたは、評価値が変化したときにイベントを発生させた独自の名前のハンドラを作成することができます。概要で

、次のコードのようなもので(私はそれNamesHandlerと呼ばれてきた)新しいクラスを挿入したい:あなたは、あなたのワークブックのコード、たとえば、中にイベントを消費することができ

Option Explicit 

Public Event ValueChanged(sender As Name) 
Private WithEvents mApp As Application 
Private mOldValues As Collection 

Private Sub mApp_AfterCalculate() 
    Dim n As Name 
    Dim oldVal As Variant 
    Dim newVal As Variant 

    For Each n In ThisWorkbook.Names 
     oldVal = Empty 
     On Error Resume Next 
     oldVal = mOldValues(n.Name) 
     On Error GoTo 0 
     If Not IsEmpty(oldVal) Then 
      newVal = Evaluate(n.Value) 
      If newVal <> oldVal Then 
       mOldValues.Remove n.Name 
       mOldValues.Add newVal, n.Name 
       RaiseEvent ValueChanged(n) 
      End If 
     End If 
    Next 
End Sub 

Private Sub Class_Initialize() 
    Dim n As Name 
    Dim oldVal As Variant 

    Set mApp = Application 
    Set mOldValues = New Collection 

    For Each n In ThisWorkbook.Names 
     oldVal = Evaluate(n.Value) 
     mOldValues.Add oldVal, n.Name 
    Next 
End Sub 

Private WithEvents mNamesHandler As NamesHandler 

Private Sub mNamesHandler_ValueChanged(sender As Name) 
    Debug.Print sender.Name 
End Sub 

Private Sub Workbook_Open() 
    Set mNamesHandler = New NamesHandler 
End Sub 
関連する問題