とてもややこしい計算があって、ワークシート関数を使ったセルの式だけではなく、一部をマクロでやりたくなることがあります。
そのためのパラメータがたくさんあるとします。どの値を変更してもセルの式は自動的に再計算してくれます。しかし、マクロが参照するパラメータが変更されても、自動的には再計算してくれません。そのまま知らないで進むと、予期しないことがおこりそうです。
そこで、マクロが参照するパラメータが変更された場合にだけ、自動的に再計算してくれるような機構を作りたいと思って、やってみました。
まず、該当するパラメータを他と区別する必要がありますが、ここでは、それを文字色で示すことにしました。 redFontColor としていますが、どんな色でもかまいません。”パラメータ1”の色を拾ってきて、その色と同じなら該当、としました。文字色でなくても、書体でも、セルの背景色でも、なんでもよさそうです。
該当するパラメータを変更するたびに再計算するのもうるさいので、ひとつでも変更されていたら、そのワークシートを離れる時にまとめて再計算するようにしました。
該当するパラメータが変更されたかどうかというフラグを用意して、ワークシートの Deactive イベントでチェックし、フラグが立っていたら再計算を行う、というだけのものです。
したがって、パラメータを入力するワークシートと、結果を表示したり参照したりするワークシートは異なっていなくてはならない点に注意してください。
標準モジュール
'----- 「赤字」セルが変更されたかどうかのフラグ
Private redCellChangedFlag As Boolean
'----- 「赤字」の色を取得
Private Property Get redFontColor()
redFontColor = Range("パラメータ1").Font.Color
End Sub
'----- 最初にフラグを降ろしておく
Public Sub WorksheetActivate()
redCellChangedFlag = False
End Sub
'----- 変更したセルの文字色が「赤」だったらフラグを立てる
Public Sub IsChangedCellRed(cell)
redCellChangedFlag = redCellChangedFlag Or (cell.Font.Color = redFontColor)
End Sub
'----- フラグが立っていたら再計算を実行
Public Sub WorksheetDeactivate()
If redCellChangedFlag Then execRecalc
End Sub
'----- 再計算の実行
Private Sub execRecalc()
MsgBox "再計算を実行します", vbOKOnly, ""
End Subパラメータを入力するワークシートは複数あるかもしれませんが、該当するパラメータを含むすべてのワークシートに、次のイベント処理を入れておきます。
各ワークシート
'----- そのワークシートが開かれた際の処理
Private Sub Worksheet_Activate()
WorksheetActivate
End Sub
'----- セルの値を変更した場合の処理
Private Sub Worksheet_Change(ByVal Target As Range)
IsChangedCellRed Target
End Sub
'----- そのワークシートを離れる際の処理
Private Sub Worksheet_Deactivate()
WorksheetDeactivate
End Sub