#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.