• 締切済み

2つのExcelファイルを比較して差分チェック

表記の件について質問です。2つのExcelファイル(新旧)があるとします。 新ファイルのA列(最初の行は項目名なので無視)の2行目の値を旧ファイルの同じくA列2行目から空白が見つかるまでのセル範囲内を検索し、ヒットしたら横の行を比較して差分があればセルを塗潰しします。塗潰しするのはあくまでも新ファイルとしたいです。 ※新ファイルに含まれて旧ファイルに含まれないものも赤色で塗潰し。逆に新ファイルになくて旧ファイルにあるものは敢えて抜き出す必要はありません。 Option Explicit '変数を定義しないとエラーとする宣言 '定数の宣言 'Const 定数名 [As データ型] = "定数の値" Const workFolder = "c:\temp" Sub sample() 'Dimステートメントで変数の定義 Dim srcFolder As String Dim dstFolder As String srcFolder = "c:\test\a" 'フォルダA dstFolder = "c:\test\b" 'フォルダB 'Excelからファイルを操作するためのファイルオブジェクト Dim fso As New FileSystemObject Dim srcFile As String Dim dstFile As String Dim srcWorkFile As String Dim dstWorkFile As String Dim f As File Dim n As Integer '進行状況表示用 Dim i As Integer '進行状況表示用 '表示設定 'ステータスバーの表示 Application.DisplayStatusBar = True '編集中の画面描画を禁止 Application.ScreenUpdating = False '作業ファイル名を指定 srcWorkFile = workFolder & "\src.xls" dstWorkFile = workFolder & "\dst.xls" 'GetFolderオブジェクトはフォルダからFolderオブジェクトを作成するメソッドでフォルダの操作やフォルダの詳細情報の取得が行える。 'GetFolderオブジェクトのFilesプロパティ、FilesコレクションのCountプロパティでフォルダ内のファイル数を取得する。 n = fso.GetFolder(srcFolder).Files.Count For Each f In fso.GetFolder(srcFolder).Files i = i + 1 If f Like "*.xlsx" Then 'srcFolderのファイルと同じ名前のファイルがdstFolderにもあるとする srcFile = srcFolder & "\" & f.Name dstFile = dstFolder & "\" & f.Name 'ステータスバー表示 Application.StatusBar = srcFile & " と " & dstFile & " を、チェック中 (" & i & "/" & n & ")" '作業フォルダにファイルをコピー fso.CopyFile srcFile, srcWorkFile, True fso.CopyFile dstFile, dstWorkFile, True 'ブックチェック checkBook srcWorkFile, dstWorkFile '作業フォルダのファイルを戻す fso.CopyFile srcWorkFile, srcFile, True fso.CopyFile dstWorkFile, dstFile, True End If Next '作業ファイルを削除 fso.DeleteFile srcWorkFile fso.DeleteFile dstWorkFile '後始末 Set fso = Nothing Application.ScreenUpdating = True Application.StatusBar = False End Sub 'ブック(ファイル)のチェック Sub checkBook(srcFile As String, dstFile As String) Dim srcBook As Workbook Dim dstBook As Workbook Dim ws As Worksheet Set srcBook = Workbooks.Open(srcFile) Set dstBook = Workbooks.Open(dstFile) 'srcBookのシート名と同じシートがdstBookにもあるとしてチェック For Each ws In srcBook.Worksheets checkSheet ws, dstBook.Worksheets(ws.Name) Next srcBook.Close savechanges:=True dstBook.Close savechanges:=True End Sub 'シートのチェック Sub checkSheet(srcSheet As Worksheet, dstSheet As Worksheet) '背景色のクリア srcSheet.Cells.Interior.ColorIndex = xlNone dstSheet.Cells.Interior.ColorIndex = xlNone '両方のUsedRange範囲内で変更点をチェック checkSheetUsedRange srcSheet, dstSheet checkSheetUsedRange dstSheet, srcSheet End Sub 'シートのチェック(srcSheetのUsedRange内) Sub checkSheetUsedRange(srcSheet As Worksheet, dstSheet As Worksheet) Dim r As Range For Each r In srcSheet.UsedRange If r <> dstSheet.Range(r.Address) Then r.Interior.ColorIndex = 3 dstSheet.Range(r.Address).Interior.ColorIndex = 3 End If Next End Sub 上記マクロのシートのチェックですと、差分が見つかるとそれ以降全て差分ありと判断されてしまい思うような結果を得られません。

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

