VBA Calculate – ワークブック、ワークシート、または範囲を今すぐ計算する
このチュートリアルでは、VBAのさまざまな計算オプションのすべてを学びます。
Excelのデフォルトでは、ワークブックが変更されるたびに、開いているすべてのワークブックが計算されます。これは、セルA1が変更された場合、セルA1に依存しているすべてのセルを更新するなど、計算ツリーに従うことによって行われます。 しかし、セルが変更されるたびにExcelが再計算を行うため、VBAコードの実行速度が極端に遅くなる可能性があります。 VBAの速度を上げるために、プロシージャの最初に自動計算を無効にすることがよくあります。処理の始めに、
Application.Calculation = xlManual
として自動計算を無効にし、処理の最後に再有効化します。
Application.Calculation = xlAutomatic
しかし、プロシージャの中でワークブックのすべて(または一部)を計算したい場合はどうすればよいのでしょうか。 このチュートリアルの残りの部分では、その方法を説明します。
今すぐ計算する
Calculateコマンドを使用すると、すべて(開いているすべてのワークブック)の再計算が可能です。
Calculate
通常、この方法が最も適しています。しかし、より狭い範囲で計算を行い、スピードを向上させることも可能です。
シートのみを計算する
特定のシートのみを計算するようにVBAに指示することもできます。 このコードでは、アクティブなシートのみを再計算します。
ActiveSheet.Calculate
このコードはSheet1を再計算します。
Sheets("Sheet1").Calculate
範囲を計算する
より狭い範囲の計算が必要な場合は、セルの範囲のみを計算するようにVBAに指示することができます。
Sheets("Sheet1").Range("a1:a10").Calculate
個別の計算式を計算する
このコードでは、個々のセルの数式だけを計算します。
Range("a1").Calculate
ワークブックを計算する
一つのワークブックのみを計算するVBAオプションはありません。一つのワークブックのみを計算したい場合であっても、Calculateコマンドを使用するしかありません。
Calculate
この方法では開いているすべてのワークブックを計算してしまいますので、どうしてもスピードを重視する必要がある場合、一度に開くワークブックを厳選するという方法もあります。
ワークブックを計算する – 動作しない方法
VBAで一つのワークブックだけを計算させる方法はいくつかありますが、どれも完全には動作しません。 以下のコードは、ワークブック内の各ワークシートをループして、一度に1シートずつ再計算を行います。
Sub Recalculate_Workbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Calculate
Next ws
End Sub
このコードは、すべてのワークシートが「自己完結型」である場合、つまり、どのシートも他のシートを参照するような計算を含んでいない場合にはうまく機能します。
しかし、ワークシートが他のシートを参照している場合、計算が正しく更新されないことがあります。 例えば、Sheet1の計算をSheet2より先に行い、Sheet1の計算式がSheet2の計算に依存している場合、計算式に最新の値が含まれないことになります。
また、すべてのシートを一度に選択し、アクティブシートを計算することもできます。
ThisWorkbook.Sheets.Select
ActiveSheet.Calculate
ただし、この場合も同じ問題が発生します。