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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2011, 14:59   #1
Olya1985
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 113
По умолчанию макрос для сверки значений в двух столбцах

Помогите, пожалуйста исправить макрос так, чтобы ускорился процесс сверки значений из 2-ух столбцов. Макрос во вложении. Если в файле 5000 строк, то сейчас он работает очень долго.
Вложения
Тип файла: rar task.rar (171.2 Кб, 20 просмотров)
Olya1985 вне форума Ответить с цитированием
Старый 29.01.2011, 15:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Существенно быстрее будет так:
Код:
Sub check()
    Dim i As Long, x As Range, a(), b(), c(), d(), ws1 As Worksheet, ws2 As Worksheet
    Application.ScreenUpdating = False: Set ws1 = Sheets("Data"): Set ws2 = Sheets("Report")
    a = ws1.Range("B2:B" & ws1.Cells(Rows.Count, 2).End(xlUp).Row).Value
    b = ws1.Range("V2:V" & ws1.Cells(Rows.Count, 2).End(xlUp).Row).Value
    ReDim c(1 To UBound(a, 1), 1 To 1): ReDim d(1 To UBound(a, 1), 1 To 1)
    For i = 1 To UBound(a, 1)
        Set x = ws2.[A:A].Find(what:=a(i, 1), LookAt:=xlWhole)
        If Not x Is Nothing Then c(i, 1) = x.Offset(, 17)
        If b(i, 1) = c(i, 1) Then d(i, 1) = "TRUE" Else d(i, 1) = "FALSE"
    Next
    ws1.[W2].Resize(UBound(c, 1)).Value = c
    ws1.[X2].Resize(UBound(d, 1)).Value = d
End Sub
Пример во вложении.
Вложения
Тип файла: rar task_2.rar (170.6 Кб, 29 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 29.01.2011, 16:13   #3
Olya1985
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 113
По умолчанию

Спасибо!

еще одна небольшая проблемка возникла.

в строке 7 значения а = а, но почему то пишет false
Вложения
Тип файла: rar task_2.rar (169.0 Кб, 18 просмотров)
Olya1985 вне форума Ответить с цитированием
Старый 29.01.2011, 16:57   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

видите ли
а "а" не равно a "эй"
так же как и
с "эс" не равно c "си"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.01.2011, 17:12   #5
Olya1985
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 113
По умолчанию

теперь ясно в чем тут дело. спасибо!
Olya1985 вне форума Ответить с цитированием
Старый 29.01.2011, 17:16   #6
Olya1985
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 113
По умолчанию

подскажите, пожалуйста, а можно ли изменить скрипт таким образом, чтобы не делалось различий между а (эй) и русской а?
Olya1985 вне форума Ответить с цитированием
Старый 29.01.2011, 17:35   #7
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Легче(и правильней) поменять буквы на правильные. Выделяем диапазон и:
Код:
Sub ChangeEngRus_CcEeTOopPAaHKkXxBM()
    Dim c As Object
    Dim n As Integer, i As Integer, posChar As Integer
    Dim ToRusLang As Boolean
    Dim LineChars(1) As String * 72
    Dim Ch As String * 1
    Dim TempSelection As String
    LineChars(0) = "CcEeTOopPAaHKkXxBM"
    LineChars(1) = "СсЕеТОорРАаНКкХхВМ"
    For Each c In Selection.Cells
        TempSelection = c.Value
        ToRusLang = True
        For i = 1 To Len(TempSelection)
            Ch = Mid(TempSelection, i, 1)
            n = ToRusLang + 1
            posChar = InStr(LineChars(n), Ch)
            If posChar = 0 Then
                n = 0    'Abs(n - 1)
                posChar = InStr(LineChars(n), Ch)
            End If
            If posChar <> 0 Then
                Select Case n
                Case 0
                    ToRusLang = True
                Case 1
                    ToRusLang = False
                End Select
                Mid(TempSelection, i, 1) = Mid(LineChars(Abs(n - 1)), posChar, 1)
            End If
        Next
        c.Value = TempSelection
    Next c
    'Color_RUS_LAT
End Sub
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728

Последний раз редактировалось kuklp; 29.01.2011 в 17:50.
kuklp вне форума Ответить с цитированием
Старый 29.01.2011, 17:45   #8
Olya1985
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 113
По умолчанию

спасибо! а как он работает?
Olya1985 вне форума Ответить с цитированием
Старый 29.01.2011, 17:49   #9
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Он меняет все латинские(похожие на кириллические) буквы на русские.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение одинаковых значений в 2 столбцах jaguardark Microsoft Office Excel 22 06.09.2017 14:37
скрипт для сравнения чисел в двух столбцах Olya1985 Microsoft Office Excel 8 02.01.2011 01:58
Сравнение значений в 2х столбцах и удаление лишних значений.. Tyr Microsoft Office Excel 2 16.12.2010 18:19
Сопоставление данных в двух столбцах plasticman Microsoft Office Excel 4 12.03.2009 17:45
формула для сверки взаиморасчетов ZhukElena Microsoft Office Excel 6 03.09.2008 22:29