用两列和多个参数比较两本主要练习册

时间:2016-08-02 19:44:54

标签: excel vba excel-vba

我正在编写一个代码来比较两个不同工作簿中的两行,这两个工作簿可以位于列中的不同位置。第一列通常在一个部分中分组(相同值的多个)。这就是为什么在此代码中我按第一列搜索,然后选择其他标识符列并一次偏移一个,而两个工作簿表彼此匹配

我正在尝试通过此代码中的.Find函数激活我找到的单元格,但显然你不能这样做。 “范围类的主动方法失败”

我相信我在使用此代码时走在正确的轨道上,但我确信仍有问题,我正试图用我有限的技能一次解决一个问题!

感谢您的帮助:)

Sub Compare2()
    Dim layer As String
    Dim Pno As String
    Dim firstAddress As String
    Dim i As Long
    Dim c As Range
    Option Explicit
        For i = 5 To 1000 Step 1
            layer = Sheets("MP Parameters").Range("A" & i).Value
            Pno = Sheets("MP Parameters").Range("H" & i).Value
            With Sheets("Compare").Range("a1:a1500")
                Set c = .Find(layer, LookIn:=xlValues)
                If Not c Is Nothing Then
                    firstAddress = c.Address
                    c.Activate
                    Do
                        Sheets("Compare").ActiveCell.Offset(rowOffset:=0, columnOffset:=7).Activate
                        If Sheets("Compare").ActiveCell = Pno Then
                            Sheets("Compare").ActiveCell.Offset(rowOffset:=0, columnOffset:=9).Activate
                            If Sheets("Compare").ActiveCell.Value <> Sheets("MP Parameters").Range("P" & i).Value Then
                                Sheets("MP Parameters").Range("P" & i).Interior.ColorIndex = 46
                            End If
                        End If
                        Set c = .FindNext(c)
                    Loop While Not c Is Nothing And c.Address <> firstAddress
                i = i + 1
                End If
            End With
        Next i
    End Sub

2 个答案:

答案 0 :(得分:2)

如果Activate上有一个小区,则您只能ActiveSheet。由于您的代码在不同的工作表上引用了Activates单元格,因此会导致错误。

您有两种选择。

首先激活合适的纸张:

Sheet1.Activate
Range("A2").Activate

或者,不要激活工作表进行条件检查。您不必激活单元格来确定它的价值。例如,如果要检查sheet1中的值,单元格B2(无论工作簿中哪个工作表处于活动状态):

If Sheet1.Range("B2").Value = "Yes" ...

答案 1 :(得分:1)

If Not c Is Nothing ... End If块中的代码可以更改为:

firstAddress = c.Address
Do
    If c.Offset(0, 7).Value = Pno Then
        If c.Offset(0, 16).Value <> Sheets("MP Parameters").Range("P" & i).Value Then
            Sheets("MP Parameters").Range("P" & i).Interior.ColorIndex = 46
        End If
    End If
    Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
i = i + 1

(我不确定i = i + 1的目的是什么。我总是发现手动修改循环计数器很危险。但我把它留在那里希望它正在做你想要它做什么。)