Excel vba время выполнения макроса

Определение времени выполнения макроса и сравнение времени работы циклов, суммирующих значения в диапазоне, в переменной диапазона и в массиве.

Время работы макроса

Определение времени выполнения макроса с использованием функции 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

Как правильно определить время выполнения кода?

tumanovalex

Дата: Суббота, 14.02.2015, 19:23 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Попробовал поработать с таймером, определить время выполнения кода. [vba]

Код

Sub TestTimer()
      Dim TimeBeg As Date, TimeEnd As Date, TimeWork As Date, i, j, res
      TimeBeg = Timer
      For i = 0 To 100000
        res = res + 1
      Next i
      TimeEnd = Timer
      TimeWork = TimeEnd — TimeBeg
      Debug.Print TimeWork
End Sub

[/vba] в результате получаю 0:11:15.
Возникли следующие вопросы:
а) как трактовать эти значения? Это 11 милисекунд и 15 микросекунд?
б) как вывести данные в мили и микросекундах?
Файл прикрепил.

Сообщение отредактировал tumanovalexСуббота, 14.02.2015, 19:30

 

Ответить

buchlotnik

Дата: Суббота, 14.02.2015, 20:10 |
Сообщение № 2

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

tumanovalex, здравствуйте
Timer возвращает количество секунд с начала суток — поэтому не нужно использовать формат даты. Текущий вариант нельзя никак трактовать. Корректный:[vba]

Код

Sub TestTimer()
   Dim TimeBeg#, TimeEnd#, TimeWork#, i&, res&
   TimeBeg = Timer
   For i = 1 To 1000000
     res = res + 1
   Next i
   TimeEnd = Timer
   TimeWork = Format((TimeEnd — TimeBeg) * 1000, «0.000»)
   MsgBox TimeWork
End Sub

[/vba] *1000 — перевод секунд в миллисекунды, формат «0.000» отображает также и число микросекунд (дробная часть)

 

Ответить

Vostok

Дата: Воскресенье, 15.02.2015, 11:49 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 211


Репутация:

1

±

Замечаний:
40% ±


Excel 2010

[vba]

Код

Private Sub YourMacro() ‘Таймер для замера времени процедуры
    Dim iTimer As Single
    iTimer = Timer     
    ‘———— Здесь должен быть код Вашей программы ————————————————-     
    MsgBox «Время загрузки:  » & Timer — iTimer & » сек.», vbInformation, «Информация о загрузке:»
    MsgBox «Время выполнения макроса  » & Format((Timer — iTimer) / 86400, «Long Time»), vbExclamation, «»

       ‘Если Вы хотите получить время именно в секундах, то используйте первый MsgBox, если в часах, минутах и секундах, то второй.   
End Sub

[/vba]


«Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !»

Сообщение отредактировал VostokВоскресенье, 15.02.2015, 11:49

 

Ответить

 

Vadim-ok

Пользователь

Сообщений: 98
Регистрация: 01.01.1970

Excel-master

С помощью какого кода, можно вычислить время выполнения макроса?

 

Sub Worktime()  
a=timer  
…  
…  
…  
…  
…  
MsgBox timer-a  
End sub

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

А более детально можно расписать (на пальцах..)  

  Имеется несколько макросов выполняющихся подряд. Хотелось бы фиксировать время исполнения каждого макроса (в минутах) с записыванием полученного значения в определенную строку на листе.  
Подскажите, пожалуйста, более детально как написать такой макрос

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Уже написали.  
В переменную заносится время данного момента, работает макрос, после его отработки выводится сообщение о разности момента окончания работы и переменной, т.е. чистое время работы процедуры.  
Если работает несколько процедур, вместо MsgBox вставьте запись времени куда-либо (можно тоже в переменную), после этой строки опять    
a=timer  
макрос1  
b=timer-a  
a=timer  
макрос2  
c=timer-a

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Спасибо, что ответили.., но могли бы Вы еще подсказать как ФИКСИРОВАТЬ результаты работы в строке листа ?  
В вашем макросе выскакивают отдельные иконки с результатом работы таймера

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Я имел в виду фиксировать время исполнения КАЖДОГО макроса в отдельной ячейки строки..

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

заведите глобальную переменную уровня модуля:  
Public tRow&  

  в начале каждого макроса пишем:  
a=timer  

  в конце:  
tRow=tRow+1: sheets(«Лист1»).cells(trow,1).value=timer-a

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

