膨大な量の単票形式のExcelファイルを逐次開いてデータを集計するVBAプログラムを組んでまわしていたときでした。出るはずのないところでエラーが出たので,調べてみると壊れたファイルであり,修復して開くと問題なく使えるファイルでした。
解決方法を検索してみた
軽く調べてみたところ,ズバリの答えはすぐに出てこなかったのですが,まったく同じ事象で困っている方の質問を知恵袋で見つけました。
エクセルで壊れたファイルを開く際の、VBAの処理について、
現在指定ディレクトリ内にある、指定ブックの指定シートをコピーし抽出するマクロを生成しています。
—————————————————
“Excelファイル名” には読み取れない内容が含まれています。
このブックの内容を回復しますか?ブックの発行元が信頼できる場合は、「はい」をクリックしてください。
—————————————————手動でExcelファイルを開いた際には、上記のダイアログメッセージが表示され、
「はい」を選択すると、修復結果はどうあれファイルを開くことが可能です。こちらのファイルをExcelのVBAより、
Workbooks.Open FileName:=”ファイルパス/名”, UpdateLinks:=0上記一文で開くと、
—————————————————
実行時エラー ‘1004’
‘Open’メソッドは失敗しました : ‘Workbooks’ オブジェクト
—————————————————と、表示されております。
▼問題点としましては、
1.壊れたブックが複数・不特定あるため、手動での回復は時間がかかる。
2.壊れるブックに対してのマクロや、処理をあらかじめ設定することは、
私が管理しているxlsxでない為、不可能です。
3.壊れたブックに対してOpenメソッドを実行することで、1004エラーでマクロが停止してしまうこと。▼解決策としては、
1.VBA側で壊れたブックを開く際、自動で回復に対し、「はい」を選択する処理。
2.壊れたブックを一括で選択し、回復の出来る処理、または外部ツール。
3.壊れたブックを開く際に出るダイアログを、元より「はい」選択。もしくは無視するオプション。上記対応が私が考え付く対策でして、
可能な限り調べ、実施してみたのですが、一向に解決する気配がなく、
こちらで質問させていただきました。過去に似た事例や、お心当たり、解決案などお持ちでしたら、
是非ご教示願いたいです。よろしくお願いいたします。
出典:Yahoo!知恵袋
自分で考えてみた
まったく同じことで悩んでいる人もいるようですね。この記事は約2年前のものですが,質問者さんの望む回答が見つからないまま代替案のみ示されています。
書かれている Workbooks.Open Filename:=~~, UpdateLinks:=0 の使い方まで同じです。
UpdateLinks:=0 とすると,ブックを開いたときに外部参照 (リンク) は更新されないし問い合わせも来ないので,逐次処理には必須です。
で,ここを見ていた時に,ふと閃きました。
開くときにダイアログで修復するか?と問い合わせが来るのだから,そのためのオプションが UpdateLinks と同じようにあるのではないか?ということです。
キーワードを変えて検索
そのオプションを調べるため,Workbooks.Open とメソッド名で調べてみました。おそらくMSDNが示されるだろうと思ったらその通りでした。
わかったこと
このページを見ても詳細な解説はなかったのですが,英単語の意味からこれではないかと思いました。
名前 | 必須/省略可能 | データ型 | 説明 |
---|---|---|---|
CorruptLoad | 省略可能 | XlCorruptLoad | 使用できる定数は、 xlNormalLoad 、 xlRepairFile 、 xlExtractData のいずれかです。このパラメーターに値が指定されていない場合の既定の動作は xlNormalLoad になり、OM を通じて開始するときに回復は行われません。 |
「壊れたファイルを修復して開く」ということから,CorruptLoad:=xlRepairFile とするのでは?と思い,試してみたところ,あってました。
結論
ファイルを開くときの逐次処理は,以下のオプションをあわせて設定しておくのがオススメです。
1 |
Workbooks.Open FileName:=(ファイル名), UpdateLinks:=0, CorruptLoad:= xlRepairFile |
知恵袋で質問してた人にも教えてあげたいのですが,すでに回答は締め切られています…