需要VBA循环逻辑

时间:2014-12-01 16:12:42

标签: excel vba excel-vba excel-formula

我在Excel中有两个要比较的列表。这是一个非常长的列表,我需要一个excel函数或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

3 个答案:

答案 0 :(得分:0)

此代码假定您的旧列表和新列表位于单独的表格中。您需要编辑代码以反映实际的工作表名称。如果找到所有重复的名称,然后检查城市是否已更改。如果城市已更改,则会在旧列表和新列表中突出显示该城市。

编辑:Haven未经过测试,但尝试这样的事情!查找名称匹配项,在两个工作表上设置与该名称关联的给定位置范围,比较单元格并突出显示在两个范围中均未找到的任何单元格。请注意,这仅适用于两张纸上显示的名称。

编辑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

答案 1 :(得分:0)

简单的查找将允许您解决此问题。 例如:

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

将使用相应的旧名称填写C2以获取B2中的位置。

[D2] =A2=C2
当旧名称与新名称相同时,

将使用True填充D2;如果名称为新名称,则False将填充#N/A,并且在旧列表中找不到。

答案 2 :(得分:0)

我将使用的基本架构如下:

构建Collection,其名称为Key,每个ItemCollection个位置,其中Key为位置文本,Item 1}}是包含位置文本的Range(即单元格)。

Collection换行Class Module并添加属性以设置列表范围。 在Range setter中,调用例程来构建Collection

然后添加一个属性以获取特定名称的位置Collection

然后,您可以创建Class的两个实例,一个名为oldList,一个名为newList,并创建一个非常简单的循环来比较它们并管理位置单元格的格式。