Создайте вывод таблицы для определенных идентификаторов строк, которые не совпадают в 3 таблицах - PullRequest
0 голосов
/ 28 марта 2019

Я хочу создать сценарий 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 таблицах.Вывод, который будет содержать один столбец, в котором точное имя всех трех таблиц будет одинаковым, будет идеальным, но не обязательным.

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

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

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

1 Ответ

1 голос
/ 28 марта 2019

Попробуйте:

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" & LastRowG + 1).Value = "Name"
                    .Range("I" & LastRowG + 1).Value = "Surname"
                    .Range("J" & LastRowG + 1).Value = "Age"
                    .Range("K" & LastRowG + 1).Value = "Date"
                    .Range("L" & LastRowG + 1).Value = "Bank Account No."
                    .Range("A" & cell1.Row & ":E" & cell1.Row).Copy .Range("H" & LastRowG + 2)
                Else
                    .Range("A" & cell1.Row & ":E" & cell1.Row).Copy .Range("H" & 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" & LastRowG + 2).Value = "Name"
                    .Range("I" & LastRowG + 2).Value = "Surname"
                    .Range("J" & LastRowG + 2).Value = "Age"
                    .Range("K" & LastRowG + 2).Value = "Date"
                    .Range("L" & LastRowG + 2).Value = "Gender"
                    .Range("A" & cell2.Row & ":E" & cell2.Row).Copy .Range("H" & LastRowG + 3)
                Else
                    .Range("A" & cell2.Row & ":E" & cell2.Row).Copy .Range("H" & 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" & LastRowG + 2).Value = "Name"
                    .Range("I" & LastRowG + 2).Value = "Surname"
                    .Range("J" & LastRowG + 2).Value = "Age"
                    .Range("K" & LastRowG + 2).Value = "Date"
                    .Range("L" & LastRowG + 2).Value = "Height"
                    .Range("A" & cell3.Row & ":E" & cell3.Row).Copy .Range("H" & LastRowG + 3)
                Else
                    .Range("A" & cell3.Row & ":E" & cell3.Row).Copy .Range("H" & LastRowG + 1)
                End If

            End If

        Next cell3

    End With

End Sub

Результаты:

enter image description here

...