Добрый день! Нужна помощь в следующем вопросе. Есть две таблицы П и Д со столбцами Имя клиента и Адрес. Необходимо сравнить эти две таблицы, то есть найти тех клиентов которые есть в таблице П, но нет в таблице Д. Как результат после сравнения создать две новые таблицы. В первую таблицу перенести различия (имя клиента и адрес), а во вторую совпадения (имя клиента и его адрес). В прикрепленном файле образец таблиц П и Д, в реале записей более 4000. Заранее благодарна за помощь!
Добрый день! Нужна помощь в следующем вопросе. Есть две таблицы П и Д со столбцами Имя клиента и Адрес. Необходимо сравнить эти две таблицы, то есть найти тех клиентов которые есть в таблице П, но нет в таблице Д. Как результат после сравнения создать две новые таблицы. В первую таблицу перенести различия (имя клиента и адрес), а во вторую совпадения (имя клиента и его адрес). В прикрепленном файле образец таблиц П и Д, в реале записей более 4000. Заранее благодарна за помощь!AnnaKudrina
AnnaKudrina, Странный у Вас пример. Если имена то совпадают... адреса совсем не совпадают... пример правильный? Я правильно понимаю, что имена то могут совпадать, а вот одинаковое ФИО на одном и том же адресе не повторяется? У Вас по таблице: "П" 1-я позиция Абаканова Сатвальда Желгедовна адрес: 627554, Тюменская область, Абатский район п. Лесной ул. Южная, д. 054 По таблице :"Д" 1-я позиция "Абаканова Сатвальда Желгедовна" адрес: 627554, Тюменская область, Абатский район П Лесной Ул Ленина, д. 25 . В итоге... совпадение должно быть именно только по именам? или по имя- адрес. Ведь на двух разных адресах, теоретически могут быть одинаковые имена... итог - нужно считать скок этих имён в 1 таблице и скок во второй... а какого именно из "одинаковых имён" нет в какой-то из таблиц, выяснить не получится.
AnnaKudrina, Странный у Вас пример. Если имена то совпадают... адреса совсем не совпадают... пример правильный? Я правильно понимаю, что имена то могут совпадать, а вот одинаковое ФИО на одном и том же адресе не повторяется? У Вас по таблице: "П" 1-я позиция Абаканова Сатвальда Желгедовна адрес: 627554, Тюменская область, Абатский район п. Лесной ул. Южная, д. 054 По таблице :"Д" 1-я позиция "Абаканова Сатвальда Желгедовна" адрес: 627554, Тюменская область, Абатский район П Лесной Ул Ленина, д. 25 . В итоге... совпадение должно быть именно только по именам? или по имя- адрес. Ведь на двух разных адресах, теоретически могут быть одинаковые имена... итог - нужно считать скок этих имён в 1 таблице и скок во второй... а какого именно из "одинаковых имён" нет в какой-то из таблиц, выяснить не получится.Roman777
Roman777, здравствуйте. Совпадения должно быть именно по именам и адресам. В итоге надо выбрать не повторяющихся клиентов с их адресами(по именам и адресам) из двух таблиц.
Roman777, здравствуйте. Совпадения должно быть именно по именам и адресам. В итоге надо выбрать не повторяющихся клиентов с их адресами(по именам и адресам) из двух таблиц.AnnaKudrina
Сообщение отредактировал AnnaKudrina - Среда, 09.12.2015, 12:37
У Вас по таблице: "П" 1-я позиция Абаканова Сатвальда Желгедовна адрес: 627554, Тюменская область, Абатский район п. Лесной ул. Южная, д. 054 По таблице :"Д" 1-я позиция "Абаканова Сатвальда Желгедовна" адрес: 627554, Тюменская область, Абатский район П Лесной Ул Ленина, д. 25 .
У Вас по таблице: "П" 1-я позиция Абаканова Сатвальда Желгедовна адрес: 627554, Тюменская область, Абатский район п. Лесной ул. Южная, д. 054 По таблице :"Д" 1-я позиция "Абаканова Сатвальда Желгедовна" адрес: 627554, Тюменская область, Абатский район П Лесной Ул Ленина, д. 25 .
Sub Sravn() Dim i As Long, i_n1 As Long, i_n2 As Long Dim Tabl1() As String, Tabl2() As String, Sovp() As String, NeSovp() As String, k1 As Long, k2 As Long Dim Obj1 As Object, Obj2 As Object, Key1 As String, Key2 As String, Obj3 As Object Dim WS As Worksheet Set Obj1 = CreateObject("Scripting.dictionary") Set Obj2 = CreateObject("Scripting.dictionary") Set Obj3 = CreateObject("Scripting.dictionary") i_n1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl1(2, i_n1) For i = 1 To i_n1 Tabl1(1, i) = Trim(Worksheets(1).Cells(i, 1)) Tabl1(2, i) = Trim(Worksheets(1).Cells(i, 2)) Next i i_n2 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl2(2, i_n2) For i = 1 To i_n2 Tabl2(1, i) = Trim(Worksheets(2).Cells(i, 2)) Tabl2(2, i) = Trim(Worksheets(2).Cells(i, 3)) Next i For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Not Obj1.exists(Key1) Then Obj1.Add Key1, Tabl1(2, i) End If Next i For i = 2 To i_n2 Key2 = Tabl2(1, i) & Tabl2(2, i) If Not Obj2.exists(Key1) Then Obj2.Add Key2, Tabl2(2, i) End If Next i ReDim Sovp(2, 1) ReDim NeSovp(2, 1) Sovp(1, 1) = Tabl1(1, 1) Sovp(2, 1) = Tabl1(2, 1) NeSovp(1, 1) = Tabl1(1, 1) NeSovp(2, 1) = Tabl1(2, 1) k1 = 1 k2 = 1 For i = 2 To i_n1 Key2 = Tabl1(1, i) & Tabl1(2, i) If Not Obj2.exists(Key2) Then k1 = k1 + 1 ReDim Preserve NeSovp(2, UBound(NeSovp, 2) + 1) NeSovp(1, k1) = Tabl1(1, i) NeSovp(2, k1) = Tabl1(2, i) Else If Not Obj3.exists(Key2) Then Obj3.Add Key2, Tabl1(2, i) k2 = k2 + 1 ReDim Preserve Sovp(2, UBound(Sovp, 2) + 1) Sovp(1, k2) = Tabl1(1, i) Sovp(2, k2) = Tabl1(2, i) End If End If Next i For i = 2 To i_n2 Key1 = Tabl2(1, i) & Tabl2(2, i) If Not Obj1.exists(Key1) Then k1 = k1 + 1 ReDim Preserve NeSovp(2, UBound(NeSovp, 2) + 1) NeSovp(1, k1) = Tabl2(1, i) NeSovp(2, k1) = Tabl2(2, i) Else If Not Obj3.exists(Key1) Then Obj3.Add Key1, Tabl2(2, i) k2 = k2 + 1 ReDim Preserve Sovp(2, UBound(Sovp, 2) + 1) Sovp(1, k2) = Tabl2(1, i) Sovp(2, k2) = Tabl2(2, i) End If End If Next i On Error Resume Next Set WS = Sheets("Совпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Совпали" Else WS.Cells.Clear End If Set WS = Nothing On Error Resume Next Set WS = Sheets("Несовпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Несовпали" Else WS.Cells.Clear End If For i = 1 To UBound(Sovp, 2) Worksheets("Совпали").Cells(i, 1) = Sovp(1, i) Worksheets("Совпали").Cells(i, 2) = Sovp(2, i) Next i For i = 1 To UBound(NeSovp, 2) Worksheets("Несовпали").Cells(i, 1) = NeSovp(1, i) Worksheets("Несовпали").Cells(i, 2) = NeSovp(2, i) Next i Worksheets(1).Range("A2:B2").Copy With Worksheets("Совпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With With Worksheets("Несовпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With End Sub
[/vba]
AnnaKudrina, Муторно как-то, но вроде работает...
[vba]
Код
Sub Sravn() Dim i As Long, i_n1 As Long, i_n2 As Long Dim Tabl1() As String, Tabl2() As String, Sovp() As String, NeSovp() As String, k1 As Long, k2 As Long Dim Obj1 As Object, Obj2 As Object, Key1 As String, Key2 As String, Obj3 As Object Dim WS As Worksheet Set Obj1 = CreateObject("Scripting.dictionary") Set Obj2 = CreateObject("Scripting.dictionary") Set Obj3 = CreateObject("Scripting.dictionary") i_n1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl1(2, i_n1) For i = 1 To i_n1 Tabl1(1, i) = Trim(Worksheets(1).Cells(i, 1)) Tabl1(2, i) = Trim(Worksheets(1).Cells(i, 2)) Next i i_n2 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl2(2, i_n2) For i = 1 To i_n2 Tabl2(1, i) = Trim(Worksheets(2).Cells(i, 2)) Tabl2(2, i) = Trim(Worksheets(2).Cells(i, 3)) Next i For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Not Obj1.exists(Key1) Then Obj1.Add Key1, Tabl1(2, i) End If Next i For i = 2 To i_n2 Key2 = Tabl2(1, i) & Tabl2(2, i) If Not Obj2.exists(Key1) Then Obj2.Add Key2, Tabl2(2, i) End If Next i ReDim Sovp(2, 1) ReDim NeSovp(2, 1) Sovp(1, 1) = Tabl1(1, 1) Sovp(2, 1) = Tabl1(2, 1) NeSovp(1, 1) = Tabl1(1, 1) NeSovp(2, 1) = Tabl1(2, 1) k1 = 1 k2 = 1 For i = 2 To i_n1 Key2 = Tabl1(1, i) & Tabl1(2, i) If Not Obj2.exists(Key2) Then k1 = k1 + 1 ReDim Preserve NeSovp(2, UBound(NeSovp, 2) + 1) NeSovp(1, k1) = Tabl1(1, i) NeSovp(2, k1) = Tabl1(2, i) Else If Not Obj3.exists(Key2) Then Obj3.Add Key2, Tabl1(2, i) k2 = k2 + 1 ReDim Preserve Sovp(2, UBound(Sovp, 2) + 1) Sovp(1, k2) = Tabl1(1, i) Sovp(2, k2) = Tabl1(2, i) End If End If Next i For i = 2 To i_n2 Key1 = Tabl2(1, i) & Tabl2(2, i) If Not Obj1.exists(Key1) Then k1 = k1 + 1 ReDim Preserve NeSovp(2, UBound(NeSovp, 2) + 1) NeSovp(1, k1) = Tabl2(1, i) NeSovp(2, k1) = Tabl2(2, i) Else If Not Obj3.exists(Key1) Then Obj3.Add Key1, Tabl2(2, i) k2 = k2 + 1 ReDim Preserve Sovp(2, UBound(Sovp, 2) + 1) Sovp(1, k2) = Tabl2(1, i) Sovp(2, k2) = Tabl2(2, i) End If End If Next i On Error Resume Next Set WS = Sheets("Совпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Совпали" Else WS.Cells.Clear End If Set WS = Nothing On Error Resume Next Set WS = Sheets("Несовпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Несовпали" Else WS.Cells.Clear End If For i = 1 To UBound(Sovp, 2) Worksheets("Совпали").Cells(i, 1) = Sovp(1, i) Worksheets("Совпали").Cells(i, 2) = Sovp(2, i) Next i For i = 1 To UBound(NeSovp, 2) Worksheets("Несовпали").Cells(i, 1) = NeSovp(1, i) Worksheets("Несовпали").Cells(i, 2) = NeSovp(2, i) Next i Worksheets(1).Range("A2:B2").Copy With Worksheets("Совпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With With Worksheets("Несовпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With End Sub
AnnaKudrina, Что именно Вы хотите добавить, покажите пример. Так просто, думаю, не добавить. Скорее всего придётся массивы увеличивать по одному измерению на 1 или более элементов.
AnnaKudrina, Что именно Вы хотите добавить, покажите пример. Так просто, думаю, не добавить. Скорее всего придётся массивы увеличивать по одному измерению на 1 или более элементов.Roman777
Gustav, А если упростить задачу. Будет одна таблица (Имя клиента, СНИЛС ,Адрес доставки), и сравнивать необходимо по Имени клиента и СНИЛС. Как результат после сравнения создать две новые таблицы. В первую таблицу перенести различия (имя клиента, СНИЛС, Адрес доставки), а во вторую совпадения (имя клиента, СНИЛС, Адрес доставки). В прикрепленном файле образец таблиц П, в реале записей более 4000. Заранее благодарна за помощь!
Gustav, А если упростить задачу. Будет одна таблица (Имя клиента, СНИЛС ,Адрес доставки), и сравнивать необходимо по Имени клиента и СНИЛС. Как результат после сравнения создать две новые таблицы. В первую таблицу перенести различия (имя клиента, СНИЛС, Адрес доставки), а во вторую совпадения (имя клиента, СНИЛС, Адрес доставки). В прикрепленном файле образец таблиц П, в реале записей более 4000. Заранее благодарна за помощь!AnnaKudrina
Ну, я тоже немного поразглагольствую по делу. Итак...
Если для заданного Имени клиента и СНИЛС найдётся только одна запись. Она куда должна пойти? В "Совпадения" или "Различия"?
С двумя записями, наверное, интуитивно понятно - или в "Совпадения", или в "Различия" - в зависимости от содержания поля Адрес доставки (это я чисто логически фантазирую, может, оно и не так вовсе).
Если для заданного Имени клиента и СНИЛС найдутся, например, три записи, две из которых совпадут, а третья нет. Куда направлять две и куда одну?
И мне представляется, что при одной таблице тут и макросы-то не особо нужны. Можно отсортировать ее по всем трем полям по возрастанию и потом формулками проверить совпадения полей в соседних записях. Дело за малым - ясно представлять, что именно проверять
Ну, я тоже немного поразглагольствую по делу. Итак...
Если для заданного Имени клиента и СНИЛС найдётся только одна запись. Она куда должна пойти? В "Совпадения" или "Различия"?
С двумя записями, наверное, интуитивно понятно - или в "Совпадения", или в "Различия" - в зависимости от содержания поля Адрес доставки (это я чисто логически фантазирую, может, оно и не так вовсе).
Если для заданного Имени клиента и СНИЛС найдутся, например, три записи, две из которых совпадут, а третья нет. Куда направлять две и куда одну?
И мне представляется, что при одной таблице тут и макросы-то не особо нужны. Можно отсортировать ее по всем трем полям по возрастанию и потом формулками проверить совпадения полей в соседних записях. Дело за малым - ясно представлять, что именно проверять Gustav
Gustav, объясню на примере вложенного файла. Есть клиенты Абаканова Сатвальда Желгедовна 095-922-391 34, Абраменко Валентина Даниловна 101-000-928 41, Абрамова Зоя Иосифовна 078-406-246 00, Абрашкова Тамара Николаевна 101-560-106 75 они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий (со столбцами имя клиента, снилс и адрес доставки). То есть совпадения должны быть имя и по имени клиента и по снилс. Мне кажется, что лучше написать макрос, потому таких таблиц много, и в некоторых записей больше 10000.
Gustav, объясню на примере вложенного файла. Есть клиенты Абаканова Сатвальда Желгедовна 095-922-391 34, Абраменко Валентина Даниловна 101-000-928 41, Абрамова Зоя Иосифовна 078-406-246 00, Абрашкова Тамара Николаевна 101-560-106 75 они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий (со столбцами имя клиента, снилс и адрес доставки). То есть совпадения должны быть имя и по имени клиента и по снилс. Мне кажется, что лучше написать макрос, потому таких таблиц много, и в некоторых записей больше 10000.AnnaKudrina
Roman777, объясню на примере вложенного файла. Есть клиенты Абаканова Сатвальда Желгедовна 095-922-391 34, Абраменко Валентина Даниловна 101-000-928 41, Абрамова Зоя Иосифовна 078-406-246 00, Абрашкова Тамара Николаевна 101-560-106 75 они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий (со столбцами имя клиента, снилс и адрес доставки)
Roman777, объясню на примере вложенного файла. Есть клиенты Абаканова Сатвальда Желгедовна 095-922-391 34, Абраменко Валентина Даниловна 101-000-928 41, Абрамова Зоя Иосифовна 078-406-246 00, Абрашкова Тамара Николаевна 101-560-106 75 они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий (со столбцами имя клиента, снилс и адрес доставки)AnnaKudrina
они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий
Что ж, SQL рулит дальше! Запрос получился не очень простой и, что греха таить, конструировал я его не без помощи мастера запросов MS Access. Но менее эффектным он от этого не стал!
[vba]
Код
Sub selectData2()
Dim cnn As Object Dim rst As Object Dim sql As String
Set cnn = CreateObject("ADODB.Connection") Set rst = CreateObject("ADODB.Recordset")
они в таблице повторяются (то есть и по имени, и по снилс), вот их надо перенести в таблицу совпадений (со столбцами имя клиента, снилс и адрес доставки), а остальных в таблицу различий
Что ж, SQL рулит дальше! Запрос получился не очень простой и, что греха таить, конструировал я его не без помощи мастера запросов MS Access. Но менее эффектным он от этого не стал!
[vba]
Код
Sub selectData2()
Dim cnn As Object Dim rst As Object Dim sql As String
Set cnn = CreateObject("ADODB.Connection") Set rst = CreateObject("ADODB.Recordset")
У меня всё так же по-старому через словари и массивы:
[vba]
Код
Sub Sravn2() Dim i As Long, i_n1 As Long Dim Tabl1() As String, Tabl2() As String, Sovp() As String, NeSovp() As String, k1 As Long, kol As Long Dim Obj1 As Object, Key1 As String Dim WS As Worksheet Set Obj1 = CreateObject("Scripting.dictionary") i_n1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl1(3, i_n1) For i = 1 To i_n1 Tabl1(1, i) = Trim(Worksheets(1).Cells(i, 1)) Tabl1(2, i) = Trim(Worksheets(1).Cells(i, 2)) Tabl1(3, i) = Trim(Worksheets(1).Cells(i, 3)) Next i ReDim Sovp(3, 1) ReDim NeSovp(3, 1) Sovp(1, 1) = Tabl1(1, 1) Sovp(2, 1) = Tabl1(2, 1) Sovp(3, 1) = Tabl1(3, 1) NeSovp(1, 1) = Tabl1(1, 1) NeSovp(2, 1) = Tabl1(2, 1) NeSovp(3, 1) = Tabl1(3, 1) ReDim Tabl2(5, 1) For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Not Obj1.exists(Key1) Then k1 = k1 + 1 Obj1.Add Key1, CStr(k1) ReDim Preserve Tabl2(5, k1) Tabl2(1, k1) = Tabl1(1, i) Tabl2(2, k1) = Tabl1(2, i) Tabl2(3, k1) = Tabl1(3, i) Tabl2(4, k1) = 0 End If Next i k1 = 1 k2 = 1 For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Obj1.exists(Key1) Then Tabl2(4, Obj1(Key1)) = Tabl2(4, Obj1(Key1)) + 1 End If Next i For i = 1 To UBound(Tabl2, 2) If Tabl2(4, i) > 1 Then k2 = k2 + 1 ReDim Preserve Sovp(3, k2) Sovp(1, k2) = Tabl2(1, i) Sovp(2, k2) = Tabl2(2, i) Sovp(3, k2) = Tabl2(3, i) Else k1 = k1 + 1 ReDim Preserve NeSovp(3, k1) NeSovp(1, k1) = Tabl2(1, i) NeSovp(2, k1) = Tabl2(2, i) NeSovp(3, k1) = Tabl2(3, i) End If Next i On Error Resume Next Set WS = Sheets("Совпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Совпали" Sheets(1).Rows(1).Copy Sheets("Совпали").Cells(1, 1) Else WS.Cells.Clear Sheets(1).Rows(1).Copy Sheets("Совпали").Cells(1, 1) End If Set WS = Nothing On Error Resume Next Set WS = Sheets("Несовпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Несовпали" Sheets(1).Rows(1).Copy Sheets("Несовпали").Cells(1, 1) Else WS.Cells.Clear Sheets(1).Rows(1).Copy Sheets("Несовпали").Cells(1, 1) End If For i = 1 To UBound(Sovp, 2) Worksheets("Совпали").Cells(i, 1) = Sovp(1, i) Worksheets("Совпали").Cells(i, 2) = Sovp(2, i) Worksheets("Совпали").Cells(i, 3) = Sovp(3, i) Next i For i = 1 To UBound(NeSovp, 2) Worksheets("Несовпали").Cells(i, 1) = NeSovp(1, i) Worksheets("Несовпали").Cells(i, 2) = NeSovp(2, i) Worksheets("Несовпали").Cells(i, 3) = NeSovp(3, i) Next i Worksheets(1).Range("A2:C2").Copy With Worksheets("Совпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With With Worksheets("Несовпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With End Sub
[/vba]
Но то как это выглядит у Gustav мне нравится больше, хотя, пока что моё более понятно для меня).
У меня всё так же по-старому через словари и массивы:
[vba]
Код
Sub Sravn2() Dim i As Long, i_n1 As Long Dim Tabl1() As String, Tabl2() As String, Sovp() As String, NeSovp() As String, k1 As Long, kol As Long Dim Obj1 As Object, Key1 As String Dim WS As Worksheet Set Obj1 = CreateObject("Scripting.dictionary") i_n1 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row ReDim Tabl1(3, i_n1) For i = 1 To i_n1 Tabl1(1, i) = Trim(Worksheets(1).Cells(i, 1)) Tabl1(2, i) = Trim(Worksheets(1).Cells(i, 2)) Tabl1(3, i) = Trim(Worksheets(1).Cells(i, 3)) Next i ReDim Sovp(3, 1) ReDim NeSovp(3, 1) Sovp(1, 1) = Tabl1(1, 1) Sovp(2, 1) = Tabl1(2, 1) Sovp(3, 1) = Tabl1(3, 1) NeSovp(1, 1) = Tabl1(1, 1) NeSovp(2, 1) = Tabl1(2, 1) NeSovp(3, 1) = Tabl1(3, 1) ReDim Tabl2(5, 1) For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Not Obj1.exists(Key1) Then k1 = k1 + 1 Obj1.Add Key1, CStr(k1) ReDim Preserve Tabl2(5, k1) Tabl2(1, k1) = Tabl1(1, i) Tabl2(2, k1) = Tabl1(2, i) Tabl2(3, k1) = Tabl1(3, i) Tabl2(4, k1) = 0 End If Next i k1 = 1 k2 = 1 For i = 2 To i_n1 Key1 = Tabl1(1, i) & Tabl1(2, i) If Obj1.exists(Key1) Then Tabl2(4, Obj1(Key1)) = Tabl2(4, Obj1(Key1)) + 1 End If Next i For i = 1 To UBound(Tabl2, 2) If Tabl2(4, i) > 1 Then k2 = k2 + 1 ReDim Preserve Sovp(3, k2) Sovp(1, k2) = Tabl2(1, i) Sovp(2, k2) = Tabl2(2, i) Sovp(3, k2) = Tabl2(3, i) Else k1 = k1 + 1 ReDim Preserve NeSovp(3, k1) NeSovp(1, k1) = Tabl2(1, i) NeSovp(2, k1) = Tabl2(2, i) NeSovp(3, k1) = Tabl2(3, i) End If Next i On Error Resume Next Set WS = Sheets("Совпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Совпали" Sheets(1).Rows(1).Copy Sheets("Совпали").Cells(1, 1) Else WS.Cells.Clear Sheets(1).Rows(1).Copy Sheets("Совпали").Cells(1, 1) End If Set WS = Nothing On Error Resume Next Set WS = Sheets("Несовпали") If WS Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Несовпали" Sheets(1).Rows(1).Copy Sheets("Несовпали").Cells(1, 1) Else WS.Cells.Clear Sheets(1).Rows(1).Copy Sheets("Несовпали").Cells(1, 1) End If For i = 1 To UBound(Sovp, 2) Worksheets("Совпали").Cells(i, 1) = Sovp(1, i) Worksheets("Совпали").Cells(i, 2) = Sovp(2, i) Worksheets("Совпали").Cells(i, 3) = Sovp(3, i) Next i For i = 1 To UBound(NeSovp, 2) Worksheets("Несовпали").Cells(i, 1) = NeSovp(1, i) Worksheets("Несовпали").Cells(i, 2) = NeSovp(2, i) Worksheets("Несовпали").Cells(i, 3) = NeSovp(3, i) Next i Worksheets(1).Range("A2:C2").Copy With Worksheets("Совпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With With Worksheets("Несовпали").UsedRange .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteColumnWidths .Rows.AutoFit .Range(Cells(1, 1)).CurrentRegion.Sort Key1:=.Cells(1), Order1:=xlAscending, Orientation:=xlLeftToRight End With End Sub
[/vba]
Но то как это выглядит у Gustav мне нравится больше, хотя, пока что моё более понятно для меня).Roman777
Gustav, Roman777, спасибо большое все работает. А есть ли возможность переноса заливки вместе с данными в таблицы Различия и Совпадения. То есть некоторые строки будут иметь заливку фона, и чтобы эта заливка также переносилась вместе с данными в таблицы различий и совпадений?
Gustav, Roman777, спасибо большое все работает. А есть ли возможность переноса заливки вместе с данными в таблицы Различия и Совпадения. То есть некоторые строки будут иметь заливку фона, и чтобы эта заливка также переносилась вместе с данными в таблицы различий и совпадений?AnnaKudrina
Сообщение отредактировал AnnaKudrina - Понедельник, 14.12.2015, 08:09
Roman777, подскажите тоже проблема со сравнение столбцов, нужно сравнение по ФИО и диапазону дат, и вывести совпадения в отдельный лист и желательно с номером с другого столбца
Roman777, подскажите тоже проблема со сравнение столбцов, нужно сравнение по ФИО и диапазону дат, и вывести совпадения в отдельный лист и желательно с номером с другого столбцаpaintkiller555