Страницы: 1
RSS
Доработать макрос сравнения нескольких столбцов с несколькими столбцами., Сравнение столбцов
 
Всем привет! Есть 2 столбца с данными на одной странице и два столбца на другой странице, между ними надо провести сравнение и там где оно происходит вывести в столбец С единицу. Есть макрос который делает сравнение по двум столбцам.
Результатом в столбце С  на первой странице должна выводиться единичка напротив строки ПЯТЬ 5, т.к. только она совпадает на двух листах.
Код

Sub compare()
Dim a, b, c, d, e, iLastrow As Long, i As Long
Dim tm: tm = Timer
'1.
With Sheet2 
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
b = Range(.[A1], .Range("A" & iLastrow)).Value
'd = Range(.[B1], .Range("B" & iLastrow)).Value

End With

With Sheet1
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
a = Range(.[A1], .Range("A" & iLastrow)).Value
'e = Range(.[B1], .Range("B" & iLastrow)).Value

End With

'2.
ReDim c(1 To UBound(a), 1 To 1)

'3.
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(b)
            .Item(b(i, 1)) = CStr(1)
    Next

'4.
    For i = 1 To UBound(a)
      If .exists(a(i, 1)) Then c(i, 1) = 1
    Next
End With

'5.
With Sheet1 
Range(.[C1], .Range("C" & iLastrow)).Value = c
End With

MsgBox Timer - tm 
End Sub
 
Цитата
chep-kep написал:
Есть макрос который делает сравнение по двум столбцам
- и где этот макрос?
В существующем видим
Код
Range(.[A1], .Range("A" & iLastrow)).Value
- тут никак не помещаются 2 столбца.
 
chep-kep,Посмотрите это. Может понравится больше чем макрос
 
Код
Option Explicit

'Макросом -
'1.два диапазона в два массива
'2.создание массива для результатов
'3.один перебор 300 значений массива в словарь
'4.100 000 проверок массива на наличие в словаре и заполнение единицами массива результата
'5.выгрузка результатов

Sub compare()
Dim a, b, c, d, e, iLastrow As Long, i As Long
Dim tm: tm = Timer
'1.
With Sheet2 'используется кодовое имя
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
b = Range(.[A1], .Range("b" & iLastrow)).Value
'd = Range(.[B1], .Range("B" & iLastrow)).Value

End With

With Sheet1 'используется кодовое имя
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
a = Range(.[A1], .Range("b" & iLastrow)).Value
'e = Range(.[B1], .Range("B" & iLastrow)).Value

End With

'2.
ReDim c(1 To UBound(a), 1 To 1)

'3.
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(b)
            .Item(b(i, 1) & "|" & b(i, 2)) = CStr(1)
    Next

'4.
    For i = 1 To UBound(a)
      If .exists(a(i, 1) & "|" & a(i, 2)) Then c(i, 1) = 1
    Next
End With

'5.
With Sheet1 'используется кодовое имя
Range(.[C1], .Range("C" & iLastrow)).Value = c
End With

MsgBox Timer - tm 'окно с таймером, годная тема
End Sub

наверное уже в десятый раз этот макрос изменяю, хотя вроде всё подробно расписал в шапке.
 
Hugo, Лучший !! Спасибо )))
 
Hugo, Последний вопрос ! Попробовал сделать cравнения 4 столбцов, но ничего не выходит, посмотри, пожалуйста код )
Код
'Макросом -
'1.два диапазона в два массива
'2.создание массива для результатов
'3.один перебор 300 значений массива в словарь
'4.100 000 проверок массива на наличие в словаре и заполнение единицами массива результата
'5.выгрузка результатов
 
Sub compare()
    Dim a, b, c, d, e, iLastrow As Long, i As Long
    Dim tm: tm = Timer
    '1.
        With Лист2 'используется кодовое имя
                iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
                 b = Range(.[A2], .Range("d" & iLastrow)).Value
    
        End With
 
        With Лист1 'используется кодовое имя
                iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
                a = Range(.[A2], .Range("d" & iLastrow)).Value
 
        End With
 
'2.
            ReDim c(1 To UBound(a), 1 To 1)
 
'3.
         With CreateObject("Scripting.Dictionary")
                     For i = 1 To UBound(b) 
                    .Item(b(i, 1) & "|" & b(i, 2) & "|" & b(i, 3) & "|" & b(i, 4)) = CStr(1)
                Next
 
'4.
                    For i = 1 To UBound(a)
                    If .exists(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4)) Then c(i, 1) = 1
                Next
        End With
 
'5.
        With Лист1 'используется кодовое имя
            Range(.[F1], .Range("F" & iLastrow)).Value = c
        End With
 
MsgBox Timer - tm 'окно с таймером, годная тема
End Sub

Результат должен быть, напротив строки собака 2 2 2   должна быть единица.!
Изменено: chep-kep - 29.11.2018 18:10:04
 
Привет!
Код не изучал.
непредсказуемо использовать
Код
= Range
безопаснее
Код
= .Range
Сравнение прайсов, таблиц - без настроек
 
Цитата
Hugo написал:
наверное уже в десятый раз этот макрос изменяю
это не предел
Цитата
chep-kep написал:
сделать cравнения 4 столбцов
а вот и одиннадцатый... раз
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Не, 11-ый не буду :)
На словах - массивы берёте с 2-ой строки, а выгружаете в 1-ую - зачем???? Потому и мимо, потому и #Н/Д
Кстати, про Range и точку - как-то раз (уже сильно позже написания кода) как раз столкнулся  с тем, что как раз эта точка вызывала ошибку.
Хотя не факт что этот код тут появился в первоначальном виде, уже столько времени прошло...
Изменено: Hugo - 29.11.2018 19:09:40
 
Привет!
Наивный способ во вложении.
Изменено: Inexsu - 29.11.2018 23:08:55 (Небольшой рефакторинг)
Сравнение прайсов, таблиц - без настроек
Страницы: 1
Наверх