あなたはおそらくこれがあなたに起こったことがあるでしょう:あなたはワークブックを開き、いくつかのワークシートを見回してから、ワークブックを閉じます。終了の一部として、Excelは変更を保存するかどうかを尋ねますが、変更は加えていません。見回しただけです。何が得られますか?

内部的には、Excelは一般に「ダーティフラグ」と呼ばれるものを維持しています。このフラグは、ブックになんらかの変更を加えるたびに設定されます。

ブックを保存するたびに、フラグはクリアされます。ブックを閉じるときにフラグが設定されている場合、Excelはブックを保存するかどうかを尋ねます。

セルの編集や何らかの方法でブックの構造を変更するなど、ブックに明示的な変更を加えると、ダーティフラグが明らかに設定される可能性があります。ただし、明示的に何もしなくても設定される可能性があります。時々、Excelはあなたがそれを開いたという事実だけでワークブックの内容に影響を与える何かをします。これにより、ダーティフラグが設定され、保存に関する要求がトリガーされます。

このような自動変更を行う際の2つの大きな原因は、TODAYおよびNOWワークシート関数です。これらは、それぞれシステム日付とシステム時刻を返します。ブックを最初に開いたとき、通常の再計算の過程で更新されます。それらは変更を表すため、Excelはダーティフラグを設定します。

ワークブックに他のワークシートのデータへのリンクが含まれている場合は、ダーティフラグを自動的に設定することもできます。 Excelは、開いたばかりのブックへの変更を表すデータを取得します。セルの選択や別のワークシートへの変更など、ブック内を移動するだけでは、Excelはダーティフラグを設定しません。

この問題を回避する1つの方法は、もちろん、ブックに変更を加えている原因をすべて削除することです。ほとんどの人にとって、これは実用的ではありません。次のように、ブックが閉じる直前に実行される自動マクロを追加することもできます。これは、ThisWorkbookオブジェクトの一部である必要があります。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

ActiveWorkbook.Saved = True End Sub

このマクロは、ダーティフラグ(Savedプロパティ)をクリアするだけです。このアプローチは機能しますが、それを使用することには大きなリスクが伴います。マクロが配置されていると、ブックに正当な変更が加えられた場合でも、Excelは終了時に変更を保存するかどうかを尋ねることはありません。したがって、変更を加えるときは常に、ブックに何かを明示的に保存することを忘れないでください。そうしないと、作業の一部が失われる可能性があります。

このアプローチのバリエーション(忘れられた変更を容認しないもの)は、実際にThisWorkbookオブジェクトのWorkbook_Openプロシージャのマクロ部分を作成することです。

Private Sub Workbook_Open()

ActiveWorkbook.Saved = True End Sub

これで、Excelはブックを開き、再計算し(TODAYやNOWなどの関数に基づいて変更を加えることを含む)、ダーティフラグをクリアします。すぐに閉じると、変更を保存するかどうかを尋ねられません。変更を保存するかどうかを尋ねられますが、このマクロの実行後、つまりワークシートを完全に開いた後に変更を加える場合です。

ダーティフラグを設定する関数を自動的に再計算するだけでなく、ブックを開いたときに自動的に実行されるマクロが1つまたは2つ含まれている可能性もあります。マクロがブックに何らかの変更を加えている場合は、当然、ダーティフラグが設定されます。 VBAエディターをチェックして、これが当てはまるかどうかを確認できます。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(2081)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。