• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォルダ内にあるファイル全てを比較したい)

フォルダ内ファイルの比較方法とは?

このQ&Aのポイント
  • フォルダ内にある複数のファイルを比較する際、ファイル番号の飛び飛びの状況に対応する方法を知りたいです。
  • For文を使用してファイルを比較しているが、飛び飛びのファイル番号で比較が終わってしまい、次に進めない状況に困っています。
  • どのような方法を使用すれば飛び飛びのファイル番号でも比較を継続できるのかわかりません。IF文などを使用して解決できるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Dim I&, F1$, F2$ '★←ここまでは以前と同じ '★== FD側のファイルを列挙する == F1 = Dir("a:\*.DAT") 'A:\にある拡張子.DATのファイル全て If F1 = "" Then '★該当ファイルが1個も無い場合   MsgBox "該当ファイルがありません"   Exit Sub End If '★== FD側のファイル名を記録する == I = -1 '最初は-1から ReDim F(0) 'ファイル名を蓄える配列 Do   I = I + 1 '配列要素数(正しくは最大インデックス)を更新   ReDim Preserve F(I) = F1 '記録する   F1 = Dir '次のファイルを取得 ※パラメータ無しに注意 Loop Until F1 = "" '見つからなくなるまで繰り返す '★== 記録したファイル名を逐次処理する == For Each F1 In F   F2 = "c:\VB\" & F1 'HD側のパス名   If Dir(F2) <> "" Then 'ファイルが存在する場合     F1 = "a:\" & F1 'FD側パス名     keka = Comp(F1, F2) 'ファイルを比較     Select Case keka '結果による振り分け '★ === 中略 === ここは前のSelect Case と同じ     End Select   End If Next End Sub 今までの For I = 1 To 25 ~ Next は消去してください。

te0000
質問者

お礼

nda23様 いつもありがとうございます。 御教授頂いたソースを試したところ   ReDim Preserve F(I) = F1 '記録する で構文エラーと出てコンパイル出来ませんでした。 この場合何が原因なのでしょうか? またI=-1となっておりますが、なぜ-1からはじめるのですか? お暇な時にでも御回答頂けるとありがたいです。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

いつもVBScriptなもので、ウッカリしておりました。 For Each F1 In F   F2 = "c:\VB\" & F1 'HD側のパス名     ↓ For I = 0 To UBound(F) '★For Each を止めて、このように修正   F1 = F(I) '★インデックスで内容を取り出す   F2 = "c:\VB\" & F1 'HD側のパス名 '★←ここから以前のまま

te0000
質問者

お礼

nda23様 いつもお世話になっております。 nda23様のおかげで当初の目的だった、変換後のファイル比較が 無事に完成致しました。 御指導頂きありがとうございます。 またご縁がありましたら宜しくお願い致します。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

ちょっと端折すぎました。 ReDim Preserve F(I) = F1 '記録する      ↓ ReDim Preserve F(I) '配列を拡張する F(I) = F1 '記録する >なぜ-1からはじめるのですか I = I + 1 ReDim F(I) F(I) = F1 '最初のファイル名が格納される時、I=0にするため 配列の底が0なので、最初のファイル名をF(0)に格納するには拡張 した後のインデックスが0になっている必要があります。つまり、 +1して0になる整数と言えば-1ですね。 ReDimは配列を再定義する命令文で、ReDim Preserve F(I)とは 配列F(0)~F(I)までの(I+1)個の配列を再定義します。この時、 既に存在する部分をクリアせずに残しておくのがPreserve指定です。

te0000
質問者

お礼

nda23様 御回答ありがとうございます。 御教授頂いたソースに変更したところ For Eachを配列で使用する場合は、バリアント型の配列でなければいけません。 とエラーが出てしまいます。バリアント型にする必要がやはりあるのでしょうか? また-1表記も理解できました。詳しい解説いつもありがとうございます。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

こんにちはte0000さん。 またしてもnda23です。 考え方は二通りあります。 (1)ファイルの存在を確認してから実行する。 (2)FDのフォルダにあるファイル名と同じ名前のファイルを  Cドライブの指定フォルダ内で探す。 (1)存在確認の方法ですが、簡単なのはDirメソッドです。 Dir("a:\W-NO-01.DAT") の戻り値が空文字列なら「存在しない」です。 例えば、こんな感じです。 If Dir(F1) = "" Or Dir(F2) = "" Then   keka = 0 'どちらか一方が存在しなければ等しかったことにする Else   keka = Comp(F1, F2) '両方存在する場合のみ比較する End If (2)番号に関わらず、ファイルを列挙する場合もDirを使いますが、 列挙中は他の用途でDirを使ってはいけませんので、少し工夫が 必要です。この方法は別スレッドと言うことにしましょう。

te0000
質問者

お礼

nda23様 毎度毎度御回答頂きありがとうございます。 早速上記試してみました。 上手くいき結果も良好でした。 お手数でなければ(2)の方法も御教授いただけますでしょうか。 勉強になります。

関連するQ&A