Создание выходных данных таблицы для определенных идентификаторов строк, которые не совпадают в 3 электронных таблицах

#excel #vba #adodb

#excel #vba #adodb

Вопрос:

Я хочу создать скрипт VBA, который будет выводить электронную таблицу, заполненную строками, заполненными столбцами из всех 3 таблиц, где указанные идентификаторы строк из каждой таблицы электронных таблиц не совпадают друг с другом (все 3). Итак, если имя и фамилия были идентификаторами

  Table 1
 Name  | Surname | Age | Date     | Bank Account No.
 John  | Marley  | 23  | 21/07/19 | 25511581125
 Simon | Harvey  | 22  | 04/03/19 | 25513321125

 Table 2
 Name  | Surname | Age | Date     | Gender
 John  | Marley  | 23  | 21/07/19 | Male
 Simon | Harvey  | 22  | 04/03/19 | Male

 Table 3
 Name  | Surname | Age | Date     | Height
 John  | Marley  | 23  | 21/07/19 | 5ft
 Simon | John    | 18  | 21/07/19 | 2ft
  

  Output

 Name  | Surname | Age | Date     | Bank Account No.
 Simon | Harvey  | 22  | 04/03/19 | 25513321125


 Name  | Surname | Age | Date     | Gender
 Simon | Harvey  | 22  | 04/03/19 | Male


 Name  | Surname | Age | Date     | Height
 Simon | John    | 18  | 21/07/19 | 2ft
  

Итак, что я хочу, так это вывод каждой строки из каждой таблицы, где указанный идентификатор в строке НЕ найден во ВСЕХ 3 таблицах. Я надеюсь, что это имеет смысл. Указанный идентификатор должен присутствовать точно во всех 3 таблицах. Наличие выходных данных, которые будут содержать один столбец, точное название которого во всех 3 таблицах одинаковое, было бы идеальным, но не необходимым.

Причина, по которой я добавил ADODB в качестве тега, заключается в том, что я понимаю, что это будет более простым и эффективным решением?

Я понимаю, что, вероятно, было бы проще просто удалить те, которые соответствуют всем 3? Или выделите их или что-то еще.

Если у кого-нибудь есть какие-либо теории о том, как я должен это выполнить, я хотел бы это услышать. Спасибо!

Ответ №1:

Попробуйте:

 Option Explicit

Sub test()

    Dim rng1 As Range, rng2 As Range, rng3 As Range, cell1 As Range, cell2 As Range, cell3 As Range
    Dim ID As String
    Dim LastRowG As Long, Times As Long

    With ThisWorkbook.Worksheets("Sheet1")

            Set rng1 = .Range("F3:F5")
            Set rng2 = .Range("F9:F11")
            Set rng3 = .Range("F15:F17")

        Times = 0

        For Each cell1 In rng1

            ID = cell1.Value

            If Application.WorksheetFunction.CountIf(rng2, ID)   Application.WorksheetFunction.CountIf(rng3, ID) < 2 Then

                Times = Times   1

                LastRowG = .Cells(.Rows.Count, "H").End(xlUp).Row

                If Times = 1 Then
                    .Range("H" amp; LastRowG   1).Value = "Name"
                    .Range("I" amp; LastRowG   1).Value = "Surname"
                    .Range("J" amp; LastRowG   1).Value = "Age"
                    .Range("K" amp; LastRowG   1).Value = "Date"
                    .Range("L" amp; LastRowG   1).Value = "Bank Account No."
                    .Range("A" amp; cell1.Row amp; ":E" amp; cell1.Row).Copy .Range("H" amp; LastRowG   2)
                Else
                    .Range("A" amp; cell1.Row amp; ":E" amp; cell1.Row).Copy .Range("H" amp; LastRowG   1)
                End If

            End If

        Next cell1

        Times = 0

        For Each cell2 In rng2

            ID = cell2.Value

            If Application.WorksheetFunction.CountIf(rng1, ID)   Application.WorksheetFunction.CountIf(rng3, ID) < 2 Then

                Times = Times   1

                LastRowG = .Cells(.Rows.Count, "H").End(xlUp).Row

                If Times = 1 Then
                    .Range("H" amp; LastRowG   2).Value = "Name"
                    .Range("I" amp; LastRowG   2).Value = "Surname"
                    .Range("J" amp; LastRowG   2).Value = "Age"
                    .Range("K" amp; LastRowG   2).Value = "Date"
                    .Range("L" amp; LastRowG   2).Value = "Gender"
                    .Range("A" amp; cell2.Row amp; ":E" amp; cell2.Row).Copy .Range("H" amp; LastRowG   3)
                Else
                    .Range("A" amp; cell2.Row amp; ":E" amp; cell2.Row).Copy .Range("H" amp; LastRowG   1)
                End If

            End If

        Next cell2

        Times = 0

        For Each cell3 In rng3

            ID = cell3.Value

            If Application.WorksheetFunction.CountIf(rng2, ID)   Application.WorksheetFunction.CountIf(rng1, ID) < 2 Then

                Times = Times   1

                LastRowG = .Cells(.Rows.Count, "H").End(xlUp).Row

                If Times = 1 Then
                    .Range("H" amp; LastRowG   2).Value = "Name"
                    .Range("I" amp; LastRowG   2).Value = "Surname"
                    .Range("J" amp; LastRowG   2).Value = "Age"
                    .Range("K" amp; LastRowG   2).Value = "Date"
                    .Range("L" amp; LastRowG   2).Value = "Height"
                    .Range("A" amp; cell3.Row amp; ":E" amp; cell3.Row).Copy .Range("H" amp; LastRowG   3)
                Else
                    .Range("A" amp; cell3.Row amp; ":E" amp; cell3.Row).Copy .Range("H" amp; LastRowG   1)
                End If

            End If

        Next cell3

    End With

End Sub
  

Результаты:

введите описание изображения здесь

Комментарии:

1. Спасибо за ввод! Я нашел решение с использованием SQL-запроса для всех, кто интересуется будущим, просто нужно немного доработать, чтобы оно было полным для 3 таблиц и возвращало все 3 строки таблиц! «ВЫБЕРИТЕ *» _amp; » ИЗ [Sheet1 $] s1″ _ amp; » ТАМ, ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ s2.Name, s2.Фамилия » _ amp; » Из [Sheet2 $] s2″ _ amp; » ГДЕ s1.Name = s2.Name И s1.Фамилия = s2.Фамилия)

2. Поскольку я чувствую, что это все еще альтернативное решение моей проблемы, я собираюсь пометить его как corrrect.