特定のブックの全シートを再計算する

複数のブックを開いた状態で特定のブックのみを再計算するコード

'ループ用の変数宣言
Dim zz対象Ws As Worksheet

'特定のブックの全シートを再計算
For Each zz対象Ws In Workbooks("Book1.xlsx").Worksheets
zz対象Ws.Calculate
Next zz対象Ws

再計算を行うには対象のオブジェクトに対して「Calculate」メソッドを使用します
しかし、Workbookオブジェクトにはこのメソッドがありません
そのため、複数のブックを開いた状態で1つだけのブックを再計算するには少し工夫が必要となります
それがこの記事コードになります

このコードを利用することで、複数のブックを開いた状態であっても特定のブックのみを再計算することが可能となるので極端に時間のかかる再計算の不要なブックを除外することが可能になります

コード解説

コードの流れ自体は非常に簡単なものです
Worksheetオブジェクトをループで再計算を実行していくだけです

'ループ用の変数宣言
Dim zz対象Ws As Worksheet

まずはループで利用するためのWorksheetオブジェクトを代入する変数を宣言します
この時の型はObject型でも構いませんが、Worksheet型にしておくとコード入力の際にインテリセンスが利用できるので便利です

'特定のブックの全シートを再計算
For Each zz対象Ws In Workbooks("Book1.xlsx").Worksheets
~~~
Next zz対象Ws

次にループ処理の個所です
ForEachループによって特定のWorkbookに含まれるWorksheetを全てループします

ここで大切なこととして、Excelのシートにはオブジェクトが複数あります
主にはWorksheetとSheetです
特に後者のSheetオブジェクトはマクロの記録でよく出てきます

For Each zz対象Ws In Workbooks("Book1.xlsx").Sheets
~~~
Next zz対象Ws

このコードの様にWorksheetオブジェクトでは無く、 Sheetオブジェクトとしてもほとんどの場合問題なく動作します

このSheetオブジェクトにはグラフシートやマクロシートなどの通常Excelで使用する方眼紙シート以外のものも含まれます
そのため再計算を行う目的であれば、Worksheetオブジェクトを指定する方が良いです

そして、「Workbooks(“Book1.xlsx”)」の引数の文字列を対象とするブックの名前に変更すれば任意のブックを指定することが出来ます

zz対象Ws.Calculate

ループ内処理はWorksheetオブジェクトに対してCalculateメソッドを実行しているだけです

この様にして複数のブックを開いた状態で特定のブックのみの全シートを再計算させることが出来ます
使いどころが限定的ですが、知っていれば処理時間を短くすることも可能なので有用だと思います

全ブックまとめて再計算するほうがええねん、という方は以下の記事を確認してください

ブックが変更されたか調べる

ブックがなんらかの変更を加えられているかを判定するSavedプロパティについて

'ブックが変更されたかを調べる
Debug.Print ActiveWorkbook.Saved

ブックのデータが変更されて未保存かを調べるには「Saved」を使用します

基本的には保存されているかを調べるプロパティですが、戻り値で変更されているかを判定することができます

「True」であれば変更はされていません
「False」であればなんらかの変更が加えられています

ただ、セルを編集状態にしただけでも変更とみなされるようになるので処理中以外ではあまり使用することは無いかもしれません

また、ブックを閉じる記事でもあるようにこのプロパティに「True」を設定すると変更が加えられていても、保存確認メッセージを表示せずにブックを閉じることができます

ブックを閉じる・保存せずに閉じる

ブックを保存してから閉じる、保存せずに閉じるのコードと保存済みにする設定のコード

'アクティブブックを保存して閉じる
ActiveWorkbook.Close True
'アクティブブックを保存せずに閉じる
ActiveWorkbook.Close False
'アクティブブックを保存済みにする
ActiveWorkbook.Saved = True

ブックを閉じるには「Close」を使用します
×ボタンで終了を行う操作と同じ動きをします

引数の指定で保存を実行するかどうかを指定できます
「True」を指定すれば、上書き保存を実行して閉じます
「False」を指定すれば、保存せずに閉じます

データの入力などを行っておけば上書き保存を実行して閉じるし、参照するだけで関数の自動計算などの更新はせずに閉じるときは未保存で閉じます

「False」を指定して、このコードを実行すると保存の状態に関わらずブックは閉じられます

もう一つの方法として保存状態を変更する方法があります
リファレンスではこちらの使用が紹介されています

保存状態の変更は「Saved」を使用します
このプロパティを「True」にすると保存済みの状態になります
なので、この状態でブックを閉じれば保存確認は行われません
引数を指定せずに、「ActiveWorkbook.Close」だけで閉じることができます

そもそも「DisplayAlerts」プロパティにより、メッセージを表示させない設定も可能ですが、プロパティの設定などで対応できるものはそちらで対応したほうが予期せぬ動きには対処しやすいとおもいます

ブックの上書き・名前を付けて保存

処理を実行したブックや新規作成したブックを上書きやマクロ有効・無効の標準ブックとして保存するコード

'アクティブブックを上書き保存する
ActiveWorkbook.Save
'アクティブブックを名前を付けてマクロ有効ブックで保存する(同じ場所)
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Book2", xlOpenXMLWorkbookMacroEnabled
'アクティブブックを名前を付けて標準形式保存する(同じ場所)
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Book2", xlOpenXMLWorkbook

ブックを上書き保存するには「Save」を使用します

上書き保存するメソッドですが、未保存の新規作成ブックに実行した場合は現在の名称で、Excelの現在のフォルダに保存されます
Excelの通常操作のように、名前を付けて保存の画面が開かれるわけでは無い点に注意してください

現在のフォルダとは、Excelがその時点で参照中のフォルダで作業フォルダやカレントフォルダともいいます
この現在のフォルダは事前の操作によって変化するので注意が必要です

名前を付けて保存をするには「SaveAs」を使用し、引数にはパス名を含めたファイル名までを指定します
マクロの記録では、拡張子まで含めて指定されますがブックの種類を指定すると自動的に付与されるので必要はありません

2つ目のコードでは、このマクロのあるファイルと同じ場所にマクロ有効ブックとして保存しています
「ThisWorkbook.Path」は、このプロシージャがあるファイルが保存されたフォルダ名までのパスです
なのでこれにフォルダ内を表す「\」を結合してファイル名を入力します

ちなみに、画面で「\」はどう表示されているでしょうか?
実はこれは文字の読み込みで表示が変化します
(この記事内にある解説を確認してください)

「Path」プロパティではフォルダ名までなので、このフォルダ内記号を入力後に、ブック名を含めて指定します

引数の2つ目では、ブックの種類を指定することが出来ます
「~~, xlOpenXMLWorkbookMacroEnabled
種類がどんどん増えていってますが、使用するのはそれほど多くは無いと思います

3つ目の例コードでは標準形式が指定されています
これはマクロを含まない形式なるので、マクロが存在する場合はマクロが消失する旨のメッセージが表示されます

これを継続実行する事でマクロが全て削除されたブックが完成します
この動きを利用して、あえてマクロを削除することでセキュリティに関する対応をいちいち行わなくて済むブックを作成することもできます

また、パス名を省略してファイル名のみで保存することはできますがその際は上記にもあるExcelの現在のフォルダが対象となります

そのフォルダを変更するコードはありますが、そんなコードを実行するぐらいならパス名を指定するほうがいいです


関連の記事

新規ブックの作成

空白のブックを新規作成するコード

'ブックを新規作成する
Workbooks.Add

ブックを新規作成するには「Workbooks.Add」を使用します

このコードを実行すると、Excelでの操作でファイルタブから新規の空白ブックの作成と同じ動作をします

またこの作成時に自動的に「Book連番」という形式で名称がつけられます
引数には新規作成するブックの初期シートを指定でき、指定した場合はシート名に連番が付いたものがブック名になります
あまり引数で指定して作成することはないと思いますので、省略した例の形でいいです

この新規作成は、Excelの設定された初期値が適用されますので変更している場合は注意してください
特にワークシートの初期枚数に処理時は注意が必要です

またこの新規作成ブックを扱う際には、ブック名での指定だとすこし不便になりますので、基本的にはオブジェクト変数に代入して扱うようにしてください

ブックを選択する

ブックを選択する方法の解説とそのコード使用時の注意点について

'起動したブックを選択
Workbooks("Book1.xlsx").Activate
'新規作成したブックを選択
Workbooks("Book2").Activate
'コードのあるブックを選択
ThisWorkbook.Activate
'開いているブックのインデックス番号で選択
Workbooks(2).Activate

ブックを選択するには「Activate」を使用します

ブックの選択方法の違いによる動き
コードの動き、下にちょっとExcelのタイトル

この際にブック名を拡張子まで含めて指定することで、特定のブックを選択できます

例コードの1つ目と2つ目で拡張子を含むか含まないかの違いがあります
これが新規作成ブックの注意点です

ブックの新規作成時は、ファイルの拡張子が決まっていません
そのため、新規ブックに関しては拡張子を含めないファイル名で指定を行います

「Workbooks(“Book1.xlsx“)」標準形式で保存済み
「Workbooks(“Book2“)」未保存

ブックの指定時に名前が間違っていた時のエラー表示
保存済みのブックを拡張子を指定しなかった場合

そして、当然ですが処理の途中でBook2を保存した場合、以降は拡張子を含めないと画像の様にエラーになってしまいます
こういった観点からも、新規作成したブックに処理を継続する場合はオブジェクト変数に代入して処理をしたほうが確実にブックを特定できます

3つ目の例コードでは相対的な選択方法になります
実行中のプロシージャのブックを選ぶには「ThisWorkbook.Activate」を使用します

「ThisWorkbook」というのが、実行中処理の親ブックとなります
上記のブック名指定よりも確実かつ可読性が高いので、自分のブックを使用する場合はこのオブジェクトを使用します

また、オブジェクト変数に入れるのが面倒な場合はインデックス番号で指定する方法もいいと思います
これは起動した順番になっているので、処理のあるブック以外を閉じる処理を入れるか、処理開始時点のブック数を取得しておき新規作成を行えば新規作成されたブックのインデックス番号が特定できます

このインデックス番号で処理を行えば名前が変わっても、保存して拡張子が付いても問題なく処理が行えるようになります