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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 16:59   #1
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию Как сравнить столбцы с разными количествами строк в EXCEL 2007 ?

Здравствуйте. Совсем запутался, как сделать.
"ВСЕ" - хранятся верные и неверные заказы
"Верные" - у этих клиентов все хорошо с заказом
"Не верные" - у этих клиентов не хорошо с заказом (например, не выполнен)
Необходимо: Сравнить "ДАТУ ЗАКАЗА" с "№" в колонке ВСЕ и "ДАТУ ЗАКАЗА" с "№" в колонке ВЕРНЫЕ. А в колонку НЕ ВЕРНЫЕ вывести те заказы которые не совпадают.
ЛИБО в колонке "ВСЕ" выделить красным несовпадения.

НАПРИМЕР. В колонке "ВСЕ" Дата заказа: 30.01.2013 и № 214134 отсутствует в "ВЕРНЫЕ". Значит мы их красим красным (следовательно они не верные т.е. не ВЫПОЛНЕНЫ!)
Вот необходимо их найти.

P.s. Можно было сделать вычитание ,то есть например если 214054 - 214054, то в колонку С пишется 0. А когда попадает несовпадение, то в колонке С появится результат вычитания. Ну и копировать - вставить. Но Хотелось бы автоматизировать этот процесс.
Заранее спасибо!
Вложения
Тип файла: rar Test.rar (10.1 Кб, 11 просмотров)
lutdan вне форума Ответить с цитированием
Старый 06.02.2013, 17:40   #2
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Только вчера рассматривали такой пример:

Код:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub sravnenie()
Dim a, b, i&, u, t, isect As Range
If MsgBox("Произвести сравнение?", 32 & vbYesNo, "ПОДТВЕРЖДЕНИЕ") = vbNo Then Exit Sub
t = GetTickCount
Application.ScreenUpdating = False
Range("A3:C" & Cells(Rows.Count, 1).End(xlUp).Row).Interior.ColorIndex = xlNone
    a = Range("E1:G" & Cells(Rows.Count, 5).End(xlUp).Row).Value
With CreateObject("Scripting.Dictionary")
    For i = 3 To UBound(a)
        '.Item(a(i, 1)) = .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
         .Item(Join(Array(a(i, 1), a(i, 2), a(i, 3)), "|")) = Empty
    Next i

    a = Range("A1:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    ReDim b(1 To UBound(a), 1 To 1)
    For i = 3 To UBound(a)
    u = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3)
        If Not .Exists(u) Then b(i, 1) = 1
    Next i
End With
Range("D1").Resize(UBound(b), 1).Value = b

On Error GoTo MyError
Set isect = Intersect(Range("A1:D" & UBound(b)), Range("D1:D" & UBound(b)).SpecialCells(xlCellTypeConstants).EntireRow)
If Not isect Is Nothing Then isect.Interior.ColorIndex = 37
    Range("D3:D" & UBound(b)).Interior.ColorIndex = xlNone
    Range("D3:D" & UBound(b)).ClearContents
    Exit Sub
    Application.ScreenUpdating = True
    Debug.Print (GetTickCount - t) / 1000
MyError:
    MsgBox "Совпадения не найдено.", vbInformation, "ГОТОВО"
    Application.ScreenUpdating = True
    Debug.Print (GetTickCount - t) / 1000
