Страницы: 1
RSS
Сравнение списков по двум столбцам с выводом результата отличия, VBA
 
Приветствую, друзья, я за помощью.

Есть задача:
Сравнить два списка - первый - коды товара и его количество у одной компании, второй - такие же коды и количество у другой
Если и у одной и у другой компании есть одинаковые коды товара в одинаковом количестве- пишем "совпадает"
Если код товара совпадает, но не совпадает количество -пишем "Разное количество"
Если у компании 2 есть код товара, которого нет у компании 1 - пишем "нет кода"

Сравниваем список компании 2 со списком копании 1.
Сейчас у меня получается только проверять по коду товара вот таким вот кодом

Код
Sub Find_Matches()
    Dim CompareRange As Variant, x As Variant, y As Variant
    
    Set CompareRange = Range("a2:a500") ' Диапазон с которым сравниваем выделенный диапазон
   
    Range("B2").Select
    Range(Selection, Selection.End(xlDown)).Select
    For Each x In Selection
        For Each y In CompareRange
            If x = y Then x.Offset(0, 1) = "Совпадает"
 
        Next y
    Next x

End Sub


Помогите поправить код.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Доброе время суток.
На VBA не интересно. Могу предложить версию на SQL. Файл сохранить в папку c:\path. ПКМ на таблице листа "Отчёт сверки" - Обновить.
Успехов.
 
Андрей VG, Спасибо Вам за интересный вариант:) Обязательно попробую. Но мне интересно ради развития, как это будет выглядеть на VBA.
Через Power Query тоже уже решил, а вот через VBA не могу.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Код
Sub Find_Matches()
   
    Dim a, k As Integer
    k = Sheets("Как надо").UsedRange.Rows.Count
  
   For a = 2 To k
   Select Case Cells(a, 1).Value
   Case Is = Cells(a, 3).Value
    Select Case Cells(a, 2).Value
      Case Is = Cells(a, 4).Value
       Cells(a, 5).Value = "совпадает"
    Case Else: Cells(a, 5).Value = "разное количество"
   End Select
   Case Else: Cells(a, 5).Value = "нет кода"
   End Select
   Next a
End Sub

Запускаете на "Как надо")
Сейчас попробую доделать по Range, а не по столбцу.
Изменено: Eternity - 29.08.2018 00:06:42
 
Dyroff,  Править код - уж сами
Как минимум CompareRange перегнать в словарь и поиск совпадений уже  словарем вести. Перебор выделенной области, тоже можно через массив организовать, но это на любителя и только для скорости.
По вопросам из тем форума, личку не читаю.
 
Цитата
Dyroff написал:
а вот через VBA не могу.
Так а что там сложного? Всё тоже самое. Full Outer Join на двух словарях. Ключ артикул, значение количество. Если ключи в словарях совпадают, то сравниваем количество и выносим вердикт. Если нет ключа в первом с просмотром по второму так и пишем - нет в первом, если нет во втором с просмотром по первому, то нет во втором.
 
Eternity,  круто- спасибо:)
БМВ, Андрей VG,   Я не на столько хорошо владею VBA, чтобы для меня это было столь просто) Со словарями вообще никогда не работал и понятия даже не имею, как это:)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Dyroff написал:
Со словарями вообще никогда не работал
начните с Ожогова :-)
Цитата
Андрей VG написал:
на двух словарях. Ключ артикул, значение количество
Андрей, не понял зачем 2 и не проще ли составной ключ из артикула и количества? Тонее совсем не понял причем тут количество.
Изменено: БМВ - 29.08.2018 00:24:59
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
начните с Ожогова :-)
)) Хорошая шутка, мне понравилась))
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Цитата
Dyroff написал:
БМВ  написал: начните с Ожегова
А я вот гугл-переводчиком пользуюсь: Товар - Goods, Количество - Quantity
Код
Sub Find_Matches_123()
    Dim Rng As Range, G As Variant, Q As Variant, N As Long, I As Long, J As Long
    Application.ScreenUpdating = False
    Set Rng = Sheets("Как надо").[A1].CurrentRegion
    N = Rng.Rows.Count
    For J = 2 To N
        G = Rng.Cells(J, 3)
        Q = Rng.Cells(J, 4)
        For I = 2 To N
            If Rng.Cells(I, 1) = G Then
                If Rng.Cells(I, 2) = Q Then
                    Rng.Cells(J, 5).Value = "Совпадает"
                Else
                    Rng.Cells(J, 5).Value = "Разное количество"
                End If
                Exit For
            End If
        Next
        If I > N Then Rng.Cells(J, 5) = "Нет Кода"
    Next
    Application.ScreenUpdating = True
