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