2011-11-10 45 views
2

類似的問題,這些:Excel的VBA - 比較基礎斷值工作表行

Find the differences between 2 Excel worksheets?

Compare two excel sheets

我的問題而言,我有一個每月員工提供一個唯一的ID上市約30列的約900名員工的其他數據。

我試圖完成兩兩件事:

  1. 比較是否添加或列表之間下降了員工。
  2. 在每個員工的工作表之間比較該員工的其他數據更改的數據。即職位改變。

大多數比較加載項/模塊我發現只有比較特定範圍的順序,因此一旦一旦一個差異,如果找到每一個後續行將有所不同。

首先,我想知道是否有任何現有的工具可以做到這一點。如果沒有,我正在考慮建立自己的。我正在考慮通過循環遍歷每個員工並使用vlookup來驗證匹配。我擔心做這麼多循環會使宏難以使用。任何關於我應該如何去做的指導?謝謝。

+0

是否所有列都保證處於同一順序? –

+0

是的,列保持靜態。 – kwilmarth

回答

0

不知道是否有任何事情可以幫助您。但是,您可以使用Dictionary Object使此比較任務更容易。您還可以從this answer that uses Dictionaries中獲取示例,該示例檢查了唯一身份,並針對速度進行了優化,將其更改爲您所需的內容。然後,您可以use this fast method爲單元格或任何想要使用的單元格着色。

我知道我沒有爲你提供代碼,但這些指針會幫助你開始,如果你有更多的問題,我可以幫助你。

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