worksheet_change
イベントが私のために機能しないように、値が式に応じて変更され、ユーザー入力ではなく名前付き範囲のいくつかの変更を監視したいとします。Excel名前付き範囲変更イベント
VBAで次のC#コードと同等の処理を実行できますか?
range.Change += new DocEvents_ChangeEventHandler((Range Target) => {
// do something
});
worksheet_change
イベントが私のために機能しないように、値が式に応じて変更され、ユーザー入力ではなく名前付き範囲のいくつかの変更を監視したいとします。Excel名前付き範囲変更イベント
VBAで次のC#コードと同等の処理を実行できますか?
range.Change += new DocEvents_ChangeEventHandler((Range Target) => {
// do something
});
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
あなたは、評価値が変化したときにイベントを発生させた独自の名前のハンドラを作成することができます。概要で
、次のコードのようなもので(私はそれ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
「selection_change」はどのように役立ちますか? –
ええ、あなたはユーザーの介入がない場合、そのトリッキー。選択の変更はそれ以降は役に立たない。 – cyboashu
Thx。自由に下で答えると私は受け入れます。 –