
以前よりこちらでファイル比較を相談していたものですが
ファイル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
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 は消去してください。
nda23様
いつもありがとうございます。
御教授頂いたソースを試したところ
ReDim Preserve F(I) = F1 '記録する
で構文エラーと出てコンパイル出来ませんでした。
この場合何が原因なのでしょうか?
またI=-1となっておりますが、なぜ-1からはじめるのですか?
お暇な時にでも御回答頂けるとありがたいです。
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側のパス名 '★←ここから以前のまま
nda23様
いつもお世話になっております。
nda23様のおかげで当初の目的だった、変換後のファイル比較が
無事に完成致しました。
御指導頂きありがとうございます。
またご縁がありましたら宜しくお願い致します。
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指定です。
nda23様
御回答ありがとうございます。
御教授頂いたソースに変更したところ
For Eachを配列で使用する場合は、バリアント型の配列でなければいけません。
とエラーが出てしまいます。バリアント型にする必要がやはりあるのでしょうか?
また-1表記も理解できました。詳しい解説いつもありがとうございます。
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を使ってはいけませんので、少し工夫が
必要です。この方法は別スレッドと言うことにしましょう。
nda23様
毎度毎度御回答頂きありがとうございます。
早速上記試してみました。
上手くいき結果も良好でした。
お手数でなければ(2)の方法も御教授いただけますでしょうか。
勉強になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名にドットを使ったフ...
-
exeファイルの中身を見る方法は...
-
コマンドプロンプトで作成日時...
-
公文書のxmlファイルの開き方が...
-
リンクの張り付けかたを教えて...
-
binファイルを解凍したいの...
-
監視ツールを入れさせられまし...
-
CSSを1ページに1枚作るのって変...
-
「ブルーファイル」と「グリー...
-
アクセス 壊れた? 「ファイ...
-
VBAのバイナリ出力について
-
コマンドプロンプトで、指定し...
-
.NETアプリを作ったときの .man...
-
Latexで図番号だけを「図1.1」...
-
USBメモリが接続されているか確...
-
jarファイル
-
jarファイルはzipファイルと同...
-
外部ファイルの数値を合計計算...
-
VB.NET ファイルの種別取得方法
-
ラッパーって何なんでしょう・...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトで作成日時...
-
binファイルを解凍したいの...
-
Latexで図番号だけを「図1.1」...
-
リンクの張り付けかたを教えて...
-
アクセス 壊れた? 「ファイ...
-
.NETアプリを作ったときの .man...
-
公文書のxmlファイルの開き方が...
-
#include <Windows.h>というヘ...
-
jarファイル
-
CSSを1ページに1枚作るのって変...
-
VBAのバイナリ出力について
-
bibtexで参考文献作成できない
-
自分で作成した重要ファイルを...
-
iPhoneでXMLファイルを開くには...
-
コマンドプロンプトで、指定し...
-
バッチ処理で追記コピーしたい
-
「ブルーファイル」と「グリー...
-
Seasar2のdiconファイルの読み方
-
CRCが一致する確率
-
C言語---ファイルに出力したデ...
おすすめ情報