使用“查找”和“偏移”在两个选项卡中检查记录

时间:2018-08-25 15:52:41

标签: excel vba excel-vba find offset

我试图在两个不同的选项卡中检查两组信息,然后将所有记录放入第三个选项卡中,突出显示信息中的差异以及一组中存在的记录,但另一个中没有。另一个困难是,我需要检查的信息在两个选项卡中的编写方式并不完全相同。例如:在一个标签中,产品称为“产品1,产品2”,依此类推,而其他产品仅使用数字。

我对VBA还是很陌生,到目前为止,我最好的主意是选择其中一组ID为ID的列,然后使用“查找”检查另一组是否匹配。之后,我想对“查找”返回值使用“偏移”,以检查行中的其他单元格。

但是,遇到“对象变量或未设置块变量”错误,并且我不知道自己在做什么。

下面是代码,我非常感谢在这种情况下使用Offset的任何帮助(或以更有效的方式获得结果的想法)。

Sub Test()

Dim Candi_ID As String
Dim Full_Name As String
Dim i_Row As Object
Dim i_Cell As Range
Dim MD_Range As Integer
Dim i_Cell As Range

 Sheets("M Report").Select
 MD_Range = Application.WorksheetFunction.CountA(Range("C:C")) 'column with the IDs

For R = 2 To MD_Range
    Candi_ID = Sheets("M Report").Cells(R, 3)
    Full_Name = Sheets("M Report").Cells(R, 1)
    If Candi_ID <> "" Then
        With Sheets("i Report").Range("B:B")
        Set i_Cell = .Find(What:="*" & Candi_ID, LookIn:=xlValues)
        If i_Cell Is Nothing Then
                Sheets("Tracker").Range("A" & Last_Row + 1) = Candi_ID
                Sheets("Tracker").Range("A" & Last_Row + 1).Interior.Color = RGB(255, 0, 0)
            Else
                Last_Row = Sheets("Tracker").Cells(.Rows.Count, "A").End(xlUp).Row
                Sheets("Tracker").Range("A" & Last_Row + 1) = Candi_ID
            End If

            If Full_Name <> "" Then

                If Full_Name = i_Cell.Offset(0, -1) Then 'full name is one cell to the left of the ID cell
                    Sheets("Tracker").Range("C" & Last_Row + 1) = Full_Name
                Else
                    Sheets("Tracker").Range("C" & Last_Row + 1) = Full_Name
                    Sheets("Tracker").Range("C" & Last_Row + 1).Interior.Color = RGB(255, 0, 0)
                End If
           End If
         End With
       End If
 Last_Row = Last_Row + 1
 Next R
 End Sub

1 个答案:

答案 0 :(得分:1)

如果未在此行上设置i_Cell,则需要另一个测试:

Set i_Cell = .Find(What:="*" & Candi_ID, LookIn:=xlValues)

类似的东西:

If Full_Name <> vbNullString And Not i_Cell Is Nothing Then

如果它是Nothing,并且您没有进一步测试,您将得到您提到的错误。

此外,您有一个重复的声明,一些缺少的声明,并使用Long而不是Integer。将Option Explicit放在所有模块的顶部。避免使用.Select,这会降低代码速度,并尽可能使用With语句。

我将空文字字符串""替换为vbNullString