Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613

Изменившиеся ячейки

23.09.2013, 11:40. Показов 2182. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Возникла такая проблема - есть лист excel, на нём порядка 120 000 записей. Каждый день, мне необходимо сравнить тот файл с предыдущим (каждый день новый делается). Накидал простенький макрос, который сверяет их, но он работает ужасно долго, запускал на 34 000 строк, ждал в районе получаса (примерно). Как можно ускорить этот процесс, может есть какой то способ проще проверить изменения в файле?
Всего два столбца там (первый статичный (id), второй меняется)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub mymacros()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
    
oldRow = Sheets(2).UsedRange.Row + Sheets(2).UsedRange.Rows.Count - 1 /Последняя заполненная ячейка на старом листе
newRow = Sheets(1).UsedRange.Row + Sheets(1).UsedRange.Rows.Count - 1 /Последняя заполненная ячейка на новом листе
For i = 1 To newRow
    curval = Sheets(1).Cells(i, 1) /берём данные id с нового листа
    For j = 1 To oldRow /прогоняем по старому листу
        If Sheets(2).Cells(j, 1) = curval Then /и ищем совпадения
            If Sheets(2).Cells(j, 2) <> Sheets(1).Cells(i, 2) Then /если id найден, и второй столбец у нового и старого различаются, то
                Sheets(3).Cells(i, 1) = Sheets(1).Cells(i, 1) /записываем изменения на третий лист
                Sheets(3).Cells(i, 2) = Sheets(1).Cells(i, 2) /записываем изменения на третий лист
                Exit For /выходим из цикла
            End If
        Exit For
        End If
    Next j
Next i
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
End Sub
знаю, код, наверное, не самый оптимальный, потому прошу помощь)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2013, 11:40
Ответы с готовыми решениями:

Как задать значение для ячейки в зависимости от значения другой ячейки
Здравствуйте! Подскажите, как задать значение для ячейки в зависимости от значения другой ячейки. Есть таблица с ячейками. Если значение...

Откорректировать макрос так, чтобы поиск осуществлялся не с ячейки А1, а с ячейки C21
Как в этом макросе прописать, чтобы поиск осуществлялся в столбике &quot;С&quot;, но с 21-ой строки? Sub asd() Dim c As Range Set c =...

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

31
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
23.09.2013, 13:56  [ТС]
Студворк — интернет-сервис помощи студентам
Те, которых нет... интересно. Надо думать, пока некритично (если карта с опред. номером перестанет существовать - пусть висит на сайте, её никто искать не будет). Ну а вообще спасибо, буду думать)
Выгрузить необязательно куда, это я могу и вручную, ну а вообще да)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
23.09.2013, 13:58
P.S. Да, а что там с нулями? Их автоматом сайт добавляет, или они вообще никому не сдались?
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
23.09.2013, 14:01
Цитата Сообщение от Hugo121 Посмотреть сообщение
если пара значений отличается от пары второго листа
либо ее не было на втором листе (2-старый лист, 1 - новый)
Цитата Сообщение от Hugo121 Посмотреть сообщение
то в третий лист именно в это место его и пишем
так же как в макросе ТС
Цитата Сообщение от sMockingbird Посмотреть сообщение
должно остаться только
18365 1455.54
56458 14.36
так и работает
1
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
23.09.2013, 14:06
Т.е. я вижу так в идеале - есть два csv и один vbs. Кликаем vbs - он спрашивает выбор файлов или молча (если имена постоянны) обрабатывает эта два исходных файла и генерит один небольшой результат. В котором только изменившиеся и новые записи.
Можно параллельно сгенерить ещё один файл с списком тех, кого больше нет - а сайт научить его принимать. но это не ко мне.
В смысле по сайту. Остальное могу сделать, когда вся работа закончится. Похоже что не на этой неделе... Вы напомните позже, если понадобится. Если конечно не будет уже другого приемлемого решения.
1
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
23.09.2013, 14:30  [ТС]
Hugo121, да я надеюсь, что это временное решение, потом мы автоматизируем это. Ну а пока всё норм работает, большое спасибо)
Step_UA, большое спасибо)
0
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
27.09.2013, 08:41  [ТС]
Step_UA, заметил, что не добавляет на третий лист значения, которых нету на старом листе. Как это можно исправить?
А то я в коде не совсем разобрался)
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
27.09.2013, 11:18
Может вы перпаутали расположение листов? Оставил согласно Вашему макросу: первый лист - новый, второй - старый.
Вложения
Тип файла: xls compare.xls (37.5 Кб, 4 просмотров)
1
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
27.09.2013, 11:23  [ТС]
Step_UA, спасибо.
По ходу что то напутал в старом файле)
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
27.09.2013, 11:26
Возможно анализировать будет удобней в случае выгрузки непрерывным списком ...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub New_and_Change()
  Dim Mas(), i&, Dic As Object, iCount&
    Mas = Sheets(2).UsedRange.Value
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.CompareMode = 1
    For i = 1 To UBound(Mas)
        Dic(Mas(i, 1)) = Mas(i, 2)
    Next
    Mas = Sheets(1).UsedRange.Value
    On Error Resume Next
    For i = 1 To UBound(Mas)
        If Dic(Mas(i, 1)) <> Mas(i, 2) Then
            iCount = iCount + 1
            Mas(iCount, 1) = Mas(i, 1): Mas(iCount, 2) = Mas(i, 2)
        End If
    Next
    If iCount Then
        Sheets(3).Cells(1, 1).Resize(iCount, 2).Value = Mas
    Else
        MsgBox "Новых или изменившихся значений не найдено"
    End If
End Sub
0
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
27.09.2013, 11:30  [ТС]
Step_UA, в смысле, непрерывным списком?
не совсем понял
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
27.09.2013, 11:35
Без пустых строк
1
284 / 283 / 73
Регистрация: 06.05.2013
Сообщений: 1,613
27.09.2013, 11:39  [ТС]
Step_UA, это да, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2013, 11:39

Макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В
Добрый день. Я написал макрос, который увеличивает значение ячейки А на 1 при изменении ячейки В, но почему то значение изменяется...

Макрос: Поиск совпадений, перенос совпавшей ячейки и рядом с ней стоящей ячейки
Доброго времени суток ! Прошу помощи с написанием макроса, очень очень очень выручите! Задача такова 1 - есть книга из 3х листов ( 1...

Изменения формата ячейки Excel средствами VBA в зависимости от значения другой ячейки
Здравствуйте. Столкнулся с проблемой. Необходимо на листе Excel Залить, предположим, ячейку &quot;C4&quot; Зелёным цветом, при условии,...

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

Редактирование ячейки и перенос значения ячейки через форму
Доброго времени суток люди) Помогите чем сможете, всю голову уже изломали. Сначала хотели кнопку с формой поиск на втором листе сделать по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru