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

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

フォルダ内にあるファイル全てを比較したい

以前よりこちらでファイル比較を相談していたものですが ファイルNo.1~26までを比較するソフトは出来たのですが 状況によっては1~3までとか1,4,18とか飛ばし飛ばしに ファイルがある場合があります。 その場合For文では無いファイル番号で比較が終わってしまい 次に進まないのですが、こういった時はどうしたらよいのでしょうか? IF文なのかとも思いましたが、調べてもしっくりくるものが判らず ???だらけです。 どなた様か御教授御願い致します。 ちなみに下がファイル比較するソースになります。 Option Explicit Function Comp(ByVal F1$, ByVal F2$) As Long Dim EXE, STD, TxT$, CNT&, I& TxT = "fc /b " & F1 & " " & F2 Set EXE = CreateObject("WScript.Shell").Exec(TxT) Set STD = EXE.StdOut Do While EXE.Status = 0 'Do Until STD.AtEndOfStream TxT = STD.ReadLine CNT = CNT + 1 If CNT = 2 Then Exit Do Loop If EXE.Status = 0 Then EXE.Terminate If TxT = "FC: 相違点は検出されませんでした" Then CNT = 0 Else CNT = 1 End If Else CNT = EXE.ExitCode End If STD.Close Comp = CNT End Function Private Sub Command1_Click() Dim keka As Long Dim I&, F1$, F2$ For I = 1 To 25 F1 = "a:\W-NO-" & Format(I, "00") & ".DAT" F2 = "c:\VB\W-NO-" & Format(I, "00") & ".DAT" keka = Comp(F1, F2) Select Case keka Case 1: MsgBox F1 & "と" & F2 & "は等しくない" Exit For Case 2: MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した" Exit For End Select Next End Sub

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

  • ベストアンサー
  • 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

  • 再質問 ファイル比較について

    VB5.0を使用しております。初心者で解らない事だらけの為質問を致します。 FD内のデータとHD内にあるファイル26個を順に比較したいのですが 以前質問して下記プログラムを組んでみたのですが 動作しているかも判りません。 どなたか解説及び添削を御願い致します。 やりたい事は、データ変換をして出来たファイルをFDとHD内にバックアップとしてコピーをしています。そのデータを1ファイルずつ比較し問題が無いか確認したいのです。以前よりFDにコピーした際に、書き込み不良が発生し使用出来ない事があった為です。 御手数をお掛け致しますが、宜しくお願い致します。 作成したプログラム 'Private Sub Command1_Click() Function Comp(ByVal F1$, ByVal F2$) As Long Dim EXE, STD, TxT$, CNT& F1 = ("a:\W-NO-01.DAT") F2 = ("c:\VB\W-NO-01.DAT") TxT = "FC /B" & F1 & " " & F2 Set EXE = CreateObject("WScript.Shell").Exec(TxT) Set STD = EXE.StdOut Do Until STD.AtEndOfStream TxT = STD.ReadLine CNT = CNT + 1 If CNT = 2 Then Exit Do Loop If EXE.Status = 0 Then EXE.Terminate If TxT = "FC: 相違点は検出されませんでした" Then CNT = 0 Else CNT = 1 End If Else CNT = EXE.ExitCode End If STD.Close Comp = CNT Dim keka As Long keka = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT") Select Case keka Case 0: MsgBox "二つのファイルの内容は等しい" Case 1: MsgBox "二つのファイルの内容は等しくない" Case 2: MsgBox "入出力障害を検出した" End Select End Function

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • フォルダ内の全てのファイル開く時間短縮の方法

    Excelのマクロを使ってフォルダ内の全てのファイルを開く以下のコードを利用しているのですが(教えてgoo!で教えて頂いたコードです)、ファイル数が10個くらいあるため全部開くのに1分くらいかかってしまいます。 もっと時間を短縮することはできませんでしょうか? Sub OpenAllBook()   Dim FileName As String   Dim OpenedBook As Workbook   Dim IsBookOpen As Boolean   ChDir ("フォルダ名")   FileName = Dir("*.xls")   Do While FileName <> ""    If FileName <> ThisWorkbook.Name Then     IsBookOpen = False     For Each OpenedBook In Workbooks      If OpenedBook.Name = FileName Then       IsBookOpen = True       Exit For      End If     Next     If IsBookOpen = False Then      Workbooks.Open (FileName)     End If    End If    FileName = Dir()   Loop End Sub

  • 指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすいい方法(CGI)

    指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすというようにしたいのです。 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } $tate = $cnt/10; print "<TABLE CELLSPACING=0 CELLPADDING=2>\n"; print "<TR>\n"; for($i=1;$i<11;){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if("$i.jpg" eq "$F"){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50><BR>$i</TD>\n"; $i=$i+1; } #if } #for $n } #for $i というようにしてみたのですが時間がかかりすぎてしまいます。 何かいい方法はないでしょうか?

    • 締切済み
    • CGI
  • あるフォルダ内のすべての.xlsファイルを開いて印刷

    お世話になります。 エクセルVBAの質問です。 あるフォルダを指定して、その中のファイルを順番に開いて印刷したいと思っていますが、どのように記述したらよいのでしょうか。 下記、いろいろなところから引っ張ってきたのをつないだコードです。 すみませんが、ご教授願います。 Dim ShellApp As Object Dim oFolder As Object Dim targetFolderName As String Dim Xlname As String, Dpath As String, Opn As Integer Dim Fnd As Boolean Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) If oFolder Is Nothing Then Exit Sub End If targetFolderName = oFolder.items.Item.Path Dpath = "targetFolderName" Xlname = Dir(Dpath & "*.xls") Do While Xlname <> "" Opn = 0 Do Fnd = False For Each file_name In Windows If file_name.Caption = Xlname Then Fnd = True Exit For End If Next If Not Fnd Then If Opn = 1 Then Exit Do Workbooks.Open Filename:=Dpath & Xlname Opn = 1 End If ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Loop Xlname = Dir() Loop

  • 配列にて格納したデータの出力

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを1行ずつ配列として格納した後に、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですがよく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890 454 String.txtの完成形 AbFgp あ ylut BLKL え '変数の宣言 Dim myFile, myText, myList(), myList2(), str, B, C As String Dim XX As Integer Dim myFunc As Boolean Dim cnt, i As Long On Error GoTo myError myFile = Dir("InputDama.txt") 'ファイルの読み込み If myFile = "InputDama.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Line Input #1, myText If myText <> "" Then If cnt = 0 Then ReDim myList(cnt), myList2(cnt) Else ReDim Preserve myList(UBound(myList) + 1), myList2(UBound(myList2) + 1) End If '数字・文字列の分類 CC = Len(myText) For XX = 1 To CC str = Mid(myText, XX, 1) If IsNumeric(str) = True Then '←数字かどうかはIsNumericで判断 B = B & str Else C = C & str End If Next myList(cnt) = B myList2(cnt) = C cnt = cnt + 1 End If Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 For cnt = 0 To UBound(myList) Print #2, myList(cnt) Next cnt For cnt = 0 To UBound(myList2) Print #3, myList2(cnt) Next cnt Close #1, #2, #3 End Sub これだと、2行目に1行目で格納したデータが最後出てしまうので、それを取り除きたいのですが、効果的な方法が分かりませんので、宜しくお願いします。

  • バッチでファイルを分割する

    例えば、100行あるファイルを10行ずつに分割し、 分割後10個のファイルを作成したいと考えていますが、 なかなか思うように行きません。 是非、お知恵を拝借でできると大変助かります。 FOR /F %%i in (D:\\\\file.txt) do ( echo %%i >> outfile.txt CALL :COUNT ) exit /b :COUNT SET /a I=I+1 echo [%I%] です。 IF %I%==10 ( set I=0 ) exit /b

  • バッチでファイルを分割する

    例えば、100行あるファイルを10行ずつに分割し、 分割後10個のファイルを作成したいと考えていますが、 なかなか思うように行きません。 是非、お知恵を拝借でできると大変助かります。 FOR /F %%i in (D:\\file.txt) do ( echo %%i >> outfile.txt CALL :COUNT ) exit /b :COUNT SET /a I=I+1 echo [%I%] です。 IF %I%==10 ( set I=0 ) exit /b

  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • VBAの記述で、あるシートを別ファイルにした場合

    エクセル2002で、商品を管理しています。 1列目に品番をいれると、2列目に品名が表示するようにし、 新規の品番は品名を入れると、追加登録されるようにVBAを組みました。 今度、このシート"商品"を別ファイル(商品.xls)にしたいと思うのですが、 どうしても、やり方が分かりません。 よろしくお願いします。 Public Sub Worksheet_Change(ByVal Target As Excel.Range) Dim 品番 As String Dim 品名 As String Dim i As Long With Target If .Column = 1 Then 品番 = .Text For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then ActiveSheet.Cells(.Row, 2) = "" Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then ActiveSheet.Cells(.Row, 2) = Sheets("商品").Cells(i, 2) Exit For End If Next i End If If .Column = 2 Then 品名 = .Text 品番 = ActiveSheet.Cells(.Row, 1) If 品名 = "" Or 品番 = "" Then Else For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then Sheets("商品").Cells(i, 1) = 品番 Sheets("商品").Cells(i, 2) = 品名 Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then Exit For End If Next i End If End If End With End Sub