使用 Find 和 Offset 在两个选项卡中检查记录

Using Find and Offset to check records in two tabs

我正在尝试检查两个不同选项卡中的两组信息,然后将所有记录放入第三个选项卡,突出显示信息中的差异以及一组中存在但另一组中不存在的记录。作为一个额外的困难,我需要检查的信息在两个选项卡中的书写方式并不完全相同。例如:在其中一个选项卡中产品被称为 "Product 1, Product 2",等等,而另一个仅使用数字。

我是 VBA 的新手,到目前为止,我最好的想法是在其中一组中选择一个具有 ID 的列,然后使用“查找”检查另一组是否匹配。之后,我想在值 Find returns 上使用 Offset 来检查行中的其他单元格。

但是,我遇到了 'Object variable or With block variable not set' 错误,我不知道自己做错了什么。

下面是代码,我非常感谢在这种情况下使用 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

如果 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