Использование Find и Offset для проверки записей на двух вкладках - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь проверить два набора информации на двух разных вкладках, а затем перенести все записи на третью вкладку, выделяя несоответствия в информации, а также записи, которые присутствуют в наборе, но не во втором. Как дополнительная трудность, информация, которую мне нужно проверить, записана не одинаково на обеих вкладках. Например: на одной из вкладок продукты называются «Продукт 1, Продукт 2» и т. Д., Тогда как на другой используются только цифры.

Я довольно новичок в VBA, и моя лучшая идея на данный момент - выбрать столбец с идентификаторами в одном из наборов и использовать Find, чтобы проверить другой набор на совпадения. После этого я хотел бы использовать Offset для значения Find, чтобы проверить другие ячейки в строке.

Однако я сталкиваюсь с ошибкой 'Object variable или With block variable not set', и я не знаю, что я делаю неправильно.

Ниже приведен код, и я очень признателен за любую помощь в использовании смещения в этом сценарии (или за идеи по более эффективному способу получения результатов).

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 голосов
/ 25 августа 2018

Вам нужен еще один тест, если 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...