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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 12:35   #1
Oleg121
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 2
По умолчанию Сравнение больших столбцов

есть задача - 2 столбца с числами. требуется сравнить значения из 2-го столбца со значениями из первого, и если есть совпадение, то совпадающее значение из первого выделить цветом. макрос работает, но проблема в том, что столбцы очень большие (количество строк измеряется сотнями тысяч), из-за чего вычисление занимает много времени. есть ли какие-то другие алгоритмы сравнения, занимающие меньше времени? заранее спасибо за ответы.
мой макрос
PHP код:
For 1 To n
 
For 1 To m
   
If Cells(i1).Value Cells(j2).Value Then Cells(j1).Font.Color RGB(25500)
 
Next
Next 
Oleg121 вне форума Ответить с цитированием
Старый 15.05.2012, 12:43   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Зачем выделять цветом?
Основной тормоз будет именно в этом - хотя значительно этот код ускорить можно.
А если не красить, а отбирать - то даже не знаю, во сколько раз можно ускорить... раз в 1000...10000...1000000 вероятно.

P.S. Вот с покраской:

Код:
Sub compare()
    Dim a, i&
    Application.ScreenUpdating = False
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1

        a = Sheets(1).[a1].CurrentRegion.Value
        For i = 1 To UBound(a)
            .Item(a(i, 2)) = vbNullString
        Next
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then Cells(i, 1).Font.Color = RGB(255, 0, 0)
        Next

    End With
    Application.ScreenUpdating = True
End Sub
Можно покраску тоже ускорить - не красить сразу, а проставлять в созданный пустой массив под размер единицы в эти позиции.
Затем выгрузить массив рядом в свободный столбец, отфильтровать по единицам, сразу покрасить все видимые, убрать фильтр и единицы.
Реализовывать лениво
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.05.2012 в 13:06.
Hugo121 вне форума Ответить с цитированием
Старый 15.05.2012, 12:48   #3
Oleg121
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 2
По умолчанию

Каким образом отбирать? переносить в другое место? если можно с примером
Oleg121 вне форума Ответить с цитированием
Старый 15.05.2012, 12:49   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Условное форматирование может стоит попробовать?)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 15.05.2012, 13:01   #5
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Еще более простой способ.
A1=B1 будет истина или ложь.
данные - фильтр истина и выделяй, закрашивай и т.д.
Rom1k06 вне форума Ответить с цитированием
Старый 15.05.2012, 13:12   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Отбор в другое место:

Код:
Sub compare2()
    Dim a, i&, ii&
    Application.ScreenUpdating = False
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1

        a = Sheets(1).[a1].CurrentRegion.Value
        ReDim b(1 To UBound(a), 1 To 1)
        
        For i = 1 To UBound(a)
            .Item(a(i, 2)) = vbNullString
        Next
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
            ii = ii + 1
            b(ii, 1) = a(i, 1)
            End If
        Next

    End With
    [d1].Resize(ii, 1) = b
    Application.ScreenUpdating = True
End Sub
Отбирает с повторами - если повторы не нужны, то можно сразу после отбора числа удалять его из словаря. Тогда повторно не отберётся.

P.S. УФ или формулы на сотни тысяч?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух столбцов mGm Microsoft Office Excel 1 15.02.2012 21:39
Сравнение столбцов Exel lirik88 Microsoft Office Excel 4 10.11.2011 18:01
Направьте в нужное русло. Сравнение двух больших таблиц Excel hijke Microsoft Office Excel 6 05.05.2011 13:24
Сравнение столбцов sidanarchy Microsoft Office Excel 7 25.02.2011 09:24
Сравнение столбцов Nakrul Microsoft Office Excel 11 17.02.2011 16:12