Excel VBA - 根据值比较工作表行

时间:2011-11-10 17:59:39

标签: excel vba excel-vba

与此类似的问题:

Find the differences between 2 Excel worksheets?

Compare two excel sheets

我的问题具体来说,我每月都有一份员工名单,其中包含一个唯一的ID,大约有30列其他数据,大约有900名员工。

我正在努力完成两件事:

  1. 比较员工是否在名单之间添加或删除。
  2. 在每个员工的工作表之间比较该员工的其他数据是否发生了变化。职称改变了。
  3. 大多数比较加载项/模块我发现只按顺序比较特定范围,因此如果每次后续行发现一次差异就会有所不同。

    首先,我想知道是否有任何现有工具可以做到这一点。如果不是,我正在考虑建立自己的。我想通过循环每个员工并使用vlookup验证匹配来做到这一点。我担心这样做很多循环会使宏难以使用。关于我应该怎么做的任何指导?感谢。

2 个答案:

答案 0 :(得分:1)

未经测试,但会给你一个开始的地方...... 这并没有找到“旧”工作表上但不在“当前”工作表上的前雇员。

Sub CompareEmployeeInfo()

    Const ID_COL As Integer = 1 ' ID is in the first column
    Const NUM_COLS As Integer = 30 'how many columns are being compared?

    Dim shtNew As Excel.Worksheet, shtOld As Excel.Worksheet
    Dim rwNew As Range, rwOld As Range, f As Range
    Dim x As Integer, Id
    Dim valOld, valNew

    Set shtNew = ActiveWorkbook.Sheets("Employees")
    Set shtOld = ActiveWorkbook.Sheets("Employees")

    Set rwNew = shtNew.Rows(2) 'first employee on "current" sheet

    Do While rwNew.Cells(ID_COL).Value <> ""

        Id = rwNew.Cells(ID_COL).Value
        Set f = shtOld.UsedRange.Columns(ID_COL).Find(Id, , xlValues, xlWhole)
        If Not f Is Nothing Then
            Set rwOld = f.EntireRow

            For x = 1 To NUM_COLS
                If rwNew.Cells(x).Value <> rwOld.Cells(x).Value Then
                    rwNew.Cells.Interior.Color = vbYellow
                Else
                    rwNew.Cells.Interior.ColorIndex = xlNone                    
                End If
            Next x

        Else
            rwNew.Cells(ID_COL).Interior.Color = vbGreen 'new employee
        End If

        Set rwNew = rwNew.Offset(1, 0) 'next row to compare
    Loop

End Sub

答案 1 :(得分:0)

不知道是否有任何事情可以帮助你。但是,您可以使用Dictionary Object使此比较任务更容易。您还可以从this answer that uses Dictionaries中选择检查唯一身份并根据速度进行优化的示例,将其更改为您需要的内容。然后你可以use this fast method为细胞着色或用它做任何你想做的事。

我知道我不是为你提供代码,但是这些指针会让你开始,如果你有更多问题,我可以帮助你。