Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 23:08   #1
Liilla
 
Регистрация: 03.06.2011
Сообщений: 6
По умолчанию Выборка данных

Добрый день!
Задача: есть данные в Лист 1 и данные в Лист 2, необходимо сравнить их и отсеить дубликаты. И в Листе 3 отразить лишь данные ячеек, которые не идентичны с дубликатами в Листе1 и Листе2.
Лист 1(86,88,99,93,87,94)
Лист 2(89,94,97,86,77,78)
Лист 3(88,99,93,87,89,97,77,78)
Liilla вне форума Ответить с цитированием
Старый 03.06.2011, 23:19   #2
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Мне файлы переводить жалко. Свой дадите?
vikttur вне форума Ответить с цитированием
Старый 03.06.2011, 23:32   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Очень родственная задача - можно брать макросы и чуть переделать под эту задачу:
http://www.planetaexcel.ru/forum.php?thread_id=27042
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.06.2011, 23:39   #4
Liilla
 
Регистрация: 03.06.2011
Сообщений: 6
По умолчанию

конечно
Вложения
Тип файла: rar Excel.rar (7.6 Кб, 13 просмотров)
Liilla вне форума Ответить с цитированием
Старый 04.06.2011, 00:10   #5
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Раз уж назвался груздем...
Вложения
Тип файла: rar 111.rar (4.4 Кб, 26 просмотров)
vikttur вне форума Ответить с цитированием
Старый 04.06.2011, 11:06   #6
Liilla
 
Регистрация: 03.06.2011
Сообщений: 6
По умолчанию

Большое спасибо, за ответы, я тогда попробую все варианты отбора
Liilla вне форума Ответить с цитированием
Старый 04.06.2011, 16:35   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот, скомпоновал из двух макросов Николая по ссылке выше.
В примере запускается по кнопке.
Результат не сортирован, можно в принципе кодом массив отсортировать, или после выгрузки уже на листе. Это если нужно.

Алгоритм такой -
1.Берём один диапазон в массив, перекладываем всё в словарь.
2.Берём в массив второй диапазон (перезаписываем в этот же массив, заменяя уже ненужное содержимое).
3.Создаём пустой массив rez для результатов - по длине как сумма этих двух массивов, чтоб хватило места в любом случае.
3.Перебором массива x сверяем со словарём - если такого элемента в словаре нет, то пишем в массив результатов, если есть - то удаляем из словаря (тут узкое место - повторов в x быть не должно, иначе нужно доработать код).
4.Перебором словаря дописываем в rez оставшиеся в словаре данные.
5.Выгружаем результат.


P.S. Лучше такой вариант (http://www.programmersforum.ru/attac...d=1307206034):

Код:
Option Explicit

Sub Liilla()
    Dim x, rez(), i&, j&, oDict1 As Object, oDict2 As Object, el

    Set oDict1 = CreateObject("Scripting.Dictionary")
    oDict1.CompareMode = vbTextCompare
    Set oDict2 = CreateObject("Scripting.Dictionary")
    oDict2.CompareMode = vbTextCompare

    x = Sheets("Лист1").Range("A2:B" & Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(x): oDict1.Item(x(i, 1)) = x(i, 2): Next

    x = Sheets("Лист2").Range("A2:B" & Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(x): oDict2.Item(x(i, 1)) = x(i, 2): Next

    ReDim rez(1 To oDict1.Count + oDict2.Count, 1 To 2)

    For Each el In oDict1.keys
        If Not oDict2.Exists(el) Then
            j = j + 1
            rez(j, 1) = el
            rez(j, 2) = oDict1.Item(el)
        End If
    Next

    For Each el In oDict2.keys
        If Not oDict1.Exists(el) Then
            j = j + 1
            rez(j, 1) = el
            rez(j, 2) = oDict2.Item(el)
        End If
    Next


If j = 0 Then Exit Sub

With Sheets("Лист3").[a2:b2].Resize(j)
    .ClearContents: .Value = rez
End With
End Sub
Принцип тот же, но сперва данные перекладываются в два словаря, чем исключается влияние повторов. Потом словари сверяются один с другим - отсутствующие перекладываются в результирующий массив.
Вложения
Тип файла: zip Liilla.zip (14.0 Кб, 11 просмотров)
Тип файла: zip Liilla2.zip (14.3 Кб, 26 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.06.2011 в 20:50.
Hugo121 вне форума Ответить с цитированием
Старый 05.06.2011, 23:34   #8
Liilla
 
Регистрация: 03.06.2011
Сообщений: 6
По умолчанию

Большое спасибо, за код
Я единственное, написала пример некорректный. Вообще в строках еще значения всякие, а выборка проходит лишь по нескольким столбцам. Я в данный код пробовала добавить остальные столбцы, необязательно, что значения в них совпадают со значениями в других Листах , то есть остальная информация в строках, а выскакивает ошибка.
Вложения
Тип файла: rar Liilla2.rar (13.2 Кб, 10 просмотров)
Liilla вне форума Ответить с цитированием
Старый 06.06.2011, 09:30   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот, сколько раз говорили - давайте реальное расположение данных. Если бы сразу было всё ясно, код возможно был бы другой, ну а теперь приходится так выкручиваться (если колонок много, то немного муторно в код добавлять их обработку):

Код:
Option Explicit

Sub Liilla()
    Dim x, rez(), i&, j&, oDict1 As Object, oDict2 As Object, el

    Set oDict1 = CreateObject("Scripting.Dictionary")
    oDict1.CompareMode = vbTextCompare
    Set oDict2 = CreateObject("Scripting.Dictionary")
    oDict2.CompareMode = vbTextCompare

    x = Sheets("Лист1").Range("A2:C" & Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(x): oDict1.Item(x(i, 1)) = x(i, 2) & "|" & x(i, 3): Next

    x = Sheets("Лист2").Range("A2:C" & Sheets("Лист2").Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(x): oDict2.Item(x(i, 1)) = x(i, 2) & "|" & x(i, 3): Next

    ReDim rez(1 To oDict1.Count + oDict2.Count, 1 To 3)

    For Each el In oDict1.keys
        If Not oDict2.Exists(el) Then
            j = j + 1
            rez(j, 1) = el
            rez(j, 2) = Split(oDict1.Item(el), "|")(0)
            rez(j, 3) = Split(oDict1.Item(el), "|")(1)
        End If
    Next

    For Each el In oDict2.keys
        If Not oDict1.Exists(el) Then
            j = j + 1
            rez(j, 1) = el
            rez(j, 2) = Split(oDict2.Item(el), "|")(0)
            rez(j, 3) = Split(oDict2.Item(el), "|")(1)
        End If
    Next

If j = 0 Then Exit Sub

With Sheets("Лист3").[a2:c2].Resize(j)
    .ClearContents: .Value = rez
End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.06.2011 в 10:03.
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВЫБОРКА ДАННЫХ Айвенго Microsoft Office Access 0 14.02.2011 10:04
Выборка данных в БД (ADO) Makoto2005 БД в Delphi 0 01.06.2010 13:38
Выборка данных segail Microsoft Office Excel 4 08.02.2010 16:37
Выборка из базы данных fygas1991 PHP 3 07.12.2009 23:54
Выборка данных ADRENALIN86 Microsoft Office Excel 1 13.08.2009 15:51