End Sub
Пробуйте
Вложения
Тип файла: rar Test (lutdan).rar (14.4 Кб, 10 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.02.2013, 17:48   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

см. вложение
Вложения
Тип файла: rar Test.rar (9.9 Кб, 14 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 06.02.2013, 17:54   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

1. Третий столбец ТС не интересует, т.е. в словарь собирать можно только значения двух ячеек.
2. я бы сразу объявил массив b() в 3 столбца, и сразу в него копировал значения строк из a(), которые не нашлись в словаре (двигая индекс по заполнении).
ну и его (по индексу заполненную верхушку) и выгрузил в третий диапазон.
Т.е. без всякой покраски сразу отбирал "неверных".
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 06.02.2013, 18:50   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
1. Третий столбец ТС не интересует, т.е. в словарь собирать можно только значения двух ячеек.
2. я бы сразу объявил массив b() в 3 столбца, и сразу в него копировал значения строк из a(), которые не нашлись в словаре (двигая индекс по заполнении).
ну и его (по индексу заполненную верхушку) и выгрузил в третий диапазон.
Т.е. без всякой покраски сразу отбирал "неверных".
Так?:
Код:
Sub sravnenie2()
Dim a, b, i&, n&, t
If MsgBox("Произвести сравнение?", 32 & vbYesNo, "ПОДТВЕРЖДЕНИЕ") = vbNo Then Exit Sub
t = GetTickCount
    Range("I3:K" & Cells(Rows.Count, 9).End(xlUp).Row).ClearContents
    a = Range("E3:G" & Cells(Rows.Count, 5).End(xlUp).Row).Value
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(a)
         .Item(Join(Array(a(i, 1), a(i, 2)), "|")) = Empty
    Next i

    a = Range("A3:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    ReDim b(1 To UBound(a), 1 To 3)
    For i = 1 To UBound(a)
        If Not .Exists(a(i, 1) & "|" & a(i, 2)) Then
            n = n + 1
            b(n, 1) = a(i, 1)
            b(n, 2) = a(i, 2)
            b(n, 3) = a(i, 3)
        End If
    Next i
End With

Range("I3").Resize(n, 3).Value = b
If n = 0 Then MsgBox "Совпадения не найдено.", vbInformation, "ГОТОВО"
Debug.Print (GetTickCount - t) / 1000
End Sub
Вложения
Тип файла: rar Test (lutdan).rar (19.7 Кб, 13 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.02.2013, 19:15   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Алгоритм такой (ячейки не вычитывал). Есть одно замечание - если n=0, то будет ошибка при выгрузке массива.
Т.е. сперва проверяем n, затем или выгрузка, или Msgbox.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.02.2013, 09:50   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Алгоритм такой (ячейки не вычитывал). Есть одно замечание - если n=0, то будет ошибка при выгрузке массива.
Т.е. сперва проверяем n, затем или выгрузка, или Msgbox.
Ошибки не вылазило, но правильнее сделать как вы говорили:

Код:
Sub sravnenie2()
Dim a, b, i&, n&, t
If MsgBox("Произвести сравнение?", 32 & vbYesNo, "ПОДТВЕРЖДЕНИЕ") = vbNo Then Exit Sub
t = GetTickCount
    Range("I3:K" & Cells(Rows.Count, 9).End(xlUp).Row).ClearContents
    a = Range("E3:G" & Cells(Rows.Count, 5).End(xlUp).Row).Value
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(a)
         .Item(Join(Array(a(i, 1), a(i, 2)), "|")) = Empty
    Next i

    a = Range("A3:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    ReDim b(1 To UBound(a), 1 To 3)
    For i = 1 To UBound(a)
        If Not .Exists(a(i, 1) & "|" & a(i, 2)) Then
            n = n + 1
            b(n, 1) = a(i, 1)
            b(n, 2) = a(i, 2)
            b(n, 3) = a(i, 3)
        End If
    Next i
End With

If n = 0 Then
    MsgBox "Совпадения не найдено.", vbInformation, "ГОТОВО"
Else
    Range("I3").Resize(n, 3).Value = b
End If
Debug.Print (GetTickCount - t) / 1000
End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 07.02.2013, 10:26   #8
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Спасибо Всем!!!

Макрос staniiislav'a работает. Я и не ожидал такого результата .. гениально!

Последний вопрос: staniiislav так использовать лучше последний Ваш код (Сообщение #7)?
lutdan вне форума Ответить с цитированием
Старый 07.02.2013, 10:39   #9
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от lutdan Посмотреть сообщение
Спасибо Всем!!!

Макрос staniiislav'a работает. Я и не ожидал такого результата .. гениально!

Последний вопрос: staniiislav так использовать лучше последний Ваш код (Сообщение #7)?
Держите пример
Запуск макроса по нажатию на кнопку (Сравнение2)

А можно вопрос. Чем Вам пример IgorGO не понравился? Он же вообще без макросов сделал?

Добавлено позже:

Имейте ввиду, что если вы будете добавлять или удалять столбцы в файле, в макросе нужно будет так же менять ссылки на другие столбцы!
Вложения
Тип файла: rar Test (lutdan).rar (17.4 Кб, 12 просмотров)
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 07.02.2013 в 10:42.
staniiislav вне форума Ответить с цитированием
Старый 11.02.2013, 09:59   #10
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

staniiislav Да оба способа хороши.
Всем спасибо! Тему можно закрыть
lutdan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрет детализации избранных строк в сводной таблице Excel 2007 Daren Microsoft Office Excel 0 10.02.2011 06:35
как же все таки сравнить содержимое двух строк? LOST94 Общие вопросы C/C++ 7 23.03.2010 14:52
Excel 2007 автоматическое удаление старых строк при потоковом поступлении новых Swindler_1 Microsoft Office Access 5 17.03.2010 21:30
Excel 2007 автоматическое удаление старых строк при потоковом поступлении новых Swindler_1 Microsoft Office Excel 35 15.03.2010 15:55
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47