Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Извлечь данных (повторяющих и одинарных удалить) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Извлечь данных (повторяющих и одинарных удалить)
ABC Дата: Среда, 14.11.2012, 10:00 | Сообщение № 1
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте!
Есть столбцы A:G, объединить столбцы B&C&E&F&G, повторяющих и одинарных надо удалить, если столбцы B&C&G совпадают, но не совпадают столбцы E или F тогда оставляем.
Но у меня не так получается sad (извлекает уникальных)
К сообщению приложен файл: ABC.xls (46.5 Kb)


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
СообщениеЗдравствуйте!
Есть столбцы A:G, объединить столбцы B&C&E&F&G, повторяющих и одинарных надо удалить, если столбцы B&C&G совпадают, но не совпадают столбцы E или F тогда оставляем.
Но у меня не так получается sad (извлекает уникальных)

Автор - ABC
Дата добавления - 14.11.2012 в 10:00
Gustav Дата: Среда, 14.11.2012, 10:50 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Сделал соответствующий SQL-запрос в Access'е:

[vba]
Code
SELECT a.* FROM Лист1 a    

INNER JOIN    

(SELECT b.ФИО, b.[Д/Р], b.кв    
FROM Лист1 b    
GROUP BY b.ФИО, b.[Д/Р], b.кв    
HAVING Count(*)>1) z

ON a.кв = z.кв AND a.[Д/Р] = z.[Д/Р] AND a.ФИО = z.ФИО

ORDER BY a.ФИО, a.[№]
[/vba]

Можно попробовать это же сделать в Excel через ADO: http://www.excelworld.ru/forum/2-2013-22035-16-1342306559


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 14.11.2012, 10:55
 
Ответить
СообщениеСделал соответствующий SQL-запрос в Access'е:

[vba]
Code
SELECT a.* FROM Лист1 a    

INNER JOIN    

(SELECT b.ФИО, b.[Д/Р], b.кв    
FROM Лист1 b    
GROUP BY b.ФИО, b.[Д/Р], b.кв    
HAVING Count(*)>1) z

ON a.кв = z.кв AND a.[Д/Р] = z.[Д/Р] AND a.ФИО = z.ФИО

ORDER BY a.ФИО, a.[№]
[/vba]

Можно попробовать это же сделать в Excel через ADO: http://www.excelworld.ru/forum/2-2013-22035-16-1342306559

Автор - Gustav
Дата добавления - 14.11.2012 в 10:50
Саня Дата: Среда, 14.11.2012, 12:35 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
в лоб
К сообщению приложен файл: 5782190.xls (59.5 Kb)
 
Ответить
Сообщениев лоб

Автор - Саня
Дата добавления - 14.11.2012 в 12:35
ABC Дата: Среда, 14.11.2012, 13:08 | Сообщение № 4
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Саня, спасибо то что надо...
Gustav, Вам тоже спасибо...


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
СообщениеСаня, спасибо то что надо...
Gustav, Вам тоже спасибо...

Автор - ABC
Дата добавления - 14.11.2012 в 13:08
Hugo Дата: Среда, 14.11.2012, 13:40 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Я вот не понял - почему Попов 3 раза? Не согласуется с условиями...
Потому и не делал ничего пока - хотя думаю на словаре можно сделать.
Вообще условия мне не до конца ясны - я понял задачу так: вытянуть тех уникальных по ФИО/ДР, кто повторяется с разными данными.
Единичные не нужны, повторы повторов тоже не нужны.
Но Попов рушит всю картину smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЯ вот не понял - почему Попов 3 раза? Не согласуется с условиями...
Потому и не делал ничего пока - хотя думаю на словаре можно сделать.
Вообще условия мне не до конца ясны - я понял задачу так: вытянуть тех уникальных по ФИО/ДР, кто повторяется с разными данными.
Единичные не нужны, повторы повторов тоже не нужны.
Но Попов рушит всю картину smile

