Сравнение двух файлов Excel с использованием кодирования vba

#excel #vba #comparison

Вопрос:

У меня есть два файла Excel под названием «Файл1» и «Файл2», которые содержат по два столбца, каждый из которых называется человеком, Адрес, если имя человека совпадает в обоих случаях, то необходимо сравнить адрес этого конкретного имени человека в обоих случаях, и необходимо выделить различия. Может ли кто-нибудь помочь мне с кодом VBA для этого

Комментарии:

1. Вы можете сделать это с помощью условного форматирования, используя формулу VLOOKUP

Ответ №1:

Сравнение столбцов ( Match feat. Union )

  • Предполагается, что обе книги открыты.
  • Отрегулируйте значения в разделе константы и цвета в конце кода.
  • Принцип источника/назначения здесь имеет мало смысла, но я предпочитаю его нумерации.
  • В двух словах, он будет проходить по ячейкам источника, пытаясь сопоставить ячейку в пункте назначения и проверяя значения, расположенные рядом с нужными ячейками. Если они не равны, будут выделены оба.
  • С не найденными значениями ячеек ничего не произойдет.
 Option Explicit

Sub highlightDifferences()
    
    Const swbName As String = "File1.xlsx"
    Const sName As String = "Sheet1"
    Const sCols As String = "A:B"
    Const sFirstRow As Long = 2
    
    Const dwbName As String = "File2.xlsx"
    Const dName As String = "Sheet2"
    Const dCols As String = "A:B"
    Const dFirstRow As Long = 2
    
    Dim sws As Worksheet: Set sws = Workbooks(swbName).Worksheets(sName)
    Dim srg As Range
    Dim sCell As Range
    With sws.Range(sCols).Rows(sFirstRow)
        Set sCell = .Resize(.Worksheet.Rows.Count - .Row   1) _
            .Find("*", , xlValues, , , xlPrevious)
        If sCell Is Nothing Then Exit Sub
        Set srg = .Resize(sCell.Row - .Row   1)
    End With
    
    Dim dws As Worksheet: Set dws = Workbooks(dwbName).Worksheets(dName)
    Dim drg As Range:
    With dws.Range(dCols).Rows(dFirstRow)
        Dim dCell As Range
        Set dCell = .Resize(.Worksheet.Rows.Count - .Row   1) _
            .Find("*", , xlValues, , , xlPrevious)
        If dCell Is Nothing Then Exit Sub
        Set drg = .Resize(dCell.Row - .Row   1)
    End With
    Dim drg1 As Range: Set drg1 = drg.Columns(1)
    Dim drg2 As Range: Set drg2 = drg.Columns(2)
    
    Dim srgDel As Range
    Dim drgDel As Range
    Dim cIndex As Variant
    
    For Each sCell In srg.Columns(1).Cells
        cIndex = Application.Match(sCell.Value, drg1, 0)
        If IsNumeric(cIndex) Then
            If sCell.Offset(, 1).Value <> drg2.Cells(cIndex).Value Then
                If srgDel Is Nothing Then
                    Set srgDel = sCell.Offset(, 1)
                    Set drgDel = drg2.Cells(cIndex)
                Else
                    Set srgDel = Union(srgDel, sCell.Offset(, 1))
                    Set drgDel = Union(drgDel, drg2.Cells(cIndex))
                End If
            End If
        End If
    Next sCell
    
    If Not srgDel Is Nothing Then
        srgDel.Interior.Color = vbYellow
        drgDel.Interior.Color = vbYellow
    End If

End Sub
 

Комментарии:

1. Большое спасибо, что помогли мне его запустить и получили мой результат

Ответ №2:

 Sub CompareAddresses()
    Dim File1 As String
    Dim File2 As String
    Dim Sheetname1 As String
    Dim Sheetname2 As String
    Dim List1 As Variant
    Dim List2 As Variant
    Dim lastrow As Long
    Dim DiffAddress1() As Boolean
    Dim DiffAddress2() As Boolean
    Dim a As Long
    Dim b As Long
    Dim firstRow As Integer
    
    'Define Filepathes and Sheetnames
    File1 = "C:ExcelFile1.xlsx"
    File2 = "C:ExcelFile2.xlsx"
    Sheetname1 = "NameList"
    Sheetname2 = "NameList"
    firstRow = 2 'Row in which the data starts in both sheets
    
    'Open Files and load Data in Arrays
    Workbooks.Open Filename:=File1
    Windows(FilnameFromPath(File1)).activate
    Sheets(Sheetname1).Select
    lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    List1 = Range("A1:B" amp; lastrow)
    ReDim DiffAddress1(lastrow)

    Workbooks.Open Filename:=File2
    Windows(FilnameFromPath(File2)).activate
    Sheets(Sheetname2).Select
    lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    List2 = Range("A1:B" amp; lastrow)
    ReDim DiffAddress2(lastrow)
    
    'Check for Differences in Data
    For a = firstRow To UBound(List1, 1)
        For b = firstRow To UBound(List2, 1)
            If List1(a, 1) = List2(b, 1) Then
                If Not List1(a, 2) = List2(b, 2) Then
                    DiffAddress1(a) = True
                    DiffAddress2(b) = True
                End If
            End If
        Next b
    Next a
    
    'Mark Differences in Sheets with yellow background
    Windows(FilnameFromPath(File1)).activate
    Sheets(Sheetname1).Select
    For a = firstRow To UBound(List1, 1)
        If DiffAddress1(a) = True Then
            Range("B" amp; a).Interior.Color = 65535
        End If
    Next a
    Windows(FilnameFromPath(File2)).activate
    Sheets(Sheetname2).Select
    For a = firstRow To UBound(List2, 1)
        If DiffAddress2(a) = True Then
            Range("B" amp; a).Interior.Color = 65535
        End If
    Next a
    
End Sub


Public Function FilnameFromPath(FilePath As String) As String
    Dim int_Pos As Integer
    int_Pos = InStrRev(FilePath, "")
    FilnameFromPath = Mid(FilePath, int_Pos   1, Len(FilePath) - int_Pos)
End Function