Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 18

Бесконечная работа макроса при объемах больше 100 000 строк

31.07.2013, 17:41. Показов 5674. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, доброго времени суток.
Есть проблема с макросом, макрос сравнивает первый выбранный файл со следующими двумя выбранными файлами. Результатом являются строки из файла1 которых нет ни файле2 ни в файле3. Проблема в том, что на маленьких объемах(до 10 000 строк) отрабатывает нормально и корректно(хотя иногда и долго минут 15-20). Но если количество строк заваливает за 100 000 то макрос работает бесконечно не выдавая результата. Пробовал оставить на ночь результата не. Нужна помощь в диагностике проблемы, собственно сам код:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Sub Compare3Files()
Dim myName As String, wB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ПЕРВЫЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName: Set wB = Workbooks(ActiveWorkbook.Name)
 
Dim myName1 As String, wB1 As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ВТОРОЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName1 = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName1: Set wB1 = Workbooks(ActiveWorkbook.Name)
 
Dim myName2 As String, wB2 As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите ТРЕТИЙ файл для сравнения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
myName1 = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=myName1: Set wB2 = Workbooks(ActiveWorkbook.Name)
 
Dim SaveFile As String, sB As Workbook
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Выберите файл для сохранения"
.Show
If .SelectedItems.Count = 0 Then Exit Sub
SaveFile = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Workbooks.Open Filename:=SaveFile: Set sB = Workbooks(ActiveWorkbook.Name)
 
Dim i As Long, j As Long, k As Long, Flag As Boolean
 
i = 1: k = 1
Do While wB.Worksheets(1).Cells(i, 1) <> ""
' Проверяем в 1 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
   j = 1: n = 1: Flag1 = False: Flag2 = False ' Flag - это признак, что запись из Файла1 есть или нет в Файле2.
   
   Do While wB1.Worksheets(1).Cells(j, 1) <> ""
   ' Проверяем во 2 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
       If wB.Worksheets(1).Cells(i, 1) = wB1.Worksheets(1).Cells(j, 1) Then Flag1 = True
       ' Нашли запись из Файла1 в Файле2, устанавливаем Flag в True
       j = j + 1
   Loop
   Do While wB2.Worksheets(1).Cells(n, 1) <> ""
   ' Проверяем во 2 файле на 1 листе строки 1-го столбца, от 1 до пустой, то есть до конца таблицы.
       If wB.Worksheets(1).Cells(i, 1) = wB2.Worksheets(1).Cells(n, 1) Then Flag2 = True
       ' Нашли запись из Файла1 в Файле3, устанавливаем Flag в True
       n = n + 1
   Loop
   
   If Flag1 = False And Flag2 = False Then ' Если запись из Файла1 не встретилась в файле1 и файле2, то
       sB.Worksheets(1).Range(Cells(k, 1), Cells(k, 10)).Value = wB.Worksheets(1).Range(Cells(i, 1), Cells(i, 10)).Value
       ' Записываем ее в Файл3
       k = k + 1 ' Переходим на следующую строчку в Файле3
   End If
  i = i + 1
Loop
MsgBox "Выполнение сравнения законченно успешно"
End Sub
Буду очень признателен за помощь, в VBA не профи, сам не разберусь.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2013, 17:41
Ответы с готовыми решениями:

Работа макроса при добавлении/удалении строк
Добрый день уважаемые! Столкнулся с такой проблемой. В книге были реализованы макросы. Но после добавления строк все улетело в трубу. ...

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

Найти вероятность, что при случайном выборе 200 000 чисел из первого и 100 000 чисел из второго, будет n совпадающих
Доброго времени суток! Помогите решить задачку... Уже всю голову сломал... Есть два ряда не повторяющихся чисел: в одном 1 000 000...

44
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.08.2013, 11:51
Студворк — интернет-сервис помощи студентам
Если два кода работают ~ одно время, тогда нужно определяться по их длине Интересная ветка получилась.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.08.2013, 12:18
Ага, значит мой можно ускорить на половину - не экономить память, сразу один раз открыть первый файл, взять в один массив все данные и держать их там всё время, из него в конце и копировать.
А не открывать файл ещё раз.
Кстати, заметил сейчас, что в том коде забыл в начале убить ненужный массив a(). Собирался, но забыл - так должна была чуть освободится память (основной вопрос ведь был чтоб не висло при огромных объёмах).
В моём варианте плюс ещё в том, что сравнивать можно хоть с тысячей файлов без изменения кода - на работоспособность влиять не должно.
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
02.08.2013, 12:28
Я, благодаря Вам, Hugo, работаю с словарями где надо и где не надо. Нравится.. И легко, и понятно.
0
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 18
02.08.2013, 12:46  [ТС]
Благодаря Hugo и KoGG, я оптимизировал все свои макросы и теперь ни работают несколько секунд, вместо десятка минут. Спасибо Вам товарищи, благое
дело делае
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.08.2013, 12:48
Да в 80% задач словари как раз как родные. А массивы в 90%
В смысле тех задач, которые задают на форумах. Всегда нужно что-то сравнить, отобрать, суммировать по уникальным...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2013, 12:48

Ниболее быстрый способ работы с файлом Excel (более 100 000 строк) Java
Добрый вечер друзья! В С# есть такая команда, которая одним махом кидает весь лист в двумерный массив(неопределенного типа), можете...

Не корректная работа макроса удаления строк
Доброго дня Всем В книге есть макрос удаляющий строки если значение в ячейке столбца D равно нулю. Макрос работает правильно если в...

КА Разработчик СУБД Oracle (Москва) (70 000 - 100 000 net)
В штат крупной IT компании открыта позиция &quot;Разработчик СУБД Oracle&quot; Задачи: Разработка структуры базы данных Oracle и ее...

Администратор Ms SQL 100 000 - 120 000 т.р. net Москва
Обязанности: Поддержка и построение решений на базе SQL Server. Оптимизация производительности. Повышение отказоустойчивости систем. ...

Ищем Гуру С++ от 80 000 до 100 000 руб., Санкт-Петербург
В Си Проект создаются современные автоматизированные системы и программное обеспечение для коммерческих и государственных заказчиков....


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru