プロが教えるわが家の防犯対策術!

お世話になります。

引数1=結合したいテキストファイルの存在するフォルダパス("Y:\Work")
引数2=結合後のテキストファイルのフルパス("Y:\Temp\Merge_All.csv")
を引き渡し、
引数1で指定したフォルダ内に存在する、
拡張子"dat"の複数ファイルを一つに結合する共通モジュール
を作成したいと思っています。

下記モジュールをメインモジュールから何度か呼び出しているのですが、
一度目は問題なく実行されるのですが、
二度目に実行する場合に、
Set oTextFile = oFs.OpenTextFile(sFilename, 1)の行で
エラー メッセージ
"Runtime Error! Abnormal Program Termination."
が表示され処理が中断してしまい困っています。

お気づきの問題点がございましたら、是非お時間のある時にご指導いただけると幸いです。
ヒントでもかまいませんので、よろしくお願いいたします。

ついでといってはなんですが、、、
本来はヘッダー付ファイルを先頭ファイルのヘッダーだけを残して
一つに結合したいと思っていたのですが、
ファイルサイズが膨大なため、ReadLineでは遅すぎてあきらめ、
ヘッダーなしファイルをReadAllで単純結合していく方法にしました。
ヘッダー付ファイルを結合する良い方法をご存知の場合は、
是非合わせてご教授お願いいたします。


Sub MergeFiles(sFolderPath, sExpFilePath)

 Const ForReading = 1

 Set oFolder = oFS.GetFolder(sFolderPath)
 Set oExpFile = oFS.CreateTextFile(sExpFilePath)

 For Each sFilename In oFolder.Files
   sFileExtension = oFS.GetExtensionName(sFilename)
   If LCase(sFileExtension) = "dat" Then
     Set oTextFile = oFS.OpenTextFile(sFilename, ForReading) ←二度目のここでエラーなんです
     sExpLine = oTextFile.ReadAll
     oTextFile.Close
     oExpFile.WriteLine sExpLine
   End If
 Next

 oExpFile.Close

End Sub

A 回答 (3件)

私の所ではファイルが小さいためか現象が出ませんでした。


外れているかもしれませんがオブジェクトを明示して解放してみたらどうでしょうか。

oTextFile.Closeの次辺りに「Set oTextFile = Nothing」を入れてみるとか。
また、oFSは「Set oFS = WScript.CreateObject("Scripting.FileSystemObject")」で定義しているのですよね?
これも「MergeFiles」の最初で定義して、最後にNothingで解放してみたらどうでしょう。

再現しないため勝手な思い込みで書いているので参考にならないかもしれません。ご容赦下さい。
    • good
    • 0
この回答へのお礼

ご親切にテストまでしていただいて、本当にありがとうございます。

コード漏れがありすみません、ご指摘のとおりoFsは上位でSetしております。

そうなんです。
Set oTextFile = Nothing
Set oExpFile= Nothing
苦肉の策でいろいろ解放してみたのですが、現象が変わらなくて。。。

一度目で
月ごとのデータファイル
200703.dat
200704.dat
200705.dat
をMarge_diff.datに統合し、

二度目で
既に存在しているMarge_fixed.dat
と上記のMarge_diff.dat
を統合し、
Marge_all.datを生成

というような使い方をしているのですが、
一度目での統合の仕方が悪く変なファイルを作っているのかもしれません。

お忙しい中お時間をいただきまして、本当に感謝です。
また何か思いつくことがありましたら、是非よろしくお願いいたします。

お礼日時:2007/06/28 15:24

> Marge_diff.datに統合し、


> 二度目で
> 既に存在しているMarge_fixed.dat
> と上記のMarge_diff.dat
> を統合し、
> Marge_all.datを生成

単に処理のタイミングが早すぎるだけのようなな気がします。
Timerかなにかで2度目の処理を一旦スリープしてから開始してみてはどうでしょうか?
    • good
    • 0
この回答へのお礼

おはようございます。
ご回答ありがとうございます。

個別に実行してみましたら、
二度目(一度めの生成ファイル使用)だけにエラーが発生し、
一度目のファイルのコピーで実行するとエラーが発生せず、
どうやらファイルデータがおかしそうな感じです。

質問前に個別に実行するという問題の切り分けをしてから、
お聞きすればよかったのに、
ループが、ループが、、、と早とちりして、思いいたりませんでした。
せっかくご回答いただいたのに申し訳ありませんでした。

上記の質問とは違うのですが、
ファイルを結合する場合に
末尾に改行コードがあるために結合部に一行の空行が入ってしまいます。
末尾改行コードを除去するモジュールを足したいのですが、
末尾を改行コードを判定する方法をご存知ないでしょうか?

sExpLine = oTextFile.ReadAll
If Right(sExpLine, 2)= chr(13) & chr(10) then
  sExpLine = Left(sExpLine, Len(sExpLine) - 2)
End if

とやってみたのですが、
判定していないようで、IFの中に入りません。。。

本来なら別に質問をたてなくてはならないようなことですし、
もしもお時間があればついでの時にでもご回答いただければ幸いです。

お礼日時:2007/06/29 09:25

#2です。



> に改行コードがあるために結合部に一行の空行が入ってしまいます。

もしかして、
oExpFile.WriteLine
を使われていますか?
これは自動的に改行されてしまいます。

oExpFile.Write
を使用してみてはどうでしょうか?
    • good
    • 0
この回答へのお礼

素敵です!tkrnさん!
ばっちりですーーー!!
あやうく(またしても?)「何やってんだかコード」を書き残してしまうとこでした。
また、お世話になることもあろうかと思いますが、
ボケ質問なこれに懲りずお力をお貸しください。
的確、かつ早いご回答本当にありがとうございました。

お礼日時:2007/06/29 11:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています