Страницы: 1
RSS
Поиск различий по столбцам
 
Добрый день. Прошу помощи... Есть два столбца с данными, необходимо чтобы данные второго столбца сравнивались с данными первого и те значения которые есть во втором но отсутвуют в первом выносились на лист результат..... т.е. берем первую ячейку второго столбца пробегаемся по диапазону первого (диапазон может быть разным) и если значение в первом есть, то ни чего не делаем, а если нет то выводим на лист результат с колличеством и т.д.. Хотелось бы конечно чтобы если значения второго стоблца отсутствует в первом то как то искать ближайшее похожее но я думаю это не реально... нужен именно макрос так как ВПР не подходит из-за дальнейших действий.... Файл прилагаю. Спасибо большое.
 
массивная
Код
=ИНДЕКС(Справочник!$C$1:$C$132;НАИМЕНЬШИЙ(ЕСЛИ(ЕНД(ПОИСКПОЗ(Справочник!$C$1:$C$132;Справочник!$A$1:$A$132;0));СТРОКА($A$1:$A$132));СТРОКА(A1)))
проверяйте
 
с доп. столбцом
 
спасибо большое, но как сделать с помощью VBA? Формулы работаю то длинна первого и вторго столбцов могут быть обсолютно разными  и ни хотелось бы ни каких Н/Д или нулей. Спасибо.
 
Макросом...
 
А почему не использовать функции Ехс при проверке нахождения данных в диапазоне?
Скрытый текст
Изменено: Igor67 - 08.07.2014 17:36:02
 
Цитата
Igor67 пишет: почему не использовать функции Ехс
потому что медленно.
кстати, код Alexandr P - тоже медленный.
и, кроме того, решающий другую задачу :)

вариант со словарем:
Код
Sub t()
  Dim a(), b(), d, i&
  On Error Resume Next
  a = Range([a2], Cells(Rows.Count, 1).End(xlUp)).Value
  b = Range([c2], Cells(Rows.Count, 3).End(xlUp)).Resize(, 2).Value
  Set d = CreateObject("scripting.dictionary")
  For i = 1 To UBound(b): d(CStr(b(i, 1))) = b(i, 2): Next
  For i = 1 To UBound(a): d.Remove CStr(a(i, 1)): Next
  With [Результат!a2].Resize(d.Count, 2)
    .Columns(1).NumberFormat = "@"
    .Value = Application.Transpose(Array(d.keys, d.items))
  End With
