Здравствуйте! Есть столбцы A:G, объединить столбцы B&C&E&F&G, повторяющих и одинарных надо удалить, если столбцы B&C&G совпадают, но не совпадают столбцы E или F тогда оставляем. Но у меня не так получается (извлекает уникальных)
Здравствуйте! Есть столбцы A:G, объединить столбцы B&C&E&F&G, повторяющих и одинарных надо удалить, если столбцы B&C&G совпадают, но не совпадают столбцы E или F тогда оставляем. Но у меня не так получается (извлекает уникальных)ABC
Я вот не понял - почему Попов 3 раза? Не согласуется с условиями... Потому и не делал ничего пока - хотя думаю на словаре можно сделать. Вообще условия мне не до конца ясны - я понял задачу так: вытянуть тех уникальных по ФИО/ДР, кто повторяется с разными данными. Единичные не нужны, повторы повторов тоже не нужны. Но Попов рушит всю картину
Я вот не понял - почему Попов 3 раза? Не согласуется с условиями... Потому и не делал ничего пока - хотя думаю на словаре можно сделать. Вообще условия мне не до конца ясны - я понял задачу так: вытянуть тех уникальных по ФИО/ДР, кто повторяется с разными данными. Единичные не нужны, повторы повторов тоже не нужны. Но Попов рушит всю картину Hugo
Игорь, хотел из первой таблицы не совпавших всех вытащить, ну что бы знать где именно ошибка (11 или 12 ошибочно ввели) ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 12 4
вообще та можно оставив по одному ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 12 4
Игорь, хотел из первой таблицы не совпавших всех вытащить, ну что бы знать где именно ошибка (11 или 12 ошибочно ввели) ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 12 4
вообще та можно оставив по одному ПОПОВ 01.01.1970 УЛ КИХТЕНКО 11 4 ПОПОВ 01.01.1970 УЛ КИХТЕНКО 12 4ABC
MS Excel 2007 and 2010... ------------------------------- С Уважением, Даулет
Как я понял, исходная постановка Даулета, уже выраженная через строгость SQL, проговаривается так:
1. Сначала получить все уникальные комбинации по ключу "ФИО - Д/Р - кв" с числом повторений более 1. 2. Потом из исходной таблицы достать все записи соответствующие этим отобранным уникальным комбинациям.
Как я понял, исходная постановка Даулета, уже выраженная через строгость SQL, проговаривается так:
1. Сначала получить все уникальные комбинации по ключу "ФИО - Д/Р - кв" с числом повторений более 1. 2. Потом из исходной таблицы достать все записи соответствующие этим отобранным уникальным комбинациям.Gustav
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены. Но Попов спутал логику. Позже (или вечером) подумаю, как это на словаре сделать, без лишних "поповов" - с ними вариант на коллекции уже есть Думаю где-то так - записываем в словарь ФИО/ДАТА и ему в Item номер первой встреченной строки и другой словарь адресов (массив) Как только есть нужда проверить новый адрес по тому словарю (т.е. он уже создан) и там такого адреса ещё нет - отбираем первую и эту строку. Всё можно сделать за один проход по массиву данных.
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены. Но Попов спутал логику. Позже (или вечером) подумаю, как это на словаре сделать, без лишних "поповов" - с ними вариант на коллекции уже есть Думаю где-то так - записываем в словарь ФИО/ДАТА и ему в Item номер первой встреченной строки и другой словарь адресов (массив) Как только есть нужда проверить новый адрес по тому словарю (т.е. он уже создан) и там такого адреса ещё нет - отбираем первую и эту строку. Всё можно сделать за один проход по массиву данных.Hugo
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.
именно так Игорь, столбцы B C D G это уже готовая база, столбец - E и F вводят специалисты, на выявить ошибку. У Сани работает правильно, но больших примерах очень долго работает.
Quote (Hugo)
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.
именно так Игорь, столбцы B C D G это уже готовая база, столбец - E и F вводят специалисты, на выявить ошибку. У Сани работает правильно, но больших примерах очень долго работает.ABC
MS Excel 2007 and 2010... ------------------------------- С Уважением, Даулет
Позже попробую сделать на словаре в словаре Сейчас работы навалило Мне тоже проще макрос - тут хоть можно как хош повернуть, а SQL на мой взгляд как формулы..
Позже попробую сделать на словаре в словаре Сейчас работы навалило Мне тоже проще макрос - тут хоть можно как хош повернуть, а SQL на мой взгляд как формулы..Hugo
Ну вот так получилось без повторов за один проход под кнопку файла ABC. Чтоб меньше писать кода - вытягиваю все столбцы И номера в первом столбце оригинальные - так и искать проще будет Есть немножко недоработка - изначально лишнюю рамку не стирает.
[vba]
Code
Option Base 0
Sub test() Dim arr(), a, i&, ii&, it, ul, t&, x As Byte Dim tm!: tm = Timer Application.ScreenUpdating = False arr = Range([G2], Cells(Rows.Count, 1).End(xlUp)).Value ReDim out(1 To UBound(arr), 1 To 7)
With CreateObject("Scripting.Dictionary") For i = 1 To UBound(arr, 1) it = arr(i, 2) & "|" & arr(i, 3) ul = arr(i, 5) & "|" & arr(i, 6) & "|" & arr(i, 7) If Not .exists(it) Then a = Array(i, CreateObject("scripting.dictionary")) a(0) = i a(1).Item(ul) = 0& .Item(it) = a Else a = .Item(it) If Not a(1).exists(ul) Then If a(0) > 0 Then ii = ii + 1 t = a(0): a(0) = 0 For x = 1 To 7: out(ii, x) = arr(t, x): Next End If a(1).Item(ul) = 0& ii = ii + 1 For x = 1 To 7: out(ii, x) = arr(i, x): Next .Item(it) = a End If End If Next i
End With [i1].CurrentRegion.Clear [i1].Resize(1, 7).Value = Array("№", "ФИО", "Д/Р", "место рожд.", "улица", "дом", "кв") [i2].Resize(ii, 7).Value = out
With [i1].CurrentRegion .Columns.AutoFit .Borders().LineStyle = xlContinuous End With
Application.ScreenUpdating = True MsgBox Timer - tm & " сек." Application.StatusBar = False End Sub
[/vba]
Ну вот так получилось без повторов за один проход под кнопку файла ABC. Чтоб меньше писать кода - вытягиваю все столбцы И номера в первом столбце оригинальные - так и искать проще будет Есть немножко недоработка - изначально лишнюю рамку не стирает.
[vba]
Code
Option Base 0
Sub test() Dim arr(), a, i&, ii&, it, ul, t&, x As Byte Dim tm!: tm = Timer Application.ScreenUpdating = False arr = Range([G2], Cells(Rows.Count, 1).End(xlUp)).Value ReDim out(1 To UBound(arr), 1 To 7)
With CreateObject("Scripting.Dictionary") For i = 1 To UBound(arr, 1) it = arr(i, 2) & "|" & arr(i, 3) ul = arr(i, 5) & "|" & arr(i, 6) & "|" & arr(i, 7) If Not .exists(it) Then a = Array(i, CreateObject("scripting.dictionary")) a(0) = i a(1).Item(ul) = 0& .Item(it) = a Else a = .Item(it) If Not a(1).exists(ul) Then If a(0) > 0 Then ii = ii + 1 t = a(0): a(0) = 0 For x = 1 To 7: out(ii, x) = arr(t, x): Next End If a(1).Item(ul) = 0& ii = ii + 1 For x = 1 To 7: out(ii, x) = arr(i, x): Next .Item(it) = a End If End If Next i
End With [i1].CurrentRegion.Clear [i1].Resize(1, 7).Value = Array("№", "ФИО", "Д/Р", "место рожд.", "улица", "дом", "кв") [i2].Resize(ii, 7).Value = out
With [i1].CurrentRegion .Columns.AutoFit .Borders().LineStyle = xlContinuous End With
Application.ScreenUpdating = True MsgBox Timer - tm & " сек." Application.StatusBar = False End Sub
Еще раз спасибо Игорь, и всем кто участвовал Переделал на оригинал файл чтоб вытащить нужные столбцы использовал b = Array(1, 2, 3, 21, 22, 24), общий столбец 26 (из них нужные 6 ст.) (за ~6 сек.)
[vba]
Code
Option Base 0
Sub test() Dim arr(), a, i&, ii&, it, ul, t&, x As Byte, b As Variant Dim tm!: tm = Timer Application.ScreenUpdating = False arr = Range([Z8], Cells(Rows.Count, 3).End(xlUp)).Value b = Array(1, 2, 3, 21, 22, 24) ReDim out(1 To UBound(arr), 1 To 7)
With CreateObject("Scripting.Dictionary") For i = 1 To UBound(arr, 1) it = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) ul = arr(i, 21) & "|" & arr(i, 22) & "|" & arr(i, 24) If Not .exists(it) Then a = Array(i, CreateObject("scripting.dictionary")) a(0) = i a(1).Item(ul) = 0& .Item(it) = a Else a = .Item(it) If Not a(1).exists(ul) Then If a(0) > 0 Then ii = ii + 1 t = a(0): a(0) = 0 out(ii, 1) = ii For x = 2 To 7: out(ii, x) = arr(t, b(x - 2)): Next End If a(1).Item(ul) = 0& ii = ii + 1 out(ii, 1) = ii For x = 2 To 7: out(ii, x) = arr(i, b(x - 2)): Next .Item(it) = a End If End If Next i
End With With Sheets("Результат") .[a1].CurrentRegion.Clear .[a1].Resize(1, 7).Value = Array("№", "ФИО", "Д/Р", "место рожд.", "улица", "дом", "кв") .[a2].Resize(ii, 7).Value = out .Activate With .[a1].CurrentRegion .Columns.AutoFit .Borders().LineStyle = xlContinuous End With
End With Application.ScreenUpdating = True MsgBox Timer - tm & " сек." Application.StatusBar = False End Sub
[/vba]
Еще раз спасибо Игорь, и всем кто участвовал Переделал на оригинал файл чтоб вытащить нужные столбцы использовал b = Array(1, 2, 3, 21, 22, 24), общий столбец 26 (из них нужные 6 ст.) (за ~6 сек.)
[vba]
Code
Option Base 0
Sub test() Dim arr(), a, i&, ii&, it, ul, t&, x As Byte, b As Variant Dim tm!: tm = Timer Application.ScreenUpdating = False arr = Range([Z8], Cells(Rows.Count, 3).End(xlUp)).Value b = Array(1, 2, 3, 21, 22, 24) ReDim out(1 To UBound(arr), 1 To 7)
With CreateObject("Scripting.Dictionary") For i = 1 To UBound(arr, 1) it = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) ul = arr(i, 21) & "|" & arr(i, 22) & "|" & arr(i, 24) If Not .exists(it) Then a = Array(i, CreateObject("scripting.dictionary")) a(0) = i a(1).Item(ul) = 0& .Item(it) = a Else a = .Item(it) If Not a(1).exists(ul) Then If a(0) > 0 Then ii = ii + 1 t = a(0): a(0) = 0 out(ii, 1) = ii For x = 2 To 7: out(ii, x) = arr(t, b(x - 2)): Next End If a(1).Item(ul) = 0& ii = ii + 1 out(ii, 1) = ii For x = 2 To 7: out(ii, x) = arr(i, b(x - 2)): Next .Item(it) = a End If End If Next i
End With With Sheets("Результат") .[a1].CurrentRegion.Clear .[a1].Resize(1, 7).Value = Array("№", "ФИО", "Д/Р", "место рожд.", "улица", "дом", "кв") .[a2].Resize(ii, 7).Value = out .Activate With .[a1].CurrentRegion .Columns.AutoFit .Borders().LineStyle = xlContinuous End With
End With Application.ScreenUpdating = True MsgBox Timer - tm & " сек." Application.StatusBar = False End Sub
Хитро, мне такое в голову не пришло Option Base 0 - это подстраховка на случай, если у кого-то будет прописано Option Base 1 А так можно и не писать.
Алгоритм понятен? Сделал всё как выше планировал. Хотя вижу понятен - ещё и дату рождения добавил, что правильно
P.S. Мучает любопытство - так сколько строк за 6 сек. обработало? Да, а выгрузку я часто вообще делаю в новую книгу - так и ничего затирать не нужно, и можно посмотреть и файл убить, или если нужно оставить, то сохранить под любым именем. Так и оригинал не напрягает лишними данными, и меньше риск его попортить, т.к. после работы можно закрыть без сохранения.
Хитро, мне такое в голову не пришло Option Base 0 - это подстраховка на случай, если у кого-то будет прописано Option Base 1 А так можно и не писать.
Алгоритм понятен? Сделал всё как выше планировал. Хотя вижу понятен - ещё и дату рождения добавил, что правильно
P.S. Мучает любопытство - так сколько строк за 6 сек. обработало? Да, а выгрузку я часто вообще делаю в новую книгу - так и ничего затирать не нужно, и можно посмотреть и файл убить, или если нужно оставить, то сохранить под любым именем. Так и оригинал не напрягает лишними данными, и меньше риск его попортить, т.к. после работы можно закрыть без сохранения.Hugo
Да, a = Array(i, Object) я раньше тоже нигде не встречал Это массив, в котором разные типы данных. a(0) и a(1) - это первый и второй элементы этого массива.
И кстати строка a(0) = i лишняя - там ведь сразу при создании это значение заносится в массив. Неуследил - подправь в рабочем коде.
Да, a = Array(i, Object) я раньше тоже нигде не встречал Это массив, в котором разные типы данных. a(0) и a(1) - это первый и второй элементы этого массива.
И кстати строка a(0) = i лишняя - там ведь сразу при создании это значение заносится в массив. Неуследил - подправь в рабочем коде.Hugo
так понятнее, убрал a(0)=i -------------------------------- чтобы все строки выпали, таким способом сделаю: файл ABC 1. Ваш код test 2. 2 ход сверки: выгруженных сверюсь с первой таблицей
примерно так должен получиться: ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 11,11 4 ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 12 4 (11,11) 2 сверка (12) 1 сверка
так понятнее, убрал a(0)=i -------------------------------- чтобы все строки выпали, таким способом сделаю: файл ABC 1. Ваш код test 2. 2 ход сверки: выгруженных сверюсь с первой таблицей
примерно так должен получиться: ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 11,11 4 ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 12 4 (11,11) 2 сверка (12) 1 сверкаABC
MS Excel 2007 and 2010... ------------------------------- С Уважением, Даулет