End Sub
 
Код
Sub Find_Matches()
    Dim x As Variant
  
        
    Range("C2").Select
    Range(Selection, Selection.End(xlDown)).Select
    For Each x In Selection
        
                
             Select Case x
             Case Is = x.Offset(0, -2)
              Select Case x.Offset(0, -1)
              Case Is = x.Offset(0, 1)
               x.Offset(0, 2) = "Cовпадает"
              Case Else
               x.Offset(0, 2) = "Разное количество"
              End Select
             Case Else
             x.Offset(0, 2) = "Нет кода"
            End Select
            
 
       
    Next x

End Sub
Не нужен Вам <берег турецкий CompareRange. Запускаете по-прежнему на "Как надо")
Изменено: Eternity - 29.08.2018 00:43:02
 
Цитата
БМВ написал:
не понял зачем 2
Нарвавшись тут, рассматривал задачу в общем случае. А в общем случае не факт, что при сортировке двух таблиц по коду товара (артикулу), при их совмещении таблиц слева на право на одном листе у нас равные артикулы встанут на одной строке. Тогда так красиво за один цикл, как у Eternity, сделать не получится. А просмотр по двум массивам это цикл в цикле - или N^2, что хуже чем на словарях. В прочем не настаиваю на единственно верном решении. Может тут тоже будет быстрее сортировка слиянием, как когда то доказал bedvit для случая отбора уникальных значений.
Цитата
БМВ написал:
Тонее совсем не понял причем тут количество.
А как делать заключения совпадают не совпадают? А так
Код
If dic1(key) = dic2(key) Then
    Debug.Pring "Совпадают"
Else
    Debug.Pring "Разное количество"
End If
Изменено: Андрей VG - 29.08.2018 06:24:35
 
Андрей VG, Андрей, да, не особо вник, что нужно не только перекинуть тригер, совпал - нет, но и  указать причину.
По вопросам из тем форума, личку не читаю.
 
Друзья, всем спасибо и за варианты и за обсуждение. Много полезного вынес.
Eternity, Спасибо за 2 варианта.
С.М.,  и Вам спасибо за вариант.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Здравствуйте, пытаюсь сделать слияние нескольких таблиц из разных файлов в одну такую же, но с соответствующими изменениями в исходных таблицах. Таблицы с данными за разные года имеют одни и те же столбцы. Критерии слияния просты - Одинаковые строки оставить в одном экземпляре, недостающие добавить, Различающиеся данные в стоках заменить на более свежие данные. Пробывал с надстройками, но там не то. Прошу подсказать как можно это осуществить.
 
Добрый день! Помогите пжл сравнить данные двух таблиц и вывести расхождения. Для примера.xlsx (10.83 КБ)  
 
manuv, критерии для сравнения Вы не указали. И покажите в файле какой должен быть результат. (старый файл замените на новый - свои сообщения можно редактировать)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
manuv,
Если правильно понял, то ищем по номерам договоров и проверяем цены.
У вас в файле нет совпадений номеров договора, поэтому для примера я намеренно изменил два номера и поправил цены, чтобы продемонстрировать как будет работать.

Вот два решения:

1) формулами
2) с помощью Power Query

1) На листе "таблицы" создал две динамические таблицы. Просто добавляйте в них данные и в центральной таблице "Результат" появятся совпадения номеров договора, если они есть и вы сразу увидите какие номера договоров совпадают и есть ли у них при этом разница в цене. Тут все ясно, добавляете данные- протягиваете формулу.

2)  Если у вас Excel 2016- то ничего дополнительно делать не нужно. Если же 2010 или 2013 то вам надо дополнительно скачать и установить надстройку Power Query(если не установлена) она совершенна бесплатна и  проста в установке. Вот вам ссылка на официальный сайт майкрософт, где ее можно скачать https://www.microsoft.com/ru-ru/download/details.aspx?id=39379.

Итак, все что вам нужно, это добавлять новую информацию в ваши таблицы и на вкладке "Данные", нажать кнопку "Обновить все". После этого на листе "результат" у вас в таблице в одну строку встанут данные с одинаковыми номерами договора и указанием того, есть ли разница в цене, или нет.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Страницы: 1
Наверх