excelでVBAマクロを編集→保存しつつ実行ということを繰り返していると、突然エクセル(というかブック)が不調になってしまうことがある。
※個人的には「xlsブックが腐った」と呼んでいる。
ツールをお客様の前でデモってるときに、エクセルごと落ちてしまい、「自分の環境では動くんだけど」を地で行く展開に・・・。
頭が痛い。
こんなときのgoogle先生頼み。
が、excelが落ちる話はよく出てくるけど、同じコードで実行できたりできなかったり、という話は見つけられなかった。
再現コードは追及できていない。
状況・事情は以下のとおり。
結局原因はまったくわかっていない。
調査の過程で、
全く根拠のない想像だけど、何かしらの内部状態・中間状態(parseとか?)をブックの中に保存しているんだろう、そしてこの部分に火種が潜んでるんだろう、と考えた。
だったら、保存できなくしてしまえ、ということで、xlaファイルを「読み取り専用」にしたら、ハッシュ値の変化はなくなった。当然ながら。
現在のところマクロ死亡は再現していない。
これならいける、かも???
元々、リリース候補の作成を、nantを使って1手順化していたのが幸いだ。
nantスクリプトでattrib要素を用い、xlaファイルを読み取り専用にする。
4でエクセルが落ちる現象が出た場合は、1に戻って保存で再挑戦。内部状態がまとも?になるまで繰り返す(うへ)。
読み取り専用でも上書きは可能なので、マクロの差し替えもなんとかなる、と。
※個人的には「xlsブックが腐った」と呼んでいる。
- ブックを開くだけで「ご不便をおかけして申し訳ありません。」ダイアログが表示され死んでしまう。
→腹いせにエラー報告しまくったけど、どうなるものでもなく・・・。Faulting application excel.exe, version 11.0.8211.0, stamp 47dcb10b, faulting module vbe6.dll, version 6.5.10.24, stamp 464105f1, debug? 0, fault address 0x001ec79a.
- コードを変更していないにも関わらず、実行できたりできなかったりする
→同じコードなのに、「コンパイルエラー」が出るようになる - コードを変更していないにも関わらず、実行できたりエクセルごと落ちたりする
ツールをお客様の前でデモってるときに、エクセルごと落ちてしまい、「自分の環境では動くんだけど」を地で行く展開に・・・。
頭が痛い。
こんなときのgoogle先生頼み。
が、excelが落ちる話はよく出てくるけど、同じコードで実行できたりできなかったり、という話は見つけられなかった。
再現コードは追及できていない。
状況・事情は以下のとおり。
- 運用時はExcel 2000
- Excel 2003 SP3/Excel XP(いずれもWin XP Pro SP2)で再現
→2000ではいまのところ未経験 - データを入れるxlsブックと、マクロを格納するxlaに分けている
- xlaが開かれるタイミングで自ツール用のメニューを追加する
→いろいろ経緯があってこういうことに
→ブックを開いた状態でxlaを開くと機能が有効になる、という使い方 - VBA中で新しいブックを作成し、一部シートを削除している
→MSのKBに、(Excel 2000だけど)シートの削除やブック保存と関連のありそうなものがあったから
http://support.microsoft.com/default.aspx?scid=kb;ja;JP199212 - クラスモジュールを使っている
- フォームモジュールを使っている
結局原因はまったくわかっていない。
調査の過程で、
- xlaを開く→ツール-マクロ-Visual Basic Editor→CTRL+Sで保存→Excel終了、を繰り返すだけでxlaアドインのファイルサイズが変わる。
→何も変更しない状態で上書き保存を繰り返す。本事象の場合、290KB~400KBの間で変化した。 - 更にウォッチしたら「xlaを開く→エクセル終了する」だけでファイルの中身が変わる
→具体的な違いは分からないが、sha1ハッシュが変化することで確認した。Tortoise SVNで変更のチェックにひっかからないのは、ファイルの更新時刻が変化しないからか。
全く根拠のない想像だけど、何かしらの内部状態・中間状態(parseとか?)をブックの中に保存しているんだろう、そしてこの部分に火種が潜んでるんだろう、と考えた。
だったら、保存できなくしてしまえ、ということで、xlaファイルを「読み取り専用」にしたら、ハッシュ値の変化はなくなった。当然ながら。
現在のところマクロ死亡は再現していない。
これならいける、かも???
元々、リリース候補の作成を、nantを使って1手順化していたのが幸いだ。
- マクロ編集
- 実行・確認(NGなら1に戻る)
- リリース候補作成
- テスト
nantスクリプトでattrib要素を用い、xlaファイルを読み取り専用にする。
4でエクセルが落ちる現象が出た場合は、1に戻って保存で再挑戦。内部状態がまとも?になるまで繰り返す(うへ)。
読み取り専用でも上書きは可能なので、マクロの差し替えもなんとかなる、と。
トラックバック(0)
このブログ記事を参照しているブログ一覧: Excelで VBAマクロをいじってるうちに不調になる話
このブログ記事に対するトラックバックURL: http://passing.breeze.cc/mt/mt-tb.cgi/72

Excel2000でも同様なことが発生したことがあります。
こんな情報はMSDNに載ってないので一人ナックしました。
原因がわからないのは対策が立てられず、参考になりました。
自作のDLL/COMコンポの何かを呼び出しているならともかく、マクロ使ってる範囲でExcelが「落ち」ちゃうとお手上げです(T_T)
エクセルVBAで作った アドイン(.xla)を C:\Program Files\Microsoft Office\OFFICE11\Library に配置して 他のエクセルアプリケーションVBA から呼出して使用していました。
当然 AddIn-Install と Application.Run( )で使用していましたが、あるとき思いついて このアドイン.xla を参照設定から事前バインドしてみました。
幸い ほとんどの場合は問題なく動きますが、あるときからそれがエラーになるケースに遭遇しました。これに対しては 本記事とは幾分異なりますが、アプリケーションVBA から一旦参照設定を外し、保存してから、再度 参照設定をするという マニュアル操作を繰り返すことで 解消させました。
ところが 他のアプリケーション.VBA で参照させている アドイン.xla を修正すると エラーケースになる アプリケーションで 本記事のごとく 致命的エラーで落ちました。 やむを得ず そのようなエラーになるアプリだけを アドイン.xla から 標準モジュールの移植をして 参照設定を切ることで動かしていました。
問題を起こしたアプリケーションの VBAサイズは、問題の無いアプリケーションと比べて かなり大きなものだけに限定されていたので、Windowsのメモリアロケーションなどで ある単位のサイズを超えると問題を起こすのだろうぐらいに考えていました。
あるとき 本記事を読んで アドイン.xla のほうを 読込専用に設定して使用すると うまくいくことがわかりました。
面倒なのは アドイン.xla 側を編集すると 再度バインドを外して バインドし直す作業をが必要なるだけです。
オフィスアプリケーションのバインドの詳細や OSまわりの事情には幼稚なので このような使用法は 間違っており、エクセルバージョンアップなどで 使用できなくなるのかもしれません。 DLL を作成する手間も気力も無い VBAプログラマとしては 簡単な方法で 自前のライブラリ呼び出し感覚で 自作関数の再使用ができます。
いつまで持つ方法なのかは不明ですが、本記事のおかげで取りあえず解決しております。ありがとうございました。