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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2009, 18:00   #1
Neo007
Пользователь
 
Регистрация: 09.09.2008
Сообщений: 43
Вопрос Как ускорить работу этого макроса?

Подскажите, пожалуйста, как ускорить (оптимизировать) работу этого макроса? Строк около 5500 шт. обрабатывает в течение 5 минут. В кратце: Два листа, формат обоих один и тотже. Содержат в себе базу данных по ценам ежемесячно со столбца 12 по 23 (критерий j). Первый лист - один период, второй лист - другой. Задача макроса выявить в каких месяцах расхождения в той или иной строчках.

Sub Compare()
Dim c As String, irow As Integer, d As Single, e As Single

For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "Z").End(xlUp).Row
c = Sheets("Sheet1").Cells(i, "Z")

With Sheets("Sheet2").Range("Z:Z")

Set z = .Find(c, LookIn:=xlValues)

If z Is Nothing Then
Sheets("Sheet1").Range("A" & i & ":X" & i & "").Font.ColorIndex = 3
Sheets("Sheet1").Cells(i, "Y") = "Не найден"
Else
irow = z.Row
End If
End With
For j = 12 To 23 'Месяца с Января по Декабрь
d = Sheets("Sheet1").Cells(i, j)
e = Sheets("Sheet2").Cells(irow, j)
If d = e Then
Sheets("Sheet1").Cells(i, j).Font.ColorIndex = 10
Sheets("Sheet2").Cells(irow, j).Font.ColorIndex = 10
Else
Sheets("Sheet1").Cells(i, j).Font.ColorIndex = 3
Sheets("Sheet1").Cells(i, j).AddComment
Sheets("Sheet1").Cells(i, j).Comment.Text Text:="Стало " & e & ""
Sheets("Sheet2").Cells(irow, j).Font.ColorIndex = 3
Sheets("Sheet2").Cells(irow, j).AddComment
Sheets("Sheet2").Cells(irow, j).Comment.Text Text:="Было " & d & ""
End If
Next

Sheets("Sheet1").Cells(i, "AA").Font.ColorIndex = 10
Sheets("Sheet2").Cells(irow, "AA").Font.ColorIndex = 10
Next
End Sub
Neo007 вне форума Ответить с цитированием
Старый 22.06.2009, 18:14   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Немного ускорит код добавление этой строки в начало макроса:
Application.ScreenUpdating = False

Ускорить можно - до 2-4 секунд. Но сложно. В этом случае код надо переписывать с нуля.

Почему 2-4 секунды, а не 1? Потому что, если значения и цвета мы можем записать одновременно в целый диапазон ячеек, то комментарии придётся добавлять в каждую ячейки по отдельности.
  • Во-первых, поиск производим не на листах, а в массивах (для этого потребуется считать значения ячеек в массив)
  • Цвет шрифта у ячеек не меняем сразу, а формируем некий диапазон, подлежащий закрашиванию. Как только все условия будут проверены (и диапазон сформирован), красим все ячейки одной командой.
  • Запись в столбец Y производим не по одной ячейке, а переносим заранее составленный массив в этот диапазон

Пример кода писать не буду - это долго, да и сложно сделать, не увидев файла.
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
помогите ускорить работу программы... Pashtet Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2008 22:12
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16
Защита листа, отключает работу макроса valerij Microsoft Office Excel 6 30.03.2008 22:22
Помогите пожалуйста ускорить работу по реконструкции моста Геодезистка Помощь студентам 10 07.10.2007 00:05