category name  »  page title date

マクロによる再計算の実行

とてもややこしい計算があって、ワークシート関数を使ったセルの式だけではなく、一部をマクロでやりたくなることがあります。
そのためのパラメータがたくさんあるとします。どの値を変更してもセルの式は自動的に再計算してくれます。しかし、マクロが参照するパラメータが変更されても、自動的には再計算してくれません。そのまま知らないで進むと、予期しないことがおこりそうです。

そこで、マクロが参照するパラメータが変更された場合にだけ、自動的に再計算してくれるような機構を作りたいと思って、やってみました。

まず、該当するパラメータを他と区別する必要がありますが、ここでは、それを文字色で示すことにしました。 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

パラメータ1と同じ文字色のパラメータ4、5の値が変更された時だけ、このワークシートを離れるタイミングで再計算が行われます。