на каком нибудь простеньком примере (макросе) можете это расписать ? я не знаток макросов..    
И где в  tRow=tRow+1: sheets(«Лист1»).cells(trow,1).value=timer-a    указывается  в какой именно ячейке листа фиксируется результат таймера ?

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

{quote}{login=skif}{date=20.08.2012 11:13}{thema=Re: }{post}я не знаток макросов.{/post}{/quote}  
коллега!!!  
я вот тоже не ядерный физик, но на днях появилась аозможность порулить большим андронным коллайдером — почему бы и нет?  
так что извините — некогда: сейчас на соседнем форуме по черным дырам ответа дождусь и вылетать надо.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

На нет и суда нет..  Понимаю Вас ! :) терпение нужно райское !  

  ;) НО на написание вашего ответа-комментария вероятно ушло столько же времени сколько и ответ на вопрос где в tRow=tRow+1: sheets(«Лист1»).cells(trow,1).value=timer-a указывается в какой именно ячейке листа фиксируется результат таймера ?

 
 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

А ТС в теме так и не отписался… С 2010 года. Сейчас опять создает темы.  
skif, а Вы не обижайтесь. Это не курсы для начинающих по информатике. И не автоответчик. Предполагается, что человек, пришедший на форум программистов, хоть какие-то базовые знания должен иметь. И обучать Вас онлайн азам на форуме никто желанием не горит. В правилах есть ссылки на литературу, копилку, приемы. Имейте и Вы совесть, не отрывайте людей по пустякам.

Я сам — дурнее всякого примера! …

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

ну так мне не обижаться или совесть иметь ??   :)  
шучу.  

  как я написал уже, что ВСЕ понимаю..  и наличия времени.. и желания…    
Сам такой же.  
А степень «пустячности» определяется навыком и умением.Все мы знаем, что то лучше, что то хуже..  

  Я очень благодарен разработчику сайта и умельцам, которые поддерживают его на «плаву». Нужное и полезное дело делают совместными усилиями.

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

С моим вопросом я с горем пополам разобрался вроде бы. Не скажу, что полностью закрыл свои вопросы, но большую часть реализовал.  

  И за такую помощь ОГРОМНАЯ БЛАГОДАРНОСТЬ !    
уже не первый раз выручаете..

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Если я все верно понял, то простейшим макросом-примером будет следующий :  

  Sub ОбщийЗапуск()  
Call Protect_for_User_Non_for_VBA  
a = Timer  
Call Макрос_1  
trow = trow + 1: Sheets(«Лист 1»).Cells(trow, 1).Value = Timer — a  
a = Timer  
Call макрос_2  
trow = trow + 1: Sheets(«Лист 1»).Cells(trow, 1).Value = Timer — a  
a = Timer  
Call Макрос_3  
trow = trow + 1: Sheets(«Лист 1»).Cells(trow, 1).Value = Timer — a  
End Sub  

  макросы исполняются друг за другом, а в столбце А:А отображаются времена исполнения.

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

ну в общем всё правильно.  
а вы попробуйте запустить — должно получиться :)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

как Ваш андронный коллайдер ? ;) получилось порулить ??    

  Да. С Вашей помощью, все работает.  Спасибо !  
Но вот как записать значения в строку, так и не додумался (не нашел).

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

поменяйте местами — не cells(trow,1), а cells(1,trow)  
как искать (совет): в коде курсором встали на слово cells и нажали F1  

  пс. форум по черным дырам сам оказался черной дырой. Планета лучше :)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Skif_79

Пользователь

Сообщений: 56
Регистрация: 01.01.1970

Учту. Спасибо !  

  Может для ОКОНЧАТЕЛЬНОГО уяснения :) подскажите как результаты в заданные (конкретные) ячейки заносить ?  
а то увеличивающиеся последовательно цифры в столбце УЖАСАЮТ разрядностью :)  

  так хоть их равномерно по листу можно распределить, чтоб сразу в глаза не бросались..     :)

 

ran

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#20

20.08.2012 17:44:30

cells(1,1),Range(«A1»),[A1] = a
Все, что слева — это ячейка А1.

Время выполнения макроса

Всем привет Дела в 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»)

Понравилась статья? Поделить с друзьями:
  • Excel vba включить фильтр
  • Excel vba виды модулей
  • Excel vba видимость переменных
  • Excel vba ввод только даты
  • Excel vba ввод данных через форму