Хуже не будет, если укажете. EnableEvents - мне кажется всё равно будет работать. Попробуйте сделать Worksheets(1).delete - если выскочит уведомление об удаление листа, то значит События работают
Sub test1()
Dim i As Long
Dim Start As Single
Start = Timer
For i = 1 To 500000
Cells(i, 1) = i
Next i
MsgBox "Затрачено времени: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss"), vbInformation, "Конец"
End Sub
Код
Sub test2()
Dim i As Long
Dim Start As Single
Start = Timer
Application.Visible = False
For i = 1 To 500000
Cells(i, 1) = i
Next i
Application.Visible = True
MsgBox "Затрачено времени: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss"), vbInformation, "Конец"
End Sub
Код
Sub test3()
Dim i As Long
Dim Start As Single
Start = Timer
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
For i = 1 To 500000
Cells(i, 1) = i
Next i
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
MsgBox "Затрачено времени: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss"), vbInformation, "Конец"
End Sub
Вы бы объединили в один макрос, для удобства тестирования.
Скрытый текст
Код
Option Explicit
Sub test()
Dim i As Long
Dim Start As Single
Start = Timer
For i = 1 To 500000
Cells(i, 1) = i
Next i
Debug.Print "Затрачено времени, v1: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss")
Start = Timer
Application.Visible = False
For i = 1 To 500000
Cells(i, 1) = i
Next i
Application.Visible = True
Debug.Print "Затрачено времени, v2: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss")
Start = Timer
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
For i = 1 To 500000
Cells(i, 1) = i
Next i
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
Debug.Print "Затрачено времени, v3: " & Format((Timer - Start) / 24 / 60 / 60, "nn:ss")
End Sub
Затрачено времени, v1: 00:12 Затрачено времени, v2: 00:12 Затрачено времени, v3: 00:06
Не хочу, так как ТС новичок в VBA и ничего не поймёт из общего одного макроса и ТС не знает про Debug.Print и где его смотреть. Я не люблю для новичков писать сложные макросы, в которых они ничего не поймут. Если бы я писал код для вас, чтобы что-то обсудить с вами, то да. Всё логично. Но для новичка не подойдёт.
P.S. Тут постоянно приходят новички, выкладывают вот такой "урезанный/сокращённый" код и просят что-то в нём подправить и я понимаю, что какой-то профессионал с нашего форума его написал, но для ТС он вообще не понятен и он не может в нём разобраться и подправить самостоятельно код. Я стараюсь для новичков в VBA писать код более расширено и подробно, путь даже будет медленнее работать, но ТС сам сможет через месяц зайти в него и подправить под свои нужны. Чем быстро - но через месяц ТС придёт, выложит код на форум и скажет - а как тут поменять столбец в коде?
В чем сложность кода? В том, что я объединил три ваших отдельных макроса (который каждый нужно выполнять отдельно, затрачивая время хотевшему помочь специалисту) и поменял MsgBox на Debug.Print, что бы вручную не переписывать время? Новичкам надо учится, ну или платный раздел никто не закрывал.
New, сходу по кодам скажу, что третий, конечно же, лидер! Но в нем как раз не хватает того, что меня интересует - Application.Visible = False Тем не менее, да, оно влияет, но от ситуации к ситуации, например, если лист пустой, то .Calculation не нужен...
Ребят, спасибо за ответы
P.S. а вот это неверно
Цитата
New написал: ТС не знает про Debug.Print и где его смотреть.
New написал: Application.Visible = False есть во 2м коде (а в первом нет его), а время выполнения 1-го и 2-го кода одинаковое - какой вывод можно сделать?
Ну, и для новичков неплохо бы указать, что при правильном алгоритме занесения значений ячеек листа самый быстрый из трех предложенных вариантов можно ускорить еще раз в 20.