'ループ用の変数宣言
Dim zz対象Ws As Worksheet
'特定のブックの全シートを再計算
For Each zz対象Ws In Workbooks("Book1.xlsx").Worksheets
zz対象Ws.Calculate
Next zz対象Ws
再計算を行うには対象のオブジェクトに対して「Calculate」メソッドを使用します。
ただし、Workbookオブジェクトにはこのメソッドが存在しません。
そのため、複数のブックを開いている状態で特定のブックだけを再計算するには、対象ブック内の全シートをループして「Worksheet.Calculate」を実行する必要があります。
このコードを利用すれば、複数のブックを開いている場合でも特定のブックだけを再計算することが可能となり、処理に時間のかかる不要なブックの再計算を除外できます
コード解説
コードの流れは非常にシンプルです。
対象のブック内の Worksheet オブジェクトをループ処理し、それぞれに対して再計算を実行するだけです。
'ループ用の変数宣言 Dim zz対象Ws As Worksheet
まずはループ処理で使用するための変数を宣言します。
この変数には Worksheet オブジェクトを代入するため、型は Object 型でも構いませんが、Worksheet 型にしておくとコード入力時にインテリセンスが利用できるので効率的です。
'特定のブックの全シートを再計算
For Each zz対象Ws In Workbooks("Book1.xlsx").Worksheets
~~~
Next zz対象Ws
次にループ処理の部分です。
For Each ループを使うことで、特定の Workbook に含まれるすべての Worksheet を順番に処理できます。
ここで注意すべき点として、Excel のシートには複数のオブジェクトが存在します。
主に Worksheets と Sheets があり、特に後者の Sheets オブジェクトはマクロ記録でよく利用されます。
ただし、通常のコード記述では Worksheets を明示的に扱う方が分かりやすく、インテリセンスも効くため効率的にコード作成が行えます。
また、Workbooks(“Book1.xlsx”) の引数の文字列を対象とするブックの名前に変更すれば、任意のブックを指定することができます。
For Each zz対象Ws In Workbooks("Book1.xlsx").Sheets
~~~
Next zz対象Ws
このコードのように Worksheet オブジェクトではなく、Sheets オブジェクトとしても多くの場合問題なく動作します。
ただし Sheets オブジェクトには、グラフシートやマクロシートなど通常の Excel で使用するワークシート以外のものも含まれます。
そのため再計算を目的とする場合は、Worksheet オブジェクトを指定する方が適切です。
zz対象Ws.Calculate
ループ内の処理は Worksheet オブジェクトに対して Calculate メソッドを実行しているだけです。
このようにすることで、複数のブックを開いている状態でも特定のブックのみの全シートを再計算させることができます。
使いどころは限定的ですが、知っていれば処理時間を短縮できる場合もあるため有用です。
「全ブックまとめて再計算したい」という方は、以下の記事をご確認ください。
関連の記事

























