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

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

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

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

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


 

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.

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

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

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

ДмитрийVBA

1 / 1 / 0

Регистрация: 18.04.2013

Сообщений: 27

1

Замер времени работы макроса на каждом шаге — как сделать?

07.05.2013, 15:43. Показов 14912. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Возможно ли отследить какой блок кода сколько времени исполняется?
Было бы, конечно, супер, если бы это все выводилось в «отладочный» файл в удобном виде (может просто у кого есть заготовка, задача по идее тривиальная и нужная для оптимизации):
1-й шаг занял …сек.
2-й шаг занял …сек.

Нашел на просторах вот такой код:

Visual Basic
1
2
3
4
5
Sub test()
    t = Timer
    For i = 1 To 30000000: Next
    MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
End Sub

Но в силу своей неопытности не могу понять как это работает и вообще почему это работает И куда это вставлять в коде, чтобы получить то, что надо. Или это совсем не то…



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

07.05.2013, 16:08

2

Это именно то (одно из возможных решений).
В переменную замоминаем значение системного таймера, он тикает параллельно коду, затем смотрим разницу значений. Но если замерять фрагменты кода — выводите в debug.print
Т.е. вывели, запомнили опять текущее значение таймера в переменную, запустили код дальше (ну или он сам пошёл ) и т.д.
Можно писать не в окно отладки, а в текстовый файл. Но в debug оперативнее и проще.



1



ДмитрийVBA

1 / 1 / 0

Регистрация: 18.04.2013

Сообщений: 27

07.05.2013, 16:54

 [ТС]

3

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Это именно то (одно из возможных решений).
В переменную замоминаем значение системного таймера, он тикает параллельно коду, затем смотрим разницу значений. Но если замерять фрагменты кода — выводите в debug.print
Т.е. вывели, запомнили опять текущее значение таймера в переменную, запустили код дальше (ну или он сам пошёл ) и т.д.
Можно писать не в окно отладки, а в текстовый файл. Но в debug оперативнее и проще.

Я дико извиняюсь, но куда вот это все писать, не могли бы Вы подсказать? Ну, например, есть такой код (оочень упрощенный):

Visual Basic
1
2
3
4
5
6
7
8
Sub test()
'шаг 1
a=a+1
'шаг 2
b=b+1
'шаг 3
c=c+1
End Sub

Вот каждый шаг как раз нам и надо отследить.



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

07.05.2013, 17:10

4

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub test()
 
t = Timer
'шаг 1
a = a + 1
MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
 
t = Timer
'шаг 2
b = b + 1
MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
 
t = Timer
'шаг 3
c = c + 1
MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
 
End Sub



1



Апострофф

07.05.2013, 22:22

Не по теме:

Hugo121, с юбилеем, ждём следующего:)



1



Hugo121

07.05.2013, 22:51



0



undefined7

259 / 7 / 1

Регистрация: 22.01.2013

Сообщений: 47

07.05.2013, 23:26

7

я делаю так:
в начале макроса записываю:

Visual Basic
1
2
3
4
    Dim tStart As Date, tFinish As Date
   
    tStart = Now
    ThisWorkbook.Sheets(1).Cells(1, 16) = tStart

в конце:

Visual Basic
1
2
3
4
    tFinish = Now
    ThisWorkbook.Sheets(1).Cells(1, 17) = tFinish
    ThisWorkbook.Sheets(1).Cells(1, 13) = Format(tFinish - tStart, "h:mm:ss")
'    MsgBox "Time: " & Format(tFinish - tStart, "h:mm:ss")

это записывается на 1 листе в ряде 1 колонки 13, 16,17, соответсвенно время исполнения, время запуска и время когда макрос закончен, если нужно и окошко выдаёт с предупреждением



1



Эксперт WindowsАвтор FAQ

17991 / 7617 / 890

Регистрация: 25.12.2011

Сообщений: 11,351

Записей в блоге: 17

10.05.2013, 01:05

8



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.05.2013, 01:05

8

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