SSブログ

エクセル小僧:テキストファイルを比較 [コンピューター]

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行目の有無です。

エクセルのワークシートは、こんな風になっています。

001.jpg

比較するテキストファイルのフルパスが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行目:比較の結果、差分がある場合は、メッセージを表示。

002.jpg

45-53行目:2つのテキストファイルのEOF()を比較し、異なる場合は、EOFまでいっていない方の
ファイルを1行ずつ読み出し、行数を確定する。
54-56行目:行数が異なることを表示。

003.jpg

59-61行目:ファイルを閉じる。

Give it away について、こんな解説もありました。

http://english.mag2.com/tty/070105.html

スガ シカオ(SUGA SHIKAO) / Cloudy


こんな季節は、もうちょっと先ですね。

カメラ選び、難航しています。


Canon デジタルカメラ PowerShot G1X 1.5型高感度CMOSセンサー 3.0型バリアングル液晶 PSG1X

Canon デジタルカメラ PowerShot G1X 1.5型高感度CMOSセンサー 3.0型バリアングル液晶 PSG1X

  • 出版社/メーカー: キヤノン
  • メディア: エレクトロニクス



PowerShot G1Xは大きすぎ、重すぎです。


Canon デジタルカメラ PowerShot G15 約1210万画素 F1.8 光学5倍ズーム PSG15

Canon デジタルカメラ PowerShot G15 約1210万画素 F1.8 光学5倍ズーム PSG15

  • 出版社/メーカー: キヤノン
  • メディア: エレクトロニクス



PowerShot G15が出るらしいですが。。
軽くければ、可動式液晶は不要です。





NIKON1 V2は今年中にでるのでしょうか?
出ても、出始めは10万円? フラッシュ内蔵にならないかなあ?


FUJIFILM デジタルカメラ X10 1200万画素 2/3型EXR-CMOS F FX-X10

FUJIFILM デジタルカメラ X10 1200万画素 2/3型EXR-CMOS F FX-X10

  • 出版社/メーカー: 富士フイルム
  • メディア: エレクトロニクス



こちらは新型は出ないのでしょうか?
それにしても、毎年、新型を出して、まともな設計ができるのかなあ?

007.JPG

うちの茄子料理。素揚げにした茄子を本だしでいただきます。[猫]

ヤバイぜ!(4)  コメント(1)  トラックバック(1) 
共通テーマ:日記・雑感

ヤバイぜ! 4

コメント 1

cheese999

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) 

Facebook コメント

トラックバック 1

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。