Application.Volatileについて

Application.Volatileメソッドはユーザー定義関数を揮発性にする。揮発性の動きの解説

'揮発性にする
Application.Volatile

「Application.Volatile」メソッドは、ユーザー定義関数を揮発性にするコードです

揮発性とは、引数に関係の無いセルが更新された時でも再計算が実行される状態になることを言います
通常は、引数に関係あるセルが更新された時に再計算は実行されます

揮発性ではない通常の再計算

ユーザー定義関数のコード画像
ユーザー定義関数のコード

まずは、画像のようなユーザー定義関数を作成したとします
この関数は、計算時に現在日時を文字列付きで返す関数になります

ワークシートに関数を入力したときの動き
ワークシートに反映した時

この関数をワークシートのセルに入力します
すると、その日時と文字列が結合されてセルに表示されます
ここでは「最終計算日時: 2020/01/09 21:59:55」が返されています
実際に関数を確定させて計算させた時間です

再計算されるときの動き
再計算時の動き

次に、この関数の関係するセルは引数には指定は無いので自分のセルのみです
なので、一度入力モードにしてそのまま確定させます
すると、再計算が実行されて「最終計算日時: 2020/01/09 22:03:14」が返されます

しかし、A2を更新した時点では更新されません
関係するセルではないためです

このままでは、この関数は本来シートのデータを更新させた履歴を表示する関数という役割を果たさずに、ただこの関数を入力した時間を表示するだけの関数になってしまい何の意味もない関数になります

メソッドを使用した揮発性の再計算

揮発性にしたユーザー定義関数のコード画像
メソッドの挿入

そこで、このメソッドを挿入します
このメソッド自体はどこに入れても構いませんが、揮発性にしていることを分かり易くするために、最上部に挿入してください
これでこのユーザー定義関数は揮発性になったため、関係のないセルが更新されても再計算が実行されます

揮発性になった関数の再計算の動き
揮発性になったユーザー定義関数

今回の動きでは、A2の更新をしただけで「最終計算日時: 2020/01/09 22:58:10」が返されています

このメソッドでは、同じブック内のセルが更新された時に再計算されるようになるため、このユーザー定義関数の文字列にユーザー名などを追加すれば
誰がいつ最後に更新したかが分かる関数になります

こういった、関係ないセルを更新した時でも再計算を実行させたい場合に使用するメソッドです

揮発性にすることの注意点

このメソッドを使用すると、再計算の回数が激増します
なので再計算にかかる時間が大幅に増える可能性があります

また、関係の無いセルを更新するだけで再計算するということはセル参照するような処理にしていた場合は予期しないセルの動きによるバグの可能性もあります

このメソッドは、とりあえず使うような代物ではなく
明確に処理の流れを理解した上で必要なら使用するものです

ユーザー定義関数にハマって、すぐに使ってしまう愚を犯さないようにしてください、誰かさんはこれを入れてエラー無視までいれて強制的に処理を走らせていましたが、今考えるとすごい話です

なお、こんな処理ならChangeイベントの方が向いていると思いますが、目的に対する手段がいろいろあるのもVBAの楽しいとこですね