エクセル小僧:テキストファイルを比較 [コンピューター]
9/17の記事で、DF(テキスト比較を行うアプリ)をエクセルから起動する方法を紹介しましたが。。
DFを使わず、VBAだけで比較する方法も分かりましたので紹介します。
でも、DFの様にグラフィック表示できませんので。。
まず、比較対象となる2つのテキストファイルを準備します。
ファイル1:aaa.txt
1: hoge hoge
2: cmd1 -op1 3 -op2 500 -op3 610
3: cmd1 -op1 3 -op2 200 -op3 880
4: cmd1 -op1 3 -op2 330 -op3 440
5: cmd1 -op1 3 -op2 400 -op3 400
6:
[EOF]
ファイル2:bbb.txt
1: hoge hoge
2: cmd1 -op1 3 -op2 500 -op3 610
3: cmd1 -op1 3 -op2 200 -op3 880
4: cmd1 -op1 3 -op2 330 -op3 440
5: cmd1 -op1 3 -op2 400 -op3 500
[EOF]
違いは、5行目が違うのと、6行目の有無です。
エクセルのワークシートは、こんな風になっています。
比較するテキストファイルのフルパスがfile1, file2という名前のセルに入力されています。
マクロを起動するための『比較』というボタンがあります。
マクロは、こんな感じです。
01: Sub USDiff1()
02: ' 機能:2つのテキストファイルを比較する
03: ' 【変数定義】
04: Dim file1(1) As String ' ファイル名(フルパス)
05: Dim file2(1) As String ' ファイル名
06: Dim nFNO(1) As Integer 'ファイル番号
07: Dim buf(1) As String ' テキスト読み出し用バッファ
08: Dim line_no(1) As Integer ' 行数
09: Dim str1 As String ' 文字列
10: Dim i As Integer ' 整数
11: ' ファイル名
12: file1(0) = Range("file1").Value ' テキストファイル1のファイル名(フルパス)
13: file1(1) = Range("file2").Value ' テキストファイル2のファイル名(フルパス)
14: ' ファイルが存在するか確認
15: For i = 0 To 1
16: If Dir(file1(i)) = "" Then
17: MsgBox i & ": " & file1(i) & "が存在しません。"
18: Exit Sub
19: End If
20: Next
21: For i = 0 To 1
22: ' 使用可能なファイル番号を調べる
23: nFNO(i) = FreeFile()
24: ' ファイルを開く
25: Open file1(i) For Input As #nFNO(i)
26: ' 行数を初期化
27: line_no(i) = 0
28: ' ファイル名から、パスを除く
29: file2(i) = Dir(file1(i))
30: Next
31: ' どちらかのファイルがEOFになるまで繰り返す
32: Do Until EOF(nFNO(0)) Or EOF(nFNO(1))
33: For i = 0 To 1
34: Line Input #nFNO(i), buf(i) ' 1行ずつ読み出す
35: line_no(i) = line_no(i) + 1 ' 行番号を1増やす
36: ' 1行ずつ比較
37: If i = 1 And StrComp(buf(0), buf(1), vbTextCompare) <> 0 Then
38: MsgBox line_no(0) & "行目が異なります。" & vbCrLf _
39: & file2(0) & "=" & buf(0) & vbCrLf _
40: & file2(1) & "=" & buf(1)
41: End If
42: Next
43: Loop
44: ' 行数が異なるか?
45: If EOF(nFNO(0)) <> EOF(nFNO(1)) Then
46: For i = 0 To 1
47: If EOF(nFNO(i)) = False Then
48: Do Until EOF(nFNO(i))
49: Line Input #nFNO(i), buf(i) ' 1行ずつ読み出す
50: line_no(i) = line_no(i) + 1 ' 行番号を1増やす
51: Loop
52: End If
53: Next
54: MsgBox "行数が異なります。" & vbCrLf _
55: & file2(0) & "=" & line_no(0) & vbCrLf _
56: & file2(1) & "=" & line_no(1)
57: End If
58: ' ファイルを閉じる
59: For i = 0 To 1
60: Close #nFNO(i)
61: Next
62: End Sub
4-10行目:変数を定義します。
12-13行目:比較するテキストファイルのファイル名(フルパス)をfile1配列に代入。
15-20行目:比較するテキストファイルが存在しない場合は、マクロを終了。
23行目:使用可能なファイル番号を調べて、nFNO配列に代入。
25行目:テキストファイルを開く
27行目:行数を初期化
29行目:フルパスのファイル名から、パス部分を除いたものを、file2配列に代入。
32-43行目:テキストファイルを1行ずつ読み出し、比較。差分がある場合はメッセージを表示。
32行目:どちらかのテキストファイルがEOF(ファイルの最後)までいったら、ループを抜ける
37行目:StrComp関数で読みだした1行を比較。vbTextCompareは、テキストモードでの比較を意味する。
http://www.moug.net/tech/exvba/0140001.html
を参照。
38-40行目:比較の結果、差分がある場合は、メッセージを表示。
45-53行目:2つのテキストファイルのEOF()を比較し、異なる場合は、EOFまでいっていない方の
ファイルを1行ずつ読み出し、行数を確定する。
54-56行目:行数が異なることを表示。
59-61行目:ファイルを閉じる。
Give it away について、こんな解説もありました。
http://english.mag2.com/tty/070105.html
スガ シカオ(SUGA SHIKAO) / Cloudy
こんな季節は、もうちょっと先ですね。
カメラ選び、難航しています。
PowerShot G1Xは大きすぎ、重すぎです。
PowerShot G15が出るらしいですが。。
軽くければ、可動式液晶は不要です。
NIKON1 V2は今年中にでるのでしょうか?
出ても、出始めは10万円? フラッシュ内蔵にならないかなあ?
こちらは新型は出ないのでしょうか?
それにしても、毎年、新型を出して、まともな設計ができるのかなあ?
うちの茄子料理。素揚げにした茄子を本だしでいただきます。
DFを使わず、VBAだけで比較する方法も分かりましたので紹介します。
でも、DFの様にグラフィック表示できませんので。。
まず、比較対象となる2つのテキストファイルを準備します。
ファイル1:aaa.txt
1: hoge hoge
2: cmd1 -op1 3 -op2 500 -op3 610
3: cmd1 -op1 3 -op2 200 -op3 880
4: cmd1 -op1 3 -op2 330 -op3 440
5: cmd1 -op1 3 -op2 400 -op3 400
6:
[EOF]
ファイル2:bbb.txt
1: hoge hoge
2: cmd1 -op1 3 -op2 500 -op3 610
3: cmd1 -op1 3 -op2 200 -op3 880
4: cmd1 -op1 3 -op2 330 -op3 440
5: cmd1 -op1 3 -op2 400 -op3 500
[EOF]
違いは、5行目が違うのと、6行目の有無です。
エクセルのワークシートは、こんな風になっています。
比較するテキストファイルのフルパスがfile1, file2という名前のセルに入力されています。
マクロを起動するための『比較』というボタンがあります。
マクロは、こんな感じです。
01: Sub USDiff1()
02: ' 機能:2つのテキストファイルを比較する
03: ' 【変数定義】
04: Dim file1(1) As String ' ファイル名(フルパス)
05: Dim file2(1) As String ' ファイル名
06: Dim nFNO(1) As Integer 'ファイル番号
07: Dim buf(1) As String ' テキスト読み出し用バッファ
08: Dim line_no(1) As Integer ' 行数
09: Dim str1 As String ' 文字列
10: Dim i As Integer ' 整数
11: ' ファイル名
12: file1(0) = Range("file1").Value ' テキストファイル1のファイル名(フルパス)
13: file1(1) = Range("file2").Value ' テキストファイル2のファイル名(フルパス)
14: ' ファイルが存在するか確認
15: For i = 0 To 1
16: If Dir(file1(i)) = "" Then
17: MsgBox i & ": " & file1(i) & "が存在しません。"
18: Exit Sub
19: End If
20: Next
21: For i = 0 To 1
22: ' 使用可能なファイル番号を調べる
23: nFNO(i) = FreeFile()
24: ' ファイルを開く
25: Open file1(i) For Input As #nFNO(i)
26: ' 行数を初期化
27: line_no(i) = 0
28: ' ファイル名から、パスを除く
29: file2(i) = Dir(file1(i))
30: Next
31: ' どちらかのファイルがEOFになるまで繰り返す
32: Do Until EOF(nFNO(0)) Or EOF(nFNO(1))
33: For i = 0 To 1
34: Line Input #nFNO(i), buf(i) ' 1行ずつ読み出す
35: line_no(i) = line_no(i) + 1 ' 行番号を1増やす
36: ' 1行ずつ比較
37: If i = 1 And StrComp(buf(0), buf(1), vbTextCompare) <> 0 Then
38: MsgBox line_no(0) & "行目が異なります。" & vbCrLf _
39: & file2(0) & "=" & buf(0) & vbCrLf _
40: & file2(1) & "=" & buf(1)
41: End If
42: Next
43: Loop
44: ' 行数が異なるか?
45: If EOF(nFNO(0)) <> EOF(nFNO(1)) Then
46: For i = 0 To 1
47: If EOF(nFNO(i)) = False Then
48: Do Until EOF(nFNO(i))
49: Line Input #nFNO(i), buf(i) ' 1行ずつ読み出す
50: line_no(i) = line_no(i) + 1 ' 行番号を1増やす
51: Loop
52: End If
53: Next
54: MsgBox "行数が異なります。" & vbCrLf _
55: & file2(0) & "=" & line_no(0) & vbCrLf _
56: & file2(1) & "=" & line_no(1)
57: End If
58: ' ファイルを閉じる
59: For i = 0 To 1
60: Close #nFNO(i)
61: Next
62: End Sub
4-10行目:変数を定義します。
12-13行目:比較するテキストファイルのファイル名(フルパス)をfile1配列に代入。
15-20行目:比較するテキストファイルが存在しない場合は、マクロを終了。
23行目:使用可能なファイル番号を調べて、nFNO配列に代入。
25行目:テキストファイルを開く
27行目:行数を初期化
29行目:フルパスのファイル名から、パス部分を除いたものを、file2配列に代入。
32-43行目:テキストファイルを1行ずつ読み出し、比較。差分がある場合はメッセージを表示。
32行目:どちらかのテキストファイルがEOF(ファイルの最後)までいったら、ループを抜ける
37行目:StrComp関数で読みだした1行を比較。vbTextCompareは、テキストモードでの比較を意味する。
http://www.moug.net/tech/exvba/0140001.html
を参照。
38-40行目:比較の結果、差分がある場合は、メッセージを表示。
45-53行目:2つのテキストファイルのEOF()を比較し、異なる場合は、EOFまでいっていない方の
ファイルを1行ずつ読み出し、行数を確定する。
54-56行目:行数が異なることを表示。
59-61行目:ファイルを閉じる。
Give it away について、こんな解説もありました。
http://english.mag2.com/tty/070105.html
スガ シカオ(SUGA SHIKAO) / Cloudy
こんな季節は、もうちょっと先ですね。
カメラ選び、難航しています。
Canon デジタルカメラ PowerShot G1X 1.5型高感度CMOSセンサー 3.0型バリアングル液晶 PSG1X
- 出版社/メーカー: キヤノン
- メディア: エレクトロニクス
PowerShot G1Xは大きすぎ、重すぎです。
Canon デジタルカメラ PowerShot G15 約1210万画素 F1.8 光学5倍ズーム PSG15
- 出版社/メーカー: キヤノン
- メディア: エレクトロニクス
PowerShot G15が出るらしいですが。。
軽くければ、可動式液晶は不要です。
Nikon デジタル一眼カメラ Nikon 1 (ニコンワン) V1 (ブイワン) 薄型レンズキット ブラックN1 V1ULK BK
- 出版社/メーカー: ニコン
- メディア: エレクトロニクス
NIKON1 V2は今年中にでるのでしょうか?
出ても、出始めは10万円? フラッシュ内蔵にならないかなあ?
FUJIFILM デジタルカメラ X10 1200万画素 2/3型EXR-CMOS F FX-X10
- 出版社/メーカー: 富士フイルム
- メディア: エレクトロニクス
こちらは新型は出ないのでしょうか?
それにしても、毎年、新型を出して、まともな設計ができるのかなあ?
うちの茄子料理。素揚げにした茄子を本だしでいただきます。
nice! ありがとうございます。
マクロですが、メッセージに表示されるファイル名が、実際のファイル名になるように修正しました。
次の一手ですが、テキストファイル名をファイル選択ダイアログを開いて、そこから入力する機能を追加します。マクロ自体はできているので、記事はそのうち。。。
http://www.happy2-island.com/excelsmile/smile03/capter00803.shtml
http://officetanaka.net/excel/vba/file/file02.htm
(^_0)ノ
by cheese999 (2012-09-23 22:21)