End Sub
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
вариант со словарем: - спасибо, отличный код, правда без пояснений, не могли бы вы немного прокомментировать?  Тяжеловат для восприятия и разбора.... два предыдущих кода у меня должным образом не сработали..((
 
ну что там комментировать?..  :/

данные с листа забираются в массивы - a и b
создается объект dictionary (словарь) - по сути ассоциативный массив (если не вдаваться в нюансы)
первый цикл - из массива b переносим всё в словарь.
второй цикл - всё что есть в массиве a, пытаемся удалить из словаря.
в итоге в словаре остается то, что есть во втором массиве, но нет в первом - это нам и нужно.
и в конце выгружаем "остатки" из словаря на лист.

пс. обработка ошибок нужна для случаев отсутствия удаляемых элементов в словаре, а также для случая, когда словарь остается пустой.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
msd,  
Цитата
Хотелось бы конечно чтобы если значения второго стоблца отсутствует в первом то как то искать ближайшее похожее но я думаю это не реально...
Какая логика, алгоритм поиска похожего?
 
Ну чаще всего это расхождение по первому нулю впереди, он может быть как в столбце из базы так и в столбце сканера (сканер их иногда сканирует иногда нет)......
 
ikki, спасибо за комментарий.
Я пытаюсь вставить ваш код для себя но не получается, прошу помощи, файл прикрепил..... и еще одно упущение.... в основной базе штрихкодов оказывается есть пустоты (пустые ячейки) т.е. цикл проверки будет не полным? С этим можно что то сделать?(((( Спасибо.

Не умеете - вообще не цитируйте.  [МОДЕРАТОР]
 
увы. сейчас некогда.
вечером (примрно в 17 мск посмотрю).
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
А там и смотреть нечего. Пустой файл, в котором макрос будет работать.
 
Цитата
ikki пишет: кстати, код Alexandr P - тоже медленный.
Согласен, мой код медленный. Ваш на словарях гораздо рациональнее и быстрее, но у меня он неверно отработал... Получается что он просто переносит весь массив из второго столбца на лист "результат".
Цитата
RAN пишет: и, кроме того, решающий другую задачу
Да, изначально неправильно понял задачу... Во вложении файл с исправленным кодом.
 
Цитата
Alexandr P пишет: у меня он неверно отработал...
мне кажется, что дома он у меня отрабатывал верно - переносил всё, кроме одной позиции.

сейчас проверил на рабочем компьютере - да, неверно, согласен. спасибо за замечание.
лечится легко: одну строчку
Код
For i = 1 To UBound(a): d.Remove CStr(a(i, 1)): Next
разбиваем на три:
Код
  For i = 1 To UBound(a)
    d.Remove CStr(a(i, 1))
  Next
тогда обработчик ошибок перекидывает код на следующую итерацию, а не выбрасывает из цикла.

но "осадок остался". почему так?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В коде ikki есть одна оплошность - нельзя так в одну строку писать удаление из словаря! :(
 
Hugo, опоздал! на 21 секунду  :D
честно говоря - первый раз столкнулся.
вообще почти никогда не использую Remove
теперь буду знать.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Это вина пропуска ошибок... Действительно, нужно запомнить...

Код
Sub test()
    a = Split("0 1 2 3")
    On Error Resume Next
    'так почему-то нельзя!
    For i = 0 To UBound(a): x = 1 / a(i): Next
    'а так почему-то можно...
    For i = 0 To UBound(a)
    x = 1 / a(i): Next
End Sub

 
Изменено: Hugo - 09.07.2014 11:47:37
 
Цитата
RAN пишет: Пустой файл, в котором макрос будет работать.
Там не пустой файл а три листа...))
 
Alexandr P, спасибо, хороший код но я не пойму что такое с=2? За что отвечает эта переменная, просто пытаюсь вникать...... Спасибо
 
модификация для файла original2.xls
запускать можно при любом активном листе любой книги.
Код
Sub t()
  Dim a(), b(), d, i&
  On Error Resume Next
  With ThisWorkbook.Sheets("Прайс")
    a = Range(.[i2], .Cells(Rows.Count, 9).End(xlUp)).Value
    b = Range(.[m2], .Cells(Rows.Count, 13).End(xlUp)).Resize(, 2).Value
  End With
  Set d = CreateObject("scripting.dictionary")
  For i = 1 To UBound(b): d(CStr(b(i, 1))) = b(i, 2): Next
  For i = 1 To UBound(a)
    d.Remove CStr(a(i, 1))
  Next
  With ThisWorkbook.Sheets("Нет в прайсе").[a2].Resize(d.Count, 2)
    .Columns(1).NumberFormat = "@"
    .Value = Application.Transpose(Array(d.keys, d.items))
  End With
End Sub
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Уважаемые специалисты Всем Спасибо огромное за помощь, всё замечательно работает и быстро!!! Перед администраторами форума приношу свои извинения за ошибки в оформлении сообщений, буду исправляться.... Самый адекватный форум! Ещё раз спасибо. Тему можно закрывать.
 
msd, что такое 9 и 13 в коде - понятно?
Изменено: ikki - 09.07.2014 21:36:24
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да , номера столбцов, не издевайтесь, я только начинаю вникать в эту тему..)))
 
Цитата
msd пишет: не издевайтесь
даже в мыслях не было.
Цитата
msd пишет:  я только начинаю вникать в эту тему
хорошо вникаете.
обычно этот момент вызывает у многих пользователей вопросы.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Здравствуйте ещё раз мастера. Снова нужна Ваша помощь с макросом. Задача та же что и была, но из за нулей впереди поиск не происходит правильно, из-за того что впереди есть ноль или два нуля  значения попадают на лист "Нет в прайсе".... происходит путаница..... см. файл  ( помогите как выйти из положения. Желательно используя тот же макрос что внутри как дописать чтобы не было такой путаницы.
 
Что решения нет?( Подскажите пожалуйста.
Страницы: 1
Наверх