2014-12-01 121 views
2

我有兩個列表在Excel中進行比較。這是一個很長的列表,我需要一個excel函數或vba代碼來做到這一點。我已經江郎才盡,因此轉向你:VBA循環邏輯需要

**Old List**  
    A   Jersey City 
       London 
    B   Banglore    
       London 
       Stamford 
    C   Hong Kong 
       Hyderabad 
       Singapore 
**New List**  
    B  Banglore 
      London 
      Stamford 
    C  Hyderabad 
      Singapore 

名在列A和B柱位置

邏輯需要:

  • 比較位置爲每名
  • 如果新列表中的位置與舊列表不同,例如: 1)增加了新的地點2)地點的數量仍然相同,但是這些地點是新的地點。然後突出,或在下一列說:「新位置」 /什麼來識別,這是從舊名單的變化

感謝和問候 Varun的

+0

給我們一個你在excel文件和結構以及預期結果列中的真正截圖。這將有很大的幫助 – AHC 2014-12-01 16:19:30

+0

我正在嘗試,但說我需要10點聲望張貼圖像。任何其他方式發佈樣本列表 – 2014-12-01 16:20:56

+0

使用免費的圖像共享網站和編輯您的文章的鏈接。 – Chrismas007 2014-12-01 16:24:59

回答

0

此代碼假定您的舊列表和新列表是單獨的牀單。您將需要編輯代碼以反映實際的工作表名稱。如果找到所有重複的名稱,然後檢查城市是否已更改。如果城市發生了變化,它會在舊清單和新清單上突出顯示該城市。

編輯:沒有測試,但嘗試這樣的事情!查找名稱匹配,在兩張表上設置與該名稱關聯的給定範圍的位置,比較單元格並突出顯示在兩個範圍內都找不到的單元格。請記住,這隻適用於出現在兩張紙上的名稱。

編輯2:代碼更新 - 測試和工作。

Sub DupChange() 

Dim CurRow, LastRow, DestRow, DestLast, ChkRow, DestChk As Long 
Dim OldL, NewL As Worksheet 
Dim ChkRng, DestRng As Range 
Dim ChkCel, DestCel As Range 

Set OldL = Sheets("Old List") 
Set NewL = Sheets("New List") 

LastRow = OldL.Range("B" & Rows.Count).End(xlUp).Row 
DestLast = NewL.Range("B" & Rows.Count).End(xlUp).Row 

For CurRow = 2 To LastRow '(assuming you have a header in row 1) 
    If Not OldL.Cells(CurRow, 1).Value = "" Then 
     ChkRow = OldL.Cells(CurRow, 1).End(xlDown).Row - 1 
     If ChkRow > LastRow Then 
      ChkRow = LastRow 
     Else 
     End If 
     Set ChkRng = OldL.Range("A" & CurRow & ":A" & ChkRow).Offset(0, 1) 
     For DestRow = 2 To DestLast 
      If OldL.Cells(CurRow, 1).Value = NewL.Cells(DestRow, 1).Value Then 
       DestChk = NewL.Cells(DestRow, 1).End(xlDown).Row - 1 
       If DestChk > DestLast Then 
        DestChk = DestLast 
       Else 
       End If 
       Set DestRng = NewL.Range("A" & DestRow & ":A" & DestChk).Offset(0, 1) 
       For Each ChkCel In ChkRng 
        If DestRng.Find(ChkCel.Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then 
         ChkCel.Interior.Color = RGB(255, 0, 0) 
        Else 
        End If 
       Next 
       For Each DestCel In DestRng 
        If ChkRng.Find(DestCel.Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then 
         DestCel.Interior.Color = RGB(255, 0, 0) 
        Else 
        End If 
       Next 
      Else 
      End If 
     Next DestRow 
    Else 
    End If 
Next CurRow 

End Sub 
+0

我正在嘗試一些東西在同一行,但問題是,如果你看結構第一列是名稱和空單元格,因此會發生什麼情況是:案例a)舊列表:Christmas007有位置新澤西州和Banglore ,新名單:Varun Yadav有紐約和Banglore的地點。代碼匹配Banglore,這是錯誤的! – 2014-12-01 16:51:35

+0

你是說一個人可以有多個地點?你需要檢查這些位置變化是否有不同?這是相當具有挑戰性...... :( – Chrismas007 2014-12-01 16:54:06

+0

是的,這是正確的,相信我,如果這是這麼簡單,我不會困擾你們。一種方法可以工作將是第1複製空白單元格中的名稱,然後使用匹配或任何比較機制 – 2014-12-01 17:01:20

0

一個簡單的查找可以讓你解決這個問題。 如:

[C2] =OFFSET(Old_List!A:A;MATCH(B2;Old_List!B:B;0)-1;0;1;1) 

將填補與B2的位置對應的舊名C2。

[D2] =A2=C2 

將填補D2與True當老的名字是一樣的新,False否則和#N/A時的名字是新的和舊列表中沒有找到。

+0

一個位置,讓我們說紐約可以與許多經理我需要做的是使用經理作爲唯一的樞軸點和檢查相應的位置 – 2014-12-01 19:16:32

0

的基本架構我會去將如下所示:

構建Collection的名稱爲Key每個Item是與Key是位置文本位置的CollectionItem作爲Range(即單元格)包含位置文本。

Collection包裝在Class Module中,並添加一個屬性來設置列表範圍。 在範圍設置器中,調用例程來構建Collection

然後添加一個屬性以獲取特定名稱的位置Collection

然後,您可以創建Class的兩個實例,一個名爲oldList,另一個名爲newList,並創建一個非常簡單的循環來比較它們並管理位置單元格的格式。