Автор - Hugo
Дата добавления - 14.11.2012 в 13:40
ABC Дата: Среда, 14.11.2012, 14:02 | Сообщение № 6
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Игорь, хотел из первой таблицы не совпавших всех вытащить, ну что бы знать где именно ошибка (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


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
СообщениеИгорь, хотел из первой таблицы не совпавших всех вытащить, ну что бы знать где именно ошибка (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

Автор - ABC
Дата добавления - 14.11.2012 в 14:02
Gustav Дата: Среда, 14.11.2012, 14:16 | Сообщение № 7
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Как я понял, исходная постановка Даулета, уже выраженная через строгость SQL, проговаривается так:

1. Сначала получить все уникальные комбинации по ключу "ФИО - Д/Р - кв" с числом повторений более 1.
2. Потом из исходной таблицы достать все записи соответствующие этим отобранным уникальным комбинациям.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеКак я понял, исходная постановка Даулета, уже выраженная через строгость SQL, проговаривается так:

1. Сначала получить все уникальные комбинации по ключу "ФИО - Д/Р - кв" с числом повторений более 1.
2. Потом из исходной таблицы достать все записи соответствующие этим отобранным уникальным комбинациям.

Автор - Gustav
Дата добавления - 14.11.2012 в 14:16
Hugo Дата: Среда, 14.11.2012, 14:43 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.
Но Попов спутал логику.
Позже (или вечером) подумаю, как это на словаре сделать, без лишних "поповов" - с ними вариант на коллекции уже есть smile
Думаю где-то так - записываем в словарь ФИО/ДАТА и ему в Item номер первой встреченной строки и другой словарь адресов (массив)
Как только есть нужда проверить новый адрес по тому словарю (т.е. он уже создан) и там такого адреса ещё нет - отбираем первую и эту строку.
Всё можно сделать за один проход по массиву данных.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЯ так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.
Но Попов спутал логику.
Позже (или вечером) подумаю, как это на словаре сделать, без лишних "поповов" - с ними вариант на коллекции уже есть smile
Думаю где-то так - записываем в словарь ФИО/ДАТА и ему в Item номер первой встреченной строки и другой словарь адресов (массив)
Как только есть нужда проверить новый адрес по тому словарю (т.е. он уже создан) и там такого адреса ещё нет - отбираем первую и эту строку.
Всё можно сделать за один проход по массиву данных.

Автор - Hugo
Дата добавления - 14.11.2012 в 14:43
ABC Дата: Среда, 14.11.2012, 15:03 | Сообщение № 9
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Quote (Hugo)
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.

именно так Игорь, столбцы B C D G это уже готовая база, столбец - E и F вводят специалисты, на выявить ошибку.
У Сани работает правильно, но больших примерах очень долго работает.


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
Сообщение
Quote (Hugo)
Я так и понял, что нужно только выяснить, у кого из "клиентов" напутаны адреса и какие именно заведены.

именно так Игорь, столбцы B C D G это уже готовая база, столбец - E и F вводят специалисты, на выявить ошибку.
У Сани работает правильно, но больших примерах очень долго работает.

Автор - ABC
Дата добавления - 14.11.2012 в 15:03
Hugo Дата: Среда, 14.11.2012, 15:11 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Но у Сани с повторами - а если там 100 поповых, и 3 раза напутано?
SQL не проверял.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНо у Сани с повторами - а если там 100 поповых, и 3 раза напутано?
SQL не проверял.

Автор - Hugo
Дата добавления - 14.11.2012 в 15:11
ABC Дата: Среда, 14.11.2012, 15:14 | Сообщение № 11
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
SQL не силен (для меня ууу), при изменении или добавления столбцов, думаю не исправлюсь с SQL, а с макросом легче.


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
СообщениеSQL не силен (для меня ууу), при изменении или добавления столбцов, думаю не исправлюсь с SQL, а с макросом легче.

Автор - ABC
Дата добавления - 14.11.2012 в 15:14
Hugo Дата: Среда, 14.11.2012, 15:18 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Позже попробую сделать на словаре в словаре smile
Сейчас работы навалило sad
Мне тоже проще макрос - тут хоть можно как хош повернуть, а SQL на мой взгляд как формулы..


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПозже попробую сделать на словаре в словаре smile
Сейчас работы навалило sad
Мне тоже проще макрос - тут хоть можно как хош повернуть, а SQL на мой взгляд как формулы..

Автор - Hugo
Дата добавления - 14.11.2012 в 15:18
Hugo Дата: Среда, 14.11.2012, 19:07 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Ну вот так получилось без повторов за один проход под кнопку файла ABC.
Чтоб меньше писать кода - вытягиваю все столбцы smile
И номера в первом столбце оригинальные - так и искать проще будет smile
Есть немножко недоработка - изначально лишнюю рамку не стирает.

[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]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу вот так получилось без повторов за один проход под кнопку файла ABC.
Чтоб меньше писать кода - вытягиваю все столбцы smile
И номера в первом столбце оригинальные - так и искать проще будет smile
Есть немножко недоработка - изначально лишнюю рамку не стирает.

[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]

Автор - Hugo
Дата добавления - 14.11.2012 в 19:07
ABC Дата: Среда, 14.11.2012, 19:37 | Сообщение № 14
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Quote (Hugo)
Есть немножко недоработка - изначально лишнюю рамку не стирает

а нечего выгрузку сделаю на другой лист и .Cells.Clear
Игорь, проверил на рабочем файле, работает красиво!!! СПАСИБО ВАМ!!!


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
Сообщение
Quote (Hugo)
Есть немножко недоработка - изначально лишнюю рамку не стирает

а нечего выгрузку сделаю на другой лист и .Cells.Clear
Игорь, проверил на рабочем файле, работает красиво!!! СПАСИБО ВАМ!!!

Автор - ABC
Дата добавления - 14.11.2012 в 19:37
ABC Дата: Среда, 14.11.2012, 20:51 | Сообщение № 15
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Еще раз спасибо Игорь, и всем кто участвовал
Переделал на оригинал файл
чтоб вытащить нужные столбцы использовал b = Array(1, 2, 3, 21, 22, 24), общий столбец 26 (из них нужные 6 ст.) (за ~6 сек.)


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
СообщениеЕще раз спасибо Игорь, и всем кто участвовал
Переделал на оригинал файл
чтоб вытащить нужные столбцы использовал b = Array(1, 2, 3, 21, 22, 24), общий столбец 26 (из них нужные 6 ст.) (за ~6 сек.)

Автор - ABC
Дата добавления - 14.11.2012 в 20:51
Hugo Дата: Среда, 14.11.2012, 21:24 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Хитро, мне такое в голову не пришло smile
Option Base 0 - это подстраховка на случай, если у кого-то будет прописано Option Base 1 smile
А так можно и не писать.

Алгоритм понятен?
Сделал всё как выше планировал.
Хотя вижу понятен - ещё и дату рождения добавил, что правильно smile

P.S. Мучает любопытство - так сколько строк за 6 сек. обработало?
Да, а выгрузку я часто вообще делаю в новую книгу - так и ничего затирать не нужно, и можно посмотреть и файл убить, или если нужно оставить, то сохранить под любым именем. Так и оригинал не напрягает лишними данными, и меньше риск его попортить, т.к. после работы можно закрыть без сохранения.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеХитро, мне такое в голову не пришло smile
Option Base 0 - это подстраховка на случай, если у кого-то будет прописано Option Base 1 smile
А так можно и не писать.

Алгоритм понятен?
Сделал всё как выше планировал.
Хотя вижу понятен - ещё и дату рождения добавил, что правильно smile

P.S. Мучает любопытство - так сколько строк за 6 сек. обработало?
Да, а выгрузку я часто вообще делаю в новую книгу - так и ничего затирать не нужно, и можно посмотреть и файл убить, или если нужно оставить, то сохранить под любым именем. Так и оригинал не напрягает лишними данными, и меньше риск его попортить, т.к. после работы можно закрыть без сохранения.

Автор - Hugo
Дата добавления - 14.11.2012 в 21:24
ABC Дата: Четверг, 15.11.2012, 07:08 | Сообщение № 17
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
Quote (Hugo)
так сколько строк за 6 сек. обработало?

30 000 строк из них выгружено 182 строк.
Quote (Hugo)
Алгоритм понятен?

общий обзор понятен (но есть, где первый раз вижу a = Array(i, CreateObject("scripting.dictionary")), a(0), a(1)), это скорее всего 0 и 1 индекс.


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
Сообщение
Quote (Hugo)
так сколько строк за 6 сек. обработало?

30 000 строк из них выгружено 182 строк.
Quote (Hugo)
Алгоритм понятен?

общий обзор понятен (но есть, где первый раз вижу a = Array(i, CreateObject("scripting.dictionary")), a(0), a(1)), это скорее всего 0 и 1 индекс.

Автор - ABC
Дата добавления - 15.11.2012 в 07:08
Hugo Дата: Четверг, 15.11.2012, 10:29 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Да, a = Array(i, Object) я раньше тоже нигде не встречал smile
Это массив, в котором разные типы данных.
a(0) и a(1) - это первый и второй элементы этого массива.

И кстати строка
a(0) = i
лишняя - там ведь сразу при создании это значение заносится в массив.
Неуследил - подправь в рабочем коде.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДа, a = Array(i, Object) я раньше тоже нигде не встречал smile
Это массив, в котором разные типы данных.
a(0) и a(1) - это первый и второй элементы этого массива.

И кстати строка
a(0) = i
лишняя - там ведь сразу при создании это значение заносится в массив.
Неуследил - подправь в рабочем коде.

Автор - Hugo
Дата добавления - 15.11.2012 в 10:29
ABC Дата: Четверг, 15.11.2012, 11:32 | Сообщение № 19
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
так понятнее, убрал a(0)=i
--------------------------------
чтобы все строки выпали, таким способом сделаю:
файл ABC
1. Ваш код test
2. 2 ход сверки: выгруженных сверюсь с первой таблицей

примерно так должен получиться:
ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 11,11 4
ПОПОВ 01.01.1970 г. Алматы УЛ КИХТЕНКО 12 4
(11,11) 2 сверка
(12) 1 сверка


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
Сообщениетак понятнее, убрал 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
Дата добавления - 15.11.2012 в 11:32
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!