Forum Discussion
Loop through Excel files and compare files not working
It seems like there are a few issues in your VBA code that might be causing it to not work as expected. Let us go through them and correct them step by step.
- Variables Initialization: Ensure that all variables are properly declared and initialized. In VBA, each variable should be explicitly declared with its type (Dim statement). Make sure to initialize each variable before using it.
- Looping through Files: When looping through files in a folder, you should use the FileSystemObject correctly to get the files in the folder. Also, use a For Each loop to iterate through each file.
- Opening Workbooks: When opening workbooks, make sure to handle errors properly, especially if a workbook fails to open for any reason.
- Worksheet Comparison: Ensure that you correctly compare the worksheets between the edited set and the reference set.
Here is an updated version of your code with corrections and comments:
Vba Code is untested backup your file first.
Sub Compare_Spreadsheets()
Dim editPath As String
Dim refPath As String
Dim filename As String
Dim refFname As String
Dim editwbk As Workbook
Dim refwbk As Workbook
Dim editws As Worksheet
Dim refws As Worksheet
Dim editFolder As Object
Dim FileSystem As Object
Dim editFile As Object
editPath = "C:\path\Set_1\"
refPath = "C:\path\Set_2\"
' Set up reference workbook (assuming you want to compare with one specific reference workbook)
refFname = "ReferenceWorkbook.xlsx" ' Update this with the actual reference workbook name
' Open the reference workbook
Set refwbk = Workbooks.Open(refPath & refFname)
Set refws = refwbk.Worksheets(1) ' Assuming the worksheet index is 1, adjust as necessary
' Loop through files in edited folder
Set FileSystem = CreateObject("Scripting.FileSystemObject")
Set editFolder = FileSystem.GetFolder(editPath)
For Each editFile In editFolder.Files
filename = editFile.Name
' Check if the file is an Excel file
If InStr(1, filename, ".xls") > 0 Or InStr(1, filename, ".xlsx") > 0 Then
' Open the edited workbook
Set editwbk = Workbooks.Open(editPath & filename)
' Assuming each workbook has only one worksheet
Set editws = editwbk.Worksheets(1) ' Adjust index if needed
' Compare each cell in the edited worksheet with the reference worksheet
For Each cell In editws.UsedRange
If cell.Value <> refws.Range(cell.Address).Value Then
cell.Interior.Color = vbYellow
MsgBox "Changed value in " & cell.Address & " in sheet " & editws.Name
End If
Next cell
' Close the edited workbook without saving changes
editwbk.Close SaveChanges:=False
End If
Next editFile
' Close the reference workbook
refwbk.Close SaveChanges:=False
End Sub
Explanation of Changes:
- Variable Declarations: All variables (editPath, refPath, filename, etc.) are properly declared and initialized.
- File Looping: Uses For Each editFile In editFolder.Files to correctly loop through each file in the editPath folder.
- Workbook and Worksheet Handling: Opens both edited and reference workbooks, and compares each cell in the edited worksheet (editws) with the corresponding cell in the reference worksheet (refws).
- Comparison Logic: Compares cell values and highlights differences in yellow using cell.Interior.Color.
Make sure to replace "ReferenceWorkbook.xlsx" with the actual name of your reference workbook in refFname. Adjust the worksheet index (Worksheets(1)) if your workbooks have more than one worksheet and you need to compare a specific one.
This should help you get started with comparing the edited set of Excel files against the reference set and highlighting the updates. Adjust the code further based on your specific requirements and file structures as needed. The text, steps and code were created with the help of AI.
My answers are voluntary and without guarantee!
Hope this will help you.
Was the answer useful? Mark as best response and Like it!
This will help all forum participants.
- cdfjdk1Jul 04, 2024Copper Contributor
Thank you NikolinoDE and apologies for a late reply. Your input was very helpful and has helped me move forward. The assumption I wanted to compare with one specific reference workbook was, however, wrong - the comparison is to be between pairs of workbooks. I have a working solution now as below.
Sub Compare_Spreadsheet_Pairs() 'Paired files in two separate folders 'Reference files have Ref_ prefix in file name 'Sheet names identical in each pair and are file name minus _YYYYYMMDD.xlsx Dim editPath As String, refPath As String, refFname As String, editFl As String, editFname As String, refFile As String, editwsname As String, refwsname1 As String, refwsname As String Dim editwbk As Workbook, refwbk As Workbook Dim editws As Worksheet, refws As Worksheet Dim cell As Range, URng As Range Dim countP As Long Dim editFile As Object, FileSystem As Object, editFolder As Object editPath = "C:\xxxx\edit_test\" refPath = "C:\xxxx\ref_test\" refFile = Dir(refPath & "*.xls*") Do While refFile <> "" Set refwbk = Workbooks.Open(refPath & refFile) refFname = refwbk.Name 'Remove _YYYYMMDD.xlsx (14 characters) from filename to get the workbook base name refwsname1 = Left(refwbk.Name, Len(refwbk.Name) - 14) 'Remove Ref_ (4 characters) from base name to get sheetname refwsname = Right(refwsname1, Len(refwsname1) - 4) Set refws = refwbk.Worksheets(refwsname) Set FileSystem = CreateObject("Scripting.FileSystemObject") Set editFolder = FileSystem.GetFolder(editPath) editFl = Right(refwbk.Name, Len(refwbk.Name) - 4) Set editwbk = Workbooks.Open(editPath & editFl) editFname = editwbk.Name 'Remove _YYYYMMDD.xlsx (14 characters) from filename to get sheetname editwsname = Left(editwbk.Name, Len(editwbk.Name) - 14) Set editws = editwbk.Worksheets(editwsname) countP = countP + 1 'count the pair of compared workbooks 'Compare each cell in edited sheet with reference sheet For Each cell In editws.UsedRange If cell.Value <> refws.Range(cell.Address).Value Then 'cell.Interior.Color = vbYellow addToRange URng, cell 'place the cell in a Union range End If Next cell If Not URng Is Nothing Then URng.Interior.Color = vbYellow Set URng = Nothing editwbk.Close SaveChanges:=True refwbk.Close SaveChanges:=False refFile = Dir Loop MsgBox countP & " pair(s) of files compared", vbInformation, "Job done" End Sub Sub addToRange(rngU As Range, rng As Range) If rngU Is Nothing Then Set rngU = rng Else Set rngU = Union(rngU, rng) End If End Sub