トップ回答者
Excelをセーフモードで開き、VBEを開くと、破損Excelが修復する件に関しまして

質問
-
以下、Microsoftコミュニティでご質問させて頂きましたが解決せず、
MSDN フォーラムに質問を投稿してみるのもいいかもしれないという
アドバイスを頂きましたため、投稿させて頂きます。
--------------------------------------------------
《事象》
Excel2016を使用していて、突然、以下、①②③等のアラートが出て、ファイルが使用できなくなります。
①Microsoft Excelは動作を停止しました
②プロジェクトまたはライブラリが見つかりません。
③ブックが破損しています、修復しますか
※いずれも、壊れる前のファイルは、
外部参照や外部リンクがないこと、VBAのデバックでコンパイルに問題がないこと、
VBAのツールで参照設定に問題がないこと、は確認済みです。
また、破損ファイルを、
新規ファイルにコピーし保存し直しても改善されないこと、
共有サーバーでもローカルサーバーでも問題が改善されないこと、
Officeの修復では改善されないこと、は確認済みです
このファイルに対し、以下手順を行うと、Excel2016で問題なく使用できるようになります。
[1]破損したファイルをExcel2016のセーフモードで開く
[2]VBEを開く(開くだけで何もしない)
[3]上書き保存する
※VBEを開かない場合は修復されないことは確認済みです
《ご質問》
セーフモードでも、VBEを開くと何か行われるのでしょうか。
(VBEを開くと、マクロは無効でもユーザー定義のライブラリが参照されなおす、等)
ご存知の方がいらっしゃいましたら、教えて頂けますと幸いでございます。
∟一般的なトラブルシューティングによるExcel破損原因特定に関しましては、別途、行っておりますため、
「Excel 2016 をセーフモードで起動した際、VBEに対してどのようなことが行われるのか」
に関してご存知の情報がございましたら、ご教授頂けると嬉しく思います。
何卒、宜しくお願いいたします。
PC環境:Windows7 Professional SP1(64bit)/主メモリ16GB/Excel2016のバージョン16.0.4639.1000
--------------------------------------------------
**追記 2018年6月11日**
破損したファイルでVBEを立ち上げ、メニューのデバッグを確認すると、
「のコンパイル」(本来は「VBA Projectのコンパイル」)と表示されます。
同じファイルをセーフモードで開くと、正しく「VBA Projectのコンパイル」と表示されるため、
この状態の違いが何か影響しているのではないかと考えております。- 編集済み livems_tare 2018年6月11日 6:31
回答
-
> ◯「VBE保存して修復したファイル」は2つ出現するが、
> 「破損しているファイル」は1つしか出現しないモジュール
> ◯「破損しているファイル」は2つ出現するが、
> 「VBE保存して修復したファイル」は1つしか出現しないモジュール上記の意味が私にはわかりませんでした。
私が確認してほしかったのは、「ロードされているモジュールに差異がなかったのか?」ということです。
つまり Excel プロセス空間に、特定のモジュールがロードされているか否かです。
「ロードされているか否か」の質問に対して、なぜ「2つ出現する」や「1つしか出現しない」といった個数が出てくるのか、私にはわかりませんでした。> もし、調査方法が問題ないのであれば、
> お馬鹿様の方で何かファイルがなおる理由について仮設は立てられますでしょうか。あくまでも私見ですが、ファイル修復を行うために必要なモジュール (DLL) がロードされないケースがあるのでは。。。と推測しています。
必要な DLL がロードされていない、あるいはロードできないので、それに対応する処理も実行されないのでは。。。ということです。
"msctf.dll" は "Text Service Framework" 関連のモジュールだと思いますが、もしこのモジュールのロード状況に差異があるのであれば、ASCII データのみの場合にどーなるか等、いろいろ検証すべき対象が見えてきます。
その検証すべき対象を見つけ出す手掛かりとして、「ロードされているモジュールに差異がなかったのか?」の確認を提案しました。
いずれにせよ、現象的な違いが確実に起きているのであれば、その違いを発生させる要因は必ず存在するはずです。
現段階では、仮説を立てるための要素すら見つけていないのですから、仮説を立てられるわけがありません。
- 編集済み お馬鹿 2018年8月13日 6:52
- 回答としてマーク livems_tare 2018年12月27日 5:44
すべての返信
-
クリーンブートでの検証は実施されましたか?
試していないのであれば、とりあえず下記サイト情報を参考に、クリーンブートでの検証をお勧めします。
---------------------------------------------
Windows でクリーン ブートを実行する方法
https://support.microsoft.com/ja-jp/help/929135/how-to-perform-a-clean-boot-in-windows
---------------------------------------------上記サイトで説明されているクリーンブート設定を行ったら PC を再起動させ、Excel でその問題現象が発生するか確認してみてください。
もしクリーンブートで発生しないのであれば、3rd ベンダー製のサービス プロセスの影響であると考えられます。
(3rd ベンダー製サービス プロセスのほとんどはセーフ モードでは無効となるため、クリーンブートで発生しないのと同じ理由。。。。ということになります。) -
お馬鹿様
先程、質問事項に情報を追記させて頂きました。
ご返信ありがとうございます!
> クリーンブートでの検証は実施されましたか?
> 試していないのであれば、とりあえず下記サイト情報を参考に、クリーンブートでの検証をお勧めします。
> 上記サイトで説明されているクリーンブート設定を行ったら PC を再起動させ、
> Excel でその問題現象が発生するか確認してみてください。
ご記載頂いたサイトを確認しながら、クリーンブート設定を行いました。
(各種機能停止後、再起動し、ウイルス対策ソフト等常駐プログラムが停止されていることを確認しました)
しかし、残念ながら、クリーンブート設定をしていない状態と同様、
破損したファイルは破損されたままで、セーフモードで上述操作を行ったときにファイルが修復されました。
記載いたしましたとおり、通常モードでは(クリーンブート設定をしている状態でも)、
VBEのデバッグで「VBA Project」が正しく定義されないように思うのですが、
ここから考えられうることはございますでしょうか。
何卒、宜しくお願い致します。 -
質問文を読むと、セーフ モード起動時にだけ特定のアプリに対して何かを行っているとお考えの様ですが、基本的にそのようなことはないと思います。
下記 wiki サイトでも説明されていますが、セーフ モードは「必要最低限のソフトウェア構成」で起動されるだけです。
-------------------------------------------
セーフモード
https://ja.wikipedia.org/wiki/セーフモード
------------------------------------------つまり余計なモノはロードされない、ということです。
余計なモノがロードされないから、余計なコトが起きらない。
ご質問のケースを考えた場合、質問者さんの PC 環境に「余計なモノ」がインストールされているために「余計なコト」がされてしまい、その結果として Excel プロセスのクラッシュさらにはデータ ファイルの破損が起きている。。。。ということなのでは?
だとしたら調べるべきは、「セーフ モード時に何が行われているのか」ではなく、「通常起動時に余計なモノが存在していないか」ではないでしょうか?
さらに言えば本件の場合、「Microsoft Excelは動作を停止しました」即ち Excel プロセスのクラッシュが発生していることから、ライブ デバッグやプロセス ダンプ解析を実施すれば、おのずと「余計なモノ」があぶりだされると思います。ライブ デバッグやプロセス ダンプ解析を実施するスキルがないのであれば。。。
"Process Explorer" か "Process Monitor" を使って、セーフ モード起動時と通常起動時で、Excel プロセスにロードされている DLL 等のモジュールに差異がないかを丹念に調べれば、何に起因しているのかが見えてくると思います。 -
お馬鹿様
ご回答、誠に、ありがとうございます!
> 質問文を読むと、セーフ モード起動時にだけ特定のアプリに対して何かを行っているとお考えの様ですが、
> 基本的にそのようなことはないと思います。
ありがとうございます。
今回、本件のようなご質問をさせて頂きました背景としましては、
以下のようにVBEを立ち上げるだけでファイルが修復される理由を知りたいと考えたためです。
たびたびのご質問となり、恐縮でございますが、こちらはどのうようなことが考えられますでしょうか。
[1]破損したファイルをExcel2016のセーフモードで開く
[2]上書き保存する
⇒破損ファイルはなおらない
[1]破損したファイルをExcel2016のセーフモードで開く
[2]VBEを開く(開くだけで何もしない)
[3]上書き保存する
⇒破損ファイルがなおる
> 「セーフ モード時に何が行われているのか」ではなく、「通常起動時に余計なモノが存在していないか」ではないでしょうか?
> さらに言えば本件の場合、「Microsoft Excelは動作を停止しました」即ち Excel プロセスのクラッシュが発生していることから、
> ライブ デバッグやプロセス ダンプ解析を実施すれば、おのずと「余計なモノ」があぶりだされると思います。
> ライブ デバッグやプロセス ダンプ解析を実施するスキルがないのであれば。。。
> "Process Explorer" か "Process Monitor" を使って、セーフ モード起動時と通常起動時で、Excel プロセスにロードされている
> DLL 等のモジュールに差異がないかを丹念に調べれば、何に起因しているのかが見えてくると思います。
ご丁寧なご説明、誠に、ありがとうございます!こちら、進めてまいります。
何卒、宜しくお願い致します。 -
-
お馬鹿様
先日は、Process Monitorでの調査に関して教えてくださり、
誠に、ありがとうございました!
<調査結果>
破損ファイルが修復される場合、以下が、プロセスモニターに出ておりました。
(2つの操作を行った際の、主な差分は以下でした。)
Operation Path
CloseFile C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
CloseFile C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB
※補足 現在、Office2016を使用しておりますが、Office2007も共存しております。
ご質問
このプロセスモニターの動作が起こる際に、破損エクセルが修復される理由を
おわかりになりますでしょうか。
現在、調べているのですが、めぼしい情報を見つけられずにおります。。
たびたびお世話になってしまい恐縮でございますが、
何卒、宜しくお願い致します。 -
私がその "Process Monitor" ログを直接確認したわけではないので何とも言えませんが、調べ方が良くないと思います。
(そもそも Excel プロセスだけに絞ったとしても、そのイベント ログは軽く数百はあると思いますが、それを一つ一つ調べるなんて、想像しただけでも恐ろしい。。。)まず、Excel プロセスが該当ファイルを最初に読みに行ったタイミングで、Excel プロセス内にロードされているモジュールに差異がないかを確認したほうがいいと思います。
"Process Monitor" で下記フィルタ設定を行うと、Excel プロセスが該当ファイルを読みに行ったイベントだけを抽出してくれます。------------------------------------------------------
【フィルタ条件】
"Process Name" "is" "EXCEL.EXE" then "Include" ===> [Add]
"Operation" "is" "ReadFile" then "Include" ===> [Add]
"Path" "contains" "<該当ファイル名>" then "Include" ===> [Add]====> [Apply]
------------------------------------------------------上記フィルタ条件で抽出された "ReadFile" オペレーションのうち、一番最初にリストされているイベントをダブル クリックすると、そのイベントのプロパティ情報を表示してくれます。
で、そのプロパティの [Process] タブの下段には、そのプロセス (今回の場合 Excel.exe) 内にロードされているモジュール リストが表示されているので、そのリストに差異がないかを確認されることをお勧めします。
(まぁ、この差異を調べるのも、結構面倒ですけど。) -
お馬鹿様
以前は調査方法についてご教示誠にありがとうございました。
ご教示頂いた調査方法にて調査させて頂きました。
<調査結果の説明の前に>
モジュールの差異の説明の前に最初に言葉を定義させて頂きます。
> [1]破損したファイルをExcel2016のセーフモードで開く
> [2]上書き保存する
上記の手順を「単純保存」と致します。
> [1]破損したファイルをExcel2016のセーフモードで開く
> [2]VBEを開く(開くだけで何もしない)
> [3]上書き保存する
> ⇒破損ファイルがなおる
上記の手順を「VBE保存」と致します。
<調査方法について>
「単純保存」と「VBE保存」の作業工程内の「上書き保存した直後」に1番最初に現れたExcelプロセス内のモジュールの差異を調査しております。
<モジュールの差異について>
モジュールの差異については以下となりました。
◯「単純保存」の場合にのみロードされるモジュール
C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE16\WXPNSE.DLL
◯「VBE保存」の場合にのみロードされるモジュール
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\1041\VBE7INTL.DLL
C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA7.1\1041\VBEUIINTL.DLL
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBEUI.DLL
C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA7.1\VBEUIRES.DLL
◯「単純保存」の際は1度しかロードされないが、「VBE保存」は2度ロードされるモジュール
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
<本調査結果から分かること>
モジュールの差異を見ても、「VBE保存だとファイルがなおる理由」について仮設は立てられていない状況です。
もしかしたら、また私の調査の仕方が悪いのかもしれませんが・・・。
もし、調査方法が問題ないのであれば、お馬鹿様の方で何かファイルがなおる理由について仮設は立てられますでしょうか。
ご質問ばかりで誠に恐縮です。
ご確認何卒宜しくお願い致します。 -
返信が遅くなり申し訳ありません。
(見落としていました。。。。。)> 「単純保存」と「VBE保存」の作業工程内の「上書き保存した直後」に
> 1番最初に現れたExcelプロセス内のモジュールの差異を調査しております。確認ですけど、「上書き保存した直後」とはどのイベントのことを指しているのでしょうか?
先に示した3つのフィルタ条件で抽出されたイベントのうち、一番最初の "ReadFile" オペレーションでは、ロードされているモジュールに差異がなかったのでしょうか?
もし調べていないのでしたら、まずはそこを調べた方が良いと思います。
(「上書き保存した直後」のタイミングでは遅すぎると思います。)
それで差異が見つからないのであれば、"WriteFile" オペレーションをフィルタ条件に追加し、一番最初の "WriteFile" オペレーションでロードされているモジュールに差異がないか、確認してみてください。 -
お馬鹿様
ご返信ありがとうございます。
ご返信が遅くなってしまい申し訳ございません。
以下、回答致します。
>> 「単純保存」と「VBE保存」の作業工程内の「上書き保存した直後」に
>> 1番最初に現れたExcelプロセス内のモジュールの差異を調査しております。
>
> 確認ですけど、「上書き保存した直後」とはどのイベントのことを指しているのでしょうか?
上書き保存した後、一番最初に出た"ReadFile" オペレーションのうち、一番最初にリストされているイベントとなります。
> 先に示した3つのフィルタ条件で抽出されたイベントのうち、一番最初の "ReadFile" オペレーションでは、ロードされているモジュールに差異がなかったのでしょうか?
> もし調べていないのでしたら、まずはそこを調べた方が良いと思います。
> (「上書き保存した直後」のタイミングでは遅すぎると思います。)
「破損しているファイル」と「VBE保存して修復したファイル」のそれぞれを開いて一番最初に出た"ReadFile" オペレーション(正確には IRP_MJ_READ)のうち、一番最初にリストされているイベントを比較する調査を行ったところ、差異はありませんでした。
> それで差異が見つからないのであれば、"WriteFile" オペレーションをフィルタ条件に追加し、一番最初の "WriteFile" オペレーションでロードされているモジュールに差異がないか、確認してみてください。
「破損しているファイル」と「VBE保存して修復したファイル」のそれぞれを開いて一番最初に出た"WriteFile" オペレーション(正確には IRP_MJ_WRITE)のうち、一番最初にリストされているイベントを比較する調査を致しました。
◯「VBE保存して修復したファイル」は2つ出現するが、「破損しているファイル」は1つしか出現しないモジュール
C:\Windows\SysWOW64\msctf.dll
◯「破損しているファイル」は2つ出現するが、「VBE保存して修復したファイル」は1つしか出現しないモジュール
C:\Windows\SysWOW64\wininet.dll
◯「破損しているファイル」のみ出現するモジュールと「VBE保存して修復したファイル」のみ出現するモジュールはありませんでした。
<本調査結果から分かること>
モジュールの差異を見ても、「VBE保存だとファイルがなおる理由」について、まだ仮設は立てられていない状況です。
もしかしたら、再度私の調査の仕方が悪いのかもしれませんが・・・。
もし、調査方法が問題ないのであれば、お馬鹿様の方で何かファイルがなおる理由について仮設は立てられますでしょうか。
私の力不足によりお馬鹿様に頼りきりになってしまっており申し訳ございません。
ご質問ばかりで誠に恐縮です。
ご確認何卒宜しくお願い致します。 -
> ◯「VBE保存して修復したファイル」は2つ出現するが、
> 「破損しているファイル」は1つしか出現しないモジュール
> ◯「破損しているファイル」は2つ出現するが、
> 「VBE保存して修復したファイル」は1つしか出現しないモジュール上記の意味が私にはわかりませんでした。
私が確認してほしかったのは、「ロードされているモジュールに差異がなかったのか?」ということです。
つまり Excel プロセス空間に、特定のモジュールがロードされているか否かです。
「ロードされているか否か」の質問に対して、なぜ「2つ出現する」や「1つしか出現しない」といった個数が出てくるのか、私にはわかりませんでした。> もし、調査方法が問題ないのであれば、
> お馬鹿様の方で何かファイルがなおる理由について仮設は立てられますでしょうか。あくまでも私見ですが、ファイル修復を行うために必要なモジュール (DLL) がロードされないケースがあるのでは。。。と推測しています。
必要な DLL がロードされていない、あるいはロードできないので、それに対応する処理も実行されないのでは。。。ということです。
"msctf.dll" は "Text Service Framework" 関連のモジュールだと思いますが、もしこのモジュールのロード状況に差異があるのであれば、ASCII データのみの場合にどーなるか等、いろいろ検証すべき対象が見えてきます。
その検証すべき対象を見つけ出す手掛かりとして、「ロードされているモジュールに差異がなかったのか?」の確認を提案しました。
いずれにせよ、現象的な違いが確実に起きているのであれば、その違いを発生させる要因は必ず存在するはずです。
現段階では、仮説を立てるための要素すら見つけていないのですから、仮説を立てられるわけがありません。
- 編集済み お馬鹿 2018年8月13日 6:52
- 回答としてマーク livems_tare 2018年12月27日 5:44
-
お馬鹿様
ご返信ありがとうございます。
以下、回答致します。
>> ◯「VBE保存して修復したファイル」は2つ出現するが、
>> 「破損しているファイル」は1つしか出現しないモジュール
>> ◯「破損しているファイル」は2つ出現するが、
>> 「VBE保存して修復したファイル」は1つしか出現しないモジュール
>
> 上記の意味が私にはわかりませんでした。
> 私が確認してほしかったのは、「ロードされているモジュールに差異がなかったのか?」ということです。
> つまり Excel プロセス空間に、特定のモジュールがロードされているか否かです。
> 「ロードされているか否か」の質問に対して、なぜ「2つ出現する」や「1つしか出現しない」といった個数が出てくるのか、私にはわかりませんでした。
上記、お伝えの仕方を間違えてしまいました。申し訳ございませんでした。以下のように訂正させて頂きます。
◯「VBE保存して修復したファイル」は2回ロードされるが、「破損しているファイル」は1回しかロードされないモジュール
C:\Windows\SysWOW64\msctf.dll
◯「破損しているファイル」は2回ロードされるが、「VBE保存して修復したファイル」は1回しかロードされないモジュール
C:\Windows\SysWOW64\wininet.dll
◯「破損しているファイル」のみロードされるモジュールと「VBE保存して修復したファイル」のみロードされるモジュールはありませんでした。
> あくまでも私見ですが、ファイル修復を行うために必要なモジュール (DLL) がロードされないケースがあるのでは。。。と推測しています。
> 必要な DLL がロードされていない、あるいはロードできないので、それに対応する処理も実行されないのでは。。。ということです。
> "msctf.dll" は "Text Service Framework" 関連のモジュールだと思いますが、もしこのモジュールのロード状況に差異があるのであれば、ASCII データのみの場合にどーなるか等、いろいろ検証すべき対象が見えてきます。
> その検証すべき対象を見つけ出す手掛かりとして、「ロードされているモジュールに差異がなかったのか?」の確認を提案しました。
> いずれにせよ、現象的な違いが確実に起きているのであれば、その違いを発生させる要因は必ず存在するはずです。
> 現段階では、仮説を立てるための要素すら見つけていないのですから、仮説を立てられるわけがありません。
推測についてありがとうございます。大変勉強になります。
おっしゃる通り、実際に差異があるわけですので、それを発生させる原因は必ず存在しますね。
実際に出た差異をヒントに調査を進めてみようと思います。
ご確認何卒宜しくお願い致します。
いつもご返信を下さり感謝しております。ありがとうございます。 -
> ◯「VBE保存して修復したファイル」は2回ロードされるが、「破損しているファイル」は1回しかロードされないモジュール
>
> C:\Windows\SysWOW64\msctf.dll「2回ロードされる」ということは、異なるタイミングの2つのイベントを確認したということですよね?
私が提案したのは、「一番最初の "ReadFile" オペレーション」あるいは「一番最初の "WriteFile" オペレーション」の、1つのイベントにのみ着目した確認です。
複数のイベントを確認したのであれば、どのタイミングでの異なるイベントを確認したのか、それを明確にしてもらわないと、こちらも何をいってるのかわかりません。
そもそも話が全くかみ合っていないように思います。
私が確認したいのは、
「Excel プロセスから破損ファイルへの Read / Write オペレーションが行われるとき、ロードされているモジュールに差異がないか?」
ということです。
で、プロセス内にロードされているモジュールはタイミングによって異なる可能性があるので、その影響をできるだけ排除するために、「一番最初の」と調べるイベントのタイミングを限定したのです。
破損ファイルへの「一番最初の "ReadFile" オペレーション」および「一番最初の "WriteFile" オペレーション」では、プロセス内にロードされているモジュールに差異はなかったのですか? -
お馬鹿様
この度は、大変長い間ご返信できておらず、申し訳ございませんでした。
わたくしの能力が足りず、モジュールの差異確認まで至らなかったのですが、
(色々と丁寧に教えて頂きましたのに、大変、申し訳ございません..)
お馬鹿様が以前推測してくださった「必要なモジュール (DLL) がロードされないケースがあるのでは」
というのが正しいと裏付けられそうな事象が度々あり、一旦は、
こちらで本フォーラムを終わりにしたいと考えております。
度々、ご助言くださり、ありがとうございました。
また機会がございましたら、是非、お伺いしたく存じます。
何卒、宜しくお願いいたします。