Объясните почему долго работает макрос в Excel?

программирование excel VBA

Существует увесистая табличка, около 7000 строк, для неё выполняется следующий код. Почему он работает 2 минуты и более?

Sub Reload_Lists()
Dim i, j, l As Integer
i = 3
j = 2
With Worksheets("Без адресов")
While .Cells(i, 3).Value <> ""
If .Cells(i, 3).Font.Bold Then
.Cells(j, 2).AutoFill Destination:=.Range("B" & j, "B" & i), Type:=xlFillDefault
.Cells(i, 2).Value = .Cells(i, 3).Value
j = i
End If
i = i + 1
Wend
.Cells(j, 2).AutoFill Destination:=.Range("B" & j, "B" & i - 1), Type:=xlFillDefault
.Cells(3, 1).FormulaLocal = "=СЦЕПИТЬ(B3" & Chr(59) & "D3)"
.Cells(3, 1).AutoFill Destination:=.Range("A3", "A" & i - 1), Type:=xlFillDefault
End With
i = 4
j = 2
l = 2
With Worksheets("С адресами")
While .Cells(i, 4).Value <> ""
If .Cells(i, 4).Font.Bold And .Cells(i + 1, 4).Font.Bold Then
.Cells(j, 2).AutoFill Destination:=.Range("B" & j, "B" & i), Type:=xlFillDefault
.Cells(i, 2).Value = .Cells(i, 4).Value
.Cells(l, 3).AutoFill Destination:=.Range("C" & l, "C" & i - 1), Type:=xlFillDefault
.Cells(i + 1, 3).Value = .Cells(i + 1, 4).Value
j = i
l = i + 1
Else
If .Cells(i, 4).Font.Bold And Not .Cells(i - 1, 4).Font.Bold Then
.Cells(l, 3).AutoFill Destination:=.Range("C" & l, "C" & i - 1), Type:=xlFillDefault
.Cells(i, 3).Value = .Cells(i, 4).Value
l = i
End If
End If
i = i + 1
Wend
.Cells(j, 2).AutoFill Destination:=.Range("B" & j, "B" & i - 1), Type:=xlFillDefault
.Cells(l, 3).AutoFill Destination:=.Range("C" & l, "C" & i - 1), Type:=xlFillDefault
.Cells(4, 1).FormulaLocal = "=СЦЕПИТЬ(B4" & Chr(59) & "C4" & Chr(59) & "E4)"
.Cells(4, 1).AutoFill Destination:=.Range("A4", "A" & i - 1), Type:=xlFillDefault
End With
Creating_Top_20_List
End Sub

Примечание:
Creating_Top_20_List закомментирован

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

Примечание:
так, я наврал. 1000 строк
Ответы:
ну 7000 строк это уже не мало для макроса, тем более, что ты их обходишь все поочередно.
попробуй вначале отключить прорисовку экрана. Т.к. после ввода формулы ".. .Cells(3, 1).FormulaLocal = "=СЦЕПИТЬ(B3" & Chr(59) & "D3)"..." ексель перерисовывает экран (т.е. все 7000 строк) после изменения каждой строки
добавь в начале Application.ScreenUpdating = false
и не забудь в конце Application.ScreenUpdating = true


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.