コードの直接的な回答ではありません。 行・列の増減を考慮にいれたコードを記述しないと、ご質問のような問題点に直面します。 テキストデータの差分を抽出する際は通常diffというロジックを使用します。 参考 https://ja.wikipedia.org/wiki/Diff http://dsp74118.blogspot.jp/2013/12/vba-exceldiff.html また、Excelの2ファイルにおいて差分を抽出するツールはベクターなどでフリーソフトで公開されていますので、ご検討されてはどうでしょうか。 エクセル差分比較ツール http://www.vector.co.jp/soft/winnt/business/se492955.html エクセル比較 http://www.vector.co.jp/soft/win95/business/se412925.html

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA:2つのCSVファイルを開きたいです。

    エクセル2010のVBAにてCSVファイルを開き結合させるプログラムを組もうとしているのですが、2つ目のCSVファイルを開こうとすると、何故かエラーが出てしまいます。 -------------------------------------------------------------------------------- 1つ目 Sub mobile_FileSearch(Path As String) 'test.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call mobile_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "test.csv" Then Workbooks.Open ("test.csv") End If Next File End Sub ---------------------------------------------------------------------------- 2つ目 Sub local_FileSearch(Path As String) 'bbb.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call local_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "bbb.csv" Then Workbooks.Open ("bbb.csv")'←ここでエラー End If Next File End Sub ------------------------------------------------------------------------ まったく同じプログラムで、csvファイル名だけ変えただけで実行時エラー1004が出てしまいます。 一体全体何が問題なのでしょうか?

  • テキストファイルをエクセルに移すマクロのことで?

    以前、複数のテキストファイルをエクセルに移すマクロを教えてもらったのですが、 以下マクロですと、フォルダのパスを指定しないといけません。 今回教えてもらいたいのは、フォルダのパスを指定しなくてもよい方法です。 どういう事かと言うと、仮にディスクトップにフォルダがあるとします。 そのフォルダの中には、マクロが入っているエクセルシートとテキストが入っているフォルダです。 つまり、そのフォルダ内だけで、処理をしたいと考えています。 また、フォルダ名は、その時によって異なります。 今までは、以下の方法を使っていたのですが、ちょっと使いにくいと感じています。 申し訳ありませんが、どなたか教えていただけないでしょうか? Sub Macro() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FolderPath As String 'ここのアドレスをファイルが格納されているフォルダのパスに変えてください FolderPath = "C:\Users\・・・" Dim myFile As Object Dim i As Long i = 2 Dim myFolder As Object For Each myFolder In fso.GetFolder(FolderPath).SubFolders For Each myFile In fso.GetFolder(myFolder).Files Cells(i, 4).Value = myFolder Cells(i, 1).Value = myFile.Name Cells(i, 7).Value = fso.OpenTextFile(myFile.Path).ReadAll() i = i + 1 Next Next End Sub Private Sub CommandButton1_Click() End Sub

  • vba ファイルの移動について

    フォルダAの中にあるたくさんのpdfファイルの中から、 ファイル名の頭文字3つがE列に記載した「aaa」だったら フォルダBに移動させるという内容にしたいです。 ネット検索などで、近いものを作成しましたが(下に貼り付け)、 下から4行目、「fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName」で 「実行時エラー'53'  ファイルが見つかりません。」 とエラーが出てしまいます。 どの様に書き直せばよいのでしょうか? どなたかご存じでしたら、ぜひお教え下さい。 よろしくお願いします。 エクセル2010を使用しています。 Sub CheckAndMoveFiles() Dim FolderA As String Dim FolderB As String FolderA = Range("D1").Value FolderB = Range("B2").Value Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim ws As Worksheet Set ws = ActiveSheet Dim lastRow As Long lastRow = ws.Range("E" & Rows.Count).End(xlUp).Row Dim r As Long Dim fileName As String For r = 1 To lastRow If ws.Cells(r, "E").Value <> "" Then fileName = ws.Cells(r, "E").Value dFileName = Dir(FolderA & "\" & Left(fileName, 3) & "*.pdf") Do While dFileName <> "" dFileName = Dir() Loop fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName 'ここでストップ End If Next End Sub

  • 変名が思うように処理されないのは ?

    現在、以下のようなコードでA列のファイル名に指定の不要文字が含まれる場合、削除して変名を行っています。 エラーは出ないのですが、同名チェックが想定と違うのか上手く処理できていません。 具体的には、 不要文字が無いのに(1)が追加されて変名される場合があります。 不具合の原因が判るでしょうか? Option Explicit Sub ファイル変更_部分削除() Dim Fso As Object 'FileSystemObject Dim Folder As Object 'Folder Dim File As Object 'File Dim FolderPath As String 'フォルダパス Dim Target As Variant '削除したい文字列 Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Target") Set ws2 = Worksheets("DEL") 'FileSystemObjectを作成 Set Fso = CreateObject("Scripting.FileSystemObject") 'フォルダパスを指定 FolderPath = "C:\Target\" 'Folderオブジェクトを取得 Set Folder = Fso.GetFolder(FolderPath) Worksheets("Target").Cells.Clear ws1.Range("A1") = "修正後のファイル名" ws1.Range("A1").Font.Bold = True ws1.Range("B1") = "拡張子" ws1.Range("B1").Font.Bold = True ws1.Range("C1") = "元ファイル名_退避" ws1.Range("C1").Font.Bold = True Dim ext As String Dim num As Long num = 2 For Each File In Folder.Files ext = Fso.getextensionname(File.Name) Select Case ext Case "ts", "mkv", "mp4" '元ファイル名及び同拡張子を出力 ws1.Cells(num, "A").Value = Fso.GetBaseName(File.Name) ws1.Cells(num, "B").Value = Fso.getextensionname(File.Name) num = num + 1 Case Else End Select Next Dim lc1 As Long, lc2 As Long lc1 = ws1.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得 lc2 = ws2.Cells(Rows.Count, "B").End(xlUp).Row '元ファイル名を退避 ws1.Range(ws1.Cells(2, "A"), ws1.Cells(lc1, "A")).Copy ws1.Cells(2, "C").PasteSpecial ws1.Columns("A:C").AutoFit '-------------------------------------------------------- 'Replacedメソッド / ワイルドカードを使って置換() Dim DelMojis As String '指定文字列を格納する変数 Dim i As Long Dim Fix1 As String For i = 2 To lc2 With ws1 .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=Fix1, Replacement:="", LookAt:=xlPart End With Next For i = 2 To lc2 DelMojis = ws2.Cells(i, "B") '指定文字列を変数に代入 With ws1 .Range(.Cells(2, "A"), .Cells(lc1, "A")).Replace what:=DelMojis, Replacement:="", LookAt:=xlPart End With Next '---------------------------------------- 'ファイル名変更 Dim OldName As String '元のファイル名 Dim NewName As String '新しいファイル名 For i = 2 To lc1 With ws1 OldName = FolderPath & .Cells(i, "C") & "." & .Cells(i, "B") NewName = FolderPath & .Cells(i, "A") & "." & .Cells(i, "B") End With With Fso 'fso=CreateObject("Scripting.FileSystemObject") '移動先に同名のファイルがあるかチェック If .FileExists(NewName) Then ' 同名がある場合は、NewNameの最後に(1)を追加する Dim k As Long k = InStrRev(NewName, ".") NewName = Left(NewName, k - 1) & "(1)" & Right(NewName, Len(NewName) - k + 1) .MoveFile OldName, NewName Else 'ファイルを移動 .MoveFile OldName, NewName End If End With '-------------------------- Next End Sub

  • FSOを使いサブフォルダのファイル操作

    同じ階層のサブフォルダにxlsm入るが入っており、VBAによりモジュールを解放しようと試みています。 まずは、FSOを使ってサブフォルダにアクセスしようとしましたが、下から6行目でエラー(424 オブジェクトが必要です)が出てしまい、解決できませんので、ご教示いただけないでしょうか? よろしくお願いします Sub DeleteMain() With Application.FileDialog(msoFileDialogFolderPicker) If Not .Show Then Exit Sub Call DeleteSub(folderPath:=.SelectedItems(1)) End With End Sub Sub DeleteSub(folderPath As String, Optional mycount As Long = 0) Dim fso As Object, myFolders As Object, myfile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFolders = fso.GetFolder(folderPath).SubFolders For Each myfile In fso.GetFolder(folderPath).Files mycount = mycount + 1 ' Cells(mycount, 1) = myfile.Path Debug.Print myfile.Path Next For Each myFolders In fso.GetFolder(folder.Path).SubFolders Call DeleteSub(myFolder.Path, mycount) Next Set fso = Nothing Set myFolders = Nothing End Sub

  • ファイルサイズを書き込めません。

    過去ログを検索したのですが載っていなかったので質問させて頂きます。 指定したフォルダ毎の容量を管理したいと考え,ネットで拾った以下のソースをEXCELで動かしましたが「書き込みできません」というエラーと共に書き込めませんでした。 Sub FolderSize_Count() Dim FSO As Variant Set FSO = CreateObject("Scripting.FileSystemObject") Dim Path As String With Sheets("Sheet2") Path = Application.Worksheets("sheet1").Range("A1").Value Sheet2.Cells(1, 1) = FSO.GetFolder(Path).Size End With End Sub 書き込めませんというキーワードで検索をGOOGLEでもかけたのですが見つからずに困っています。 もしよろしければご回答お願い致します。

  • VBAでアクティブなファイルを参照して、ファイル一覧作成(サブフォルダ含む)

    VBAでアクティブなファイルのフォルダ(サブフォルダを含む)のファイル一覧を 作成したいと思っています。 以下のサイトを参考にして、パス、ファイル名を落とすまではできました。 http://okwave.jp/qa3544575.html === Sub test() Application.ScreenUpdating = False Sheet1.Cells.Clear Sheet1.Cells(1, 1) = "パス" Sheet1.Cells(1, 2) = "ファイル名" files "d:\", 2 Application.ScreenUpdating = True End Sub Sub files(path As String, ByRef row As Long) DoEvents Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim f As Object For Each f In fso.GetFolder(path).files Sheet1.Cells(row, 1) = path Sheet1.Cells(row, 2) = f.Name row = row + 1 Next For Each f In fso.GetFolder(path).SubFolders files f.path, row Next Set fso = Nothing End Sub === >files "d:\" の箇所を修正して、アクティブなブックを参照しようとしてみたのですが、 なかなか上手くいきません。 また、できれば *.xls などファイルの種類を指定したいのです。 filesearchを使用して組んだ時は 「AAA = ActiveWorkbook.path」「Filetype ~ 」 などでそれらの指定ができたのですが、上記に応用する事ができません。 どなたかご教示頂けますよう、よろしくお願いいたしますm(_ _)m

  • 同名でもエラーにならない理由

    Sub バックアップ作成() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") FSO.CopyFile CurrentProject.FullName, "C:\test.mdb" Set FSO = Nothing End Sub このコードを実行すると、同じファイルがあってもエラーになりません。 Sub DiskOprate4() MkDir "C:\バックアップ" End Sub なら同名のフォルダがあればエラーになります。 ファイルはエラーにならないがフォルダならエラーになるのでしょうか? それともFSOというのを使うとエラーにならないのですか? よろしくお願いします。

  • VBAで、定数式が必要ですのエラー対応

    指定のファイルをフォルダAからフォルダBへ移動させるというvbaを 見つけたのですが、 サンプルの表記は「"C:\Data\A"」と直接場所をしていしたものなので、 参照するフォルダ場所として、セルC1を参照させようと、 「Range("C1")」と書き直したところ、 「コンパイルエラー:定数式が必要です」とエラーになってしまいます。 どの様に書き直せばよいのでしょうか? どなたかご存じでしたら、ぜひお教え下さい。 よろしくお願いします。 エクセル2010を使用しています。 Sub CheckAndMoveFiles() Const FolderA = Range("C1") 'エラー発生 'Const FolderA = "C:\Data\A" サンプルの表記   Const FolderB = "C:\Data\B" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim ws As Worksheet Set ws = ActiveSheet Dim lastRow As Long lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row Dim r As Long Dim fileName As String For r = 1 To lastRow If ws.Cells(r, "A").Value <> "" Then ' fileName = ws.Cells(r, "A").Value & ".xls" fileName = ws.Cells(r, "A").Value If fso.FileExists(FolderA & "\" & fileName) = True Then fso.moveFile FolderA & "\" & fileName, FolderB & "\" & fileName End If End If Next End Sub

  • 返ってくる値が違う

    VBAでフォルダの中のファイルの個数を取得するコードなのですが Sub test1() Dim i As Long, buf, Path As String Path = ActiveWorkbook.Path & "\" buf = Dir(Path & "*.*") Do While buf <> "" i = i + 1 buf = Dir() Loop MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & i & "個のファイルがあります。" End Sub Sub test2() Dim Path As String Dim i As Long, FSO As Object, f As Object Path = ActiveWorkbook.Path & "\" Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & FSO.GetFolder(Path).Files.Count & "個のファイルがあります。" Set FSO = Nothing End Sub Test1とtest2では返ってくる値が違うのですが なぜでしょうか? Test2はフォルダの個数も取得されてるのですか?

専門家に質問してみよう