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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2011, 23:47   #1
derlysh
Пользователь
 
Регистрация: 18.07.2011
Сообщений: 15
По умолчанию Сравнение двух таблиц выделение совпадающих ячеек

Помогите плиззз
Нужен макрос для сравнение двух таблиц, выделение совпадающих ячеек (совпадение должно быть полностью) и их сортировка т.е. на совпадение по ячейкам
в ячейках есть цифры,буквы и цифры так же цифры со звездочкой впереди

пример:

*00153679
*00153679
00004501/12
00004501/12
0701041000-011
0701041000-011
0701041000-015
7802-754
7802-761
7802-761
7802-762
ОХ2657
ОХ2657
ОХ2660
ОХ2660
ОХ2661
ОХ2661
Вложения
Тип файла: rar Сравнение.rar (421.2 Кб, 41 просмотров)

Последний раз редактировалось derlysh; 28.09.2011 в 23:55. Причина: Прикрепил нето вложение
derlysh вне форума Ответить с цитированием
Старый 29.09.2011, 00:26   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А повторы зачем?
И вообще - зачем ВЫДЕЛЕНИЕ?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 29.09.2011 в 00:37.
Hugo121 вне форума Ответить с цитированием
Старый 29.09.2011, 00:42   #3
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Вот такая картина почучается,это правильно определены совпадения совпадения.Их около 30 тысяч.Могу написать макрос.но только уже завтра

файл1.............................. ..............Файл2
A2 0701100000-135..................A26001 0701100000-135
A2 0701100000-135..................A26002 0701100000-135
A3 0701101000-636..................A26045 0701101000-636
A3 0701101000-636..................A26046 0701101000-636
A4 0701101000-644..................A26049 0701101000-644
A4 0701101000-644..................A26050 0701101000-644
A5 0701037005-271..................A20914 0701037005-271
A5 0701037005-271..................A20915 0701037005-271
A6 0701001256-016..................A7669 0701001256-016
A6 0701001256-016..................A7670 0701001256-016
A7 0701001256-019..................A7675 0701001256-019
A7 0701001256-019..................A7676 0701001256-019
A8 0701001288-016..................A7741 0701001288-016
A8 0701001288-016..................A7742 0701001288-016
A9 0701098001-437..................A25262 0701098001-437
A9 0701098001-437..................A25263 0701098001-437
A10 0701098001-439.................A25264 0701098001-439
A10 0701098001-439.................A25265 0701098001-439
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 29.09.2011, 00:42   #4
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Тупо в лоб. Обе книги должны быть открыты.
Загоняем обе в массивы. Потом первый массив в словарь и проверяем второй на совпадения. В случае совпадения выделяем цветом
Код:
Sub QWERTY()
Dim W1 As Workbook
Dim W2 As Workbook
Set W1 = Application.Workbooks("1.xlsm")
Set W2 = Application.Workbooks("2.xlsm")
Dim M1()
Dim M2()

Dim LR1
Dim LR2
ReDim R1(1, 0)
ReDim R2(1, 0)

Dim Dict As Object
Set Dict = CreateObject("Scripting.Dictionary")

LR1 = W1.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
LR2 = W2.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
W1.Activate
With W1.Sheets(1).Select
M1 = Range(Cells(1, 1), Cells(LR1, 1)).Value
End With
W2.Activate
M2 = Range(Cells(1, 1), Cells(LR2, 1)).Value
'загоняем в словарь первый лист
With Dict
    For i = 1 To UBound(M1)
        If Not .Exists(M1(i, 1)) Then
           .Add M1(i, 1), 1
        End If
    Next i
'ищем совпадения во втором и выделяем цветом
    For i = 1 To UBound(M2)
      If .Exists(M2(i, 1)) Then
      Cells(i, 1).Interior.Color = RGB(255, 255, 0)
      End If
    Next i
End With

Dict.RemoveAll
W1.Activate
'загоняем в словарь второй лист
With Dict
    For i = 1 To UBound(M2)
        If Not .Exists(M2(i, 1)) Then
           .Add M2(i, 1), 1
        End If
    Next i
'ищем совпадения в первом и выделяем цветом
    For i = 1 To UBound(M1)
      If .Exists(M1(i, 1)) Then
      Cells(i, 1).Interior.Color = RGB(255, 255, 0)
      End If
    Next i
End With

End Sub
сортировку не делал - проще сделать средствами ексела
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru

Последний раз редактировалось alex77755; 29.09.2011 в 01:22. Причина: Добавил выделение в первом файле
alex77755 вне форума Ответить с цитированием
Старый 29.09.2011, 08:52   #5
derlysh
Пользователь
 
Регистрация: 18.07.2011
Сообщений: 15
По умолчанию

doober -да именно так нужно
derlysh вне форума Ответить с цитированием
Старый 29.09.2011, 09:25   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Цитата:
Сообщение от derlysh Посмотреть сообщение
doober -да именно так нужно
- а ведь сперва нужно было выделить...
И непонятно, зачем рядом два одинаковых столбца выводить - хватило бы и одного.
Повторы тоже непонятно зачем - может рядом с номером писать количество повторов (если оно нужно) - так имхо практичнее.
Как я вижу - делаем по алгоритму alex77755, только в Item первого (и единственного) словаря собираем количество повторов.
Потом проверяем второй массив по словарю, и найденные копируем в третий массив, рядом пишем счётчик "нахождений" (ну или просто копируем столько раз, сколько нашлось). В Item счётчик каждый раз уменьшаем.
В конце итоговый массив выгружаем. Если нужно получить как в примере doober - два раза рядом
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 29.09.2011, 10:21   #7
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Считать повторы, вроде не стояла задача?
Два словаря чтобы выделить взаимное совпадение в обоих списках
Добавил массив совпадений. Выводится на лист2
Вложения
Тип файла: rar 33.rar (1.38 Мб, 40 просмотров)
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 29.09.2011, 10:30   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Считать не стояла, но если то, что показал doober - good, то нужно считать
Как иначе сделать на словаре, если в одном списке допустим 7802-761 три раза, а вдругом два?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 29.09.2011, 10:40   #9
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Ещё можно на всякий случай добавить строчки для очистки выделения
Код:
W1.Activate
Sheets(1).Select
    Columns("A:A").Interior.Pattern = xlNone ' добавить
LR1 = W1.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
M1 = Range(Cells(1, 1), Cells(LR1, 1)).Value
W2.Activate
Sheets(1).Select
    Columns("A:A").Interior.Pattern = xlNone' добавить
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 29.09.2011, 11:10   #10
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Добавил и подсчёт повторов на 2 листе. На 1 оказались все уникальные.
5 сек работает код
Код:
Sub QWERTY()
Dim W1 As Workbook
Dim W2 As Workbook
Set W1 = Application.Workbooks("1.xlsm")
Set W2 = Application.Workbooks("2.xlsm")
Dim M1()
Dim M2()
Dim R()
ReDim R(1 To 4, 0)
R(1, 0) = "Файл 1"
R(2, 0) = "Файл 2"
R(3, 0) = "Значение"
R(4, 0) =  "№ Дубля в 2""
Dim t
t = Time
Dim LR1
Dim LR2

Dim Dict As Object
Dim Dict2 As Object
Set Dict = CreateObject("Scripting.Dictionary")
Set Dict2 = CreateObject("Scripting.Dictionary")
W1.Activate
Sheets(1).Select
    Columns("A:A").Interior.Pattern = xlNone
LR1 = W1.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
M1 = Range(Cells(1, 1), Cells(LR1, 1)).Value
W2.Activate
Sheets(1).Select
    Columns("A:A").Interior.Pattern = xlNone
LR2 = W2.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
M2 = Range(Cells(1, 1), Cells(LR2, 1)).Value
'загоняем в словарь первый лист
With Dict
    For i = 1 To UBound(M1)
        If Dict2.Exists(M1(i, 1)) Then
          Dict2.Item(M1(i, 1)) = Dict2.Item(M1(i, 1)) + 1
        End If
    
        If Not .Exists(M1(i, 1)) Then
           .Add M1(i, 1), "A" & i
        End If
    Next i
'ищем совпадения во втором и выделяем цветом
    For i = 1 To UBound(M2)
        If Dict2.Exists(M2(i, 1)) Then
          Dict2.Item(M2(i, 1)) = Dict2.Item(M2(i, 1)) + 1
          Else
          Dict2.Add M2(i, 1), 1
        End If
        
      If .Exists(M2(i, 1)) Then
     Cells(i, 1).Interior.Color = RGB(255, 255, 0)
     ReDim Preserve R(1 To 4, UBound(R, 2) + 1)
      R(1, UBound(R, 2)) = .Item(M2(i, 1))
       R(2, UBound(R, 2)) = "A" & i
        R(3, UBound(R, 2)) = M2(i, 1)
        R(4, UBound(R, 2)) = Dict2.Item(M2(i, 1))
      End If
    Next i
End With

Dict.RemoveAll
W1.Activate
'загоняем в словарь второй лист
With Dict
    For i = 1 To UBound(M2)
        If Not .Exists(M2(i, 1)) Then
           .Add M2(i, 1), 1
        End If
    Next i
'ищем совпадения в первом и выделяем цветом
    For i = 1 To UBound(M1)
      If .Exists(M1(i, 1)) Then
      Cells(i, 1).Interior.Color = RGB(255, 255, 0)
      End If
    Next i
End With
Sheets(2).Select
Cells.ClearContents
Sheets(2).Cells.Cells.ClearContents
Range("A1:D" & UBound(R, 2)).Value = Application.Transpose(R)
MsgBox Format(Time - t, "hh:nn:ss")
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru

Последний раз редактировалось alex77755; 29.09.2011 в 11:20.
alex77755 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух таблиц w00t Microsoft Office Excel 5 16.03.2012 00:22
Сравнение 2-х ячеек, выделение цветом пустой Alex5667 Microsoft Office Excel 3 07.10.2011 15:06
Сравнение ячеек из разных таблиц pechenushka_xxx Microsoft Office Excel 4 28.01.2011 10:19
сравнение двух таблиц Iskin Microsoft Office Excel 3 08.12.2010 07:18
Сравнение двух таблиц scaramangi Microsoft Office Excel 0 17.09.2009 17:15