Определение времени выполнения макроса и сравнение времени работы циклов, суммирующих значения в диапазоне, в переменной диапазона и в массиве.
Время работы макроса
Определение времени выполнения макроса с использованием функции Timer:
Sub VremyaRabotyMakrosa() Dim t As Single t = Timer ———————— ‘код процедуры, время выполнения ‘которой необходимо определить ———————— t = Timer — t MsgBox t End Sub |
Обратите внимание, что небольшие процедуры (макросы) выполняются очень быстро, и результат будет равен 0. В этом случае будет более целесообразно применить функцию MicroTimer, которая использует вызовы Windows API для получения значений системного таймера высокого разрешения, встроенного в большинство процессоров.
Время работы циклов
Сравнение времени работы вложенных циклов For… Next, суммирующих одинаковые значения в диапазоне, в переменной диапазона и в массиве:
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 |
Sub VremyaRabotyMakrosov() Dim myRange As Range, myArray As Variant, i1 As Long, _ i2 As Long, i3 As Long, n As Double, t As Single ‘Определение времени работы вложенных циклов в диапазоне: t = Timer With Range(«A1:J30») For i1 = 1 To 1000 n = 0 For i2 = 1 To 30 For i3 = 1 To 10 n = n + .Cells(i2, i3) Next Next Next End With t = Timer — t Range(«A32») = «Время работы циклов в диапазоне:» Range(«F32») = t ‘Определение времени работы вложенных циклов в переменной диапазона: t = Timer Set myRange = Range(«A1:J30») With myRange For i1 = 1 To 1000 n = 0 For i2 = 1 To 30 For i3 = 1 To 10 n = n + .Cells(i2, i3) Next Next Next End With t = Timer — t ‘MsgBox t Range(«A33») = «Время работы циклов в переменной диапазона:» Range(«F33») = t ‘Определение времени работы вложенных циклов в массиве: t = Timer myArray = Range(«A1:J30») For i1 = 1 To 1000 n = 0 For i2 = 1 To 30 For i3 = 1 To 10 n = n + myArray(i2, i3) Next Next Next t = Timer — t ‘MsgBox t Range(«A34») = «Время работы циклов в массиве:» Range(«F34») = t End Sub |
Набор значений, который использовался для суммирования, и результаты определения времени работы вложенных циклов For… Next в диапазоне, в переменной диапазона и в массиве:
Время работы циклов в диапазоне и переменной диапазона часто совпадает, но не всегда. Это зависит от загруженности процессора в каждый момент времени. А вот массивы для работы с циклами имеют по времени неоспоримое преимущество.
What This VBA Code Does
There are various scenarios where you may want to calculate the time it takes for your VBA code to run. I often do this when trying to test various ways to code a procedure. I like to see which method gives me a faster run time. Below is some simple snippets you can add to the beginning and end of your VBA code to report out how long the procedure took to run.
Display Calculation In Seconds
Display Calculation In Minutes
For Bottleneck Testing
If you need a very specific timing mechanism to determine bottlenecks in your code, there is a VBA function that was written by Charles Williams called the MicroTimer. To learn more about this function, you can view the code here.
Using VBA Code Found On The Internet
Now that you’ve found some VBA code that could potentially solve your Excel automation problem, what do you do with it? If you don’t necessarily want to learn how to code VBA and are just looking for the fastest way to implement this code into your spreadsheet, I wrote an article (with video) that explains how to get the VBA code you’ve found running on your spreadsheet.
Getting Started Automating Excel
Are you new to VBA and not sure where to begin? Check out my quickstart guide to learning VBA. This article won’t overwhelm you with fancy coding jargon, as it provides you with a simplistic and straightforward approach to the basic things I wish I knew when trying to teach myself how to automate tasks in Excel with VBA Macros.
Also, if you haven’t checked out Excel’s latest automation feature called Power Query, I have put together a beginner’s guide for automating with Excel’s Power Query feature as well! This little-known built-in Excel feature allows you to merge and clean data automatically with little to no coding!
How Do I Modify This To Fit My Specific Needs?
Chances are this post did not give you the exact answer you were looking for. We all have different situations and it’s impossible to account for every particular need one might have. That’s why I want to share with you: My Guide to Getting the Solution to your Problems FAST! In this article, I explain the best strategies I have come up with over the years to get quick answers to complex problems in Excel, PowerPoint, VBA, you name it!
I highly recommend that you check this guide out before asking me or anyone else in the comments section to solve your specific problem. I can guarantee that 9 times out of 10, one of my strategies will get you the answer(s) you are needing faster than it will take me to get back to you with a possible solution. I try my best to help everyone out, but sometimes I don’t have time to fit everyone’s questions in (there never seem to be quite enough hours in the day!).
I wish you the best of luck and I hope this tutorial gets you heading in the right direction!
Chris
Founder, TheSpreadsheetGuru.com
Vadim-ok Пользователь Сообщений: 98 Excel-master |
С помощью какого кода, можно вычислить время выполнения макроса? |
Sub Worktime() |
|
Skif_79 Пользователь Сообщений: 56 |
А более детально можно расписать (на пальцах..) Имеется несколько макросов выполняющихся подряд. Хотелось бы фиксировать время исполнения каждого макроса (в минутах) с записыванием полученного значения в определенную строку на листе. |
vikttur Пользователь Сообщений: 47199 |
Уже написали. |
Skif_79 Пользователь Сообщений: 56 |
Спасибо, что ответили.., но могли бы Вы еще подсказать как ФИКСИРОВАТЬ результаты работы в строке листа ? |
Skif_79 Пользователь Сообщений: 56 |
Я имел в виду фиксировать время исполнения КАЖДОГО макроса в отдельной ячейки строки.. |
ikki Пользователь Сообщений: 9709 |
заведите глобальную переменную уровня модуля: в начале каждого макроса пишем: в конце: фрилансер Excel, VBA — контакты в профиле |
Skif_79 Пользователь Сообщений: 56 |
на каком нибудь простеньком примере (макросе) можете это расписать ? я не знаток макросов.. |
ikki Пользователь Сообщений: 9709 |
{quote}{login=skif}{date=20.08.2012 11:13}{thema=Re: }{post}я не знаток макросов.{/post}{/quote} фрилансер Excel, VBA — контакты в профиле |
Skif_79 Пользователь Сообщений: 56 |
На нет и суда нет.. Понимаю Вас ! |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
А ТС в теме так и не отписался… С 2010 года. Сейчас опять создает темы. Я сам — дурнее всякого примера! … |
Skif_79 Пользователь Сообщений: 56 |
ну так мне не обижаться или совесть иметь ?? как я написал уже, что ВСЕ понимаю.. и наличия времени.. и желания… Я очень благодарен разработчику сайта и умельцам, которые поддерживают его на «плаву». Нужное и полезное дело делают совместными усилиями. |
Skif_79 Пользователь Сообщений: 56 |
С моим вопросом я с горем пополам разобрался вроде бы. Не скажу, что полностью закрыл свои вопросы, но большую часть реализовал. И за такую помощь ОГРОМНАЯ БЛАГОДАРНОСТЬ ! |
Skif_79 Пользователь Сообщений: 56 |
Если я все верно понял, то простейшим макросом-примером будет следующий : Sub ОбщийЗапуск() макросы исполняются друг за другом, а в столбце А:А отображаются времена исполнения. |
ikki Пользователь Сообщений: 9709 |
ну в общем всё правильно. фрилансер Excel, VBA — контакты в профиле |
Skif_79 Пользователь Сообщений: 56 |
как Ваш андронный коллайдер ? Да. С Вашей помощью, все работает. Спасибо ! |
ikki Пользователь Сообщений: 9709 |
поменяйте местами — не cells(trow,1), а cells(1,trow) пс. форум по черным дырам сам оказался черной дырой. Планета лучше фрилансер Excel, VBA — контакты в профиле |
Skif_79 Пользователь Сообщений: 56 |
Учту. Спасибо ! Может для ОКОНЧАТЕЛЬНОГО уяснения так хоть их равномерно по листу можно распределить, чтоб сразу в глаза не бросались.. |
ran Пользователь Сообщений: 7091 |
#20 20.08.2012 17:44:30 cells(1,1),Range(«A1»),[A1] = a |
Как правильно определить время выполнения кода? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Время выполнения макроса
Всем привет Дела в VBA Хочу в процедурку вставить таймер, чтобы по окончании выполнения макроса вылетал alert «Затраченное время…мин…сек»
Или что-то в этом роде
3 ответа
267
04 марта 2004 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by WildAn
Всем привет Дела в VBA Хочу в процедурку вставить таймер, чтобы по окончании выполнения макроса вылетал alert «Затраченное время…мин…сек»
Или что-то в этом роде
Код:
Sub MySub
Dim tStart As Date, tFinish As Date
tStart = Now
…..
tFinish = Now
MsgBox «Time: » & Format(tFinish — tStart, «h:mm:ss»)
End Sub
258
04 марта 2004 года
SergeySV
1.5K / / 19.03.2003
можно еще в милисек. — это бывает нужно когда надо оценить скорость выполнения кусков кода, разница которых может быть небольшая в милисек, но при многократном повторении сам понимешь до чего вырастет
Public Declare Function timeGetTime Lib «winmm.dll» () As Long
‘ в начале кода
lTime = timeGetTime
….
тут код
….
MsgBox timeGetTime — lTime
267
04 марта 2004 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by SergeySV
можно еще в милисек. — это бывает нужно когда надо оценить скорость выполнения кусков кода, разница которых может быть небольшая в милисек, но при многократном повторении сам понимешь до чего вырастет
Public Declare Function timeGetTime Lib «winmm.dll» () As Long
‘ в начале кода
lTime = timeGetTime
….
тут код
….
MsgBox timeGetTime — lTime
А можно и без API:
Format(tFinish — tStart, «h:mm:ss.000»)