Excelマクロが400とか1004のエラーを吐く
スタンザ形式っぽい長いファイルをExcelで処理していました。(WindowsXP SP2+Office2003 SP1)
<ああああああ>
いいいいい 11111
うううううう 22222
<ええええええ>
おおおおお 33333
このようなテキストファイルをExcelのシートに読みとります。こんな感じになります。
あああああ | ||
いいいいい | 11111 | |
ううううう | 22222 | |
えええええ | ||
おおおおお | 33333 |
そこから、「ああああああ」というシートの中に「いいいいい」の行と「ううううう」の行を、「ええええええ」というシートの中に「おおおおお」の行を格納すると言うような処理です。
数10スタンザでテストをした時は正常に動いたのですが、300を超えたら急に動かなくなりました。どうも256シート以上生成しようとした時にエラーが出るようです。仕方ないので100シートごとに分割してファイルを作るように変更しました。ところが問題が解決しません。よくよく調べてみると、こんな処理をしていることが原因とわかりました。
- テキストファイルを読み込んだExcelブック内に1スタンザ分のシートを作成する
- 100スタンザ分のシートができたら新しいブックを作って異動する
- 新しいブックは保存して閉じる。
- 101スタンザ目から処理を再開する
こういった処理に変えたところ、テキストファイルを読ませたExcelブックで生成・消滅させたシートが120くらいを超えたときに落ちました。同時に存在するのは最大でも100シートなのですが、許してくれませんでした。エラーの内容は、シートのMoveに失敗しました、のような内容に変わりました。Moveがダメならと思ってCopyに変更し、Copyが終了次第Deleteにしてみてもだめでした。
100シートをまとめて処理するのではなくて1シートならどうだ、と思って試してみると180シートくらい頑張りました。これは何かの制御バッファが溢れてるのか?と思い、Excelが認識するシートのオブジェクト名を「st」という2文字に変更してみました。そうしたら256シートで落ちるようになりました。って全然解決になっていません。
しかたなく、テキストファイルを読み込んだブックとは別に空のブックを作り、その上に1シートずつ作成して100シートになったら保存して閉じる、ということをしました。これでうまく行きました。やれやれです。
Excel2003ではそもそも65535行を超えるデータを扱う事ができないため、ログの処理に不向きであると思います。だからといってExcel2007を買えばこのような問題がすっかり無くなるかというと、「400」とか「1004」という不親切なエラーを平気で返す様なソフトの遺伝子を受け継いでいるという事を考えるととてもそのような感じがしません。
以前、テクネコさんがおっしゃっていましたが、、大きなシステムから出てくるものはできるだけ汎用性のある形式にして、魅せる時はExcelやWordなどの手近なものにすると良いというのはその通りだと思います。汎用ログ解析ツールの検討でも始めようかと思いました。
てくてくテクネコ > こんな時にも年賀状作成ソフト
http://blogs.itmedia.co.jp/techneco/2008/03/post-141e.html
(今日はkwoutが重すぎて使えませんでした)