Учёт времени расчёта.
Roman777
Дата: Пятница, 27.03.2015, 09:49 |
Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация:
127
±
Замечаний:
0% ±
Excel 2007, Excel 2013
Добрый день! Решил посчитать время расчёта программы. Знаю ток 1 ф-ю, поэтому написал так: [vba]Код
'начало кода ... Time_1_1 = Format(Now(), "h") Time_1_2 = Format(Now(), "mm") Time_1_3 = Format(Now(), "ss") .... 'конец кода Time_2_1 = Format(Now(), "h") Time_2_2 = Format(Now(), "mm") Time_2_3 = Format(Now(), "ss") If Time_2_1 < Time_1_1 Then Time_2_1 = Time_2_1 + 60 Time_2_2 = Time_2_2 - 1 End If If Time_2_2 < Time_1_2 Then Time_2_2 = Time_2_2 + 60 Time_2_3 = Time_2_3 - 1 End If Time_ = Time_2_1 - Time_1_1 & " часов " & Time_2_2 - Time_1_2 & " минут " & Time_2_3 - Time_1_3 & " секунд" Application.DisplayAlerts = False ActWB.SaveAs Filename:=pathAWB & NameNWB & FormExlNWB Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox ("Выполненно за " & Time_ & Chr(13) & "Исправлено " & ActWB.Worksheets.Count _ & " листов. Ниже приведён перечень листов, в которых была откорректирована таблица: " _ & Chr(13) & shtName) End Sub
[/vba] Почему-то частенько получается отрицательное время)))) Не пойму, где я ошибся...)
Добрый день! Решил посчитать время расчёта программы. Знаю ток 1 ф-ю, поэтому написал так: [vba]Код
'начало кода ... Time_1_1 = Format(Now(), "h") Time_1_2 = Format(Now(), "mm") Time_1_3 = Format(Now(), "ss") .... 'конец кода Time_2_1 = Format(Now(), "h") Time_2_2 = Format(Now(), "mm") Time_2_3 = Format(Now(), "ss") If Time_2_1 < Time_1_1 Then Time_2_1 = Time_2_1 + 60 Time_2_2 = Time_2_2 - 1 End If If Time_2_2 < Time_1_2 Then Time_2_2 = Time_2_2 + 60 Time_2_3 = Time_2_3 - 1 End If Time_ = Time_2_1 - Time_1_1 & " часов " & Time_2_2 - Time_1_2 & " минут " & Time_2_3 - Time_1_3 & " секунд" Application.DisplayAlerts = False ActWB.SaveAs Filename:=pathAWB & NameNWB & FormExlNWB Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox ("Выполненно за " & Time_ & Chr(13) & "Исправлено " & ActWB.Worksheets.Count _ & " листов. Ниже приведён перечень листов, в которых была откорректирована таблица: " _ & Chr(13) & shtName) End Sub
[/vba] Почему-то частенько получается отрицательное время)))) Не пойму, где я ошибся...) Roman777
Много чего не знаю!!!!
Ответить
Сообщение Добрый день! Решил посчитать время расчёта программы. Знаю ток 1 ф-ю, поэтому написал так: [vba]Код
'начало кода ... Time_1_1 = Format(Now(), "h") Time_1_2 = Format(Now(), "mm") Time_1_3 = Format(Now(), "ss") .... 'конец кода Time_2_1 = Format(Now(), "h") Time_2_2 = Format(Now(), "mm") Time_2_3 = Format(Now(), "ss") If Time_2_1 < Time_1_1 Then Time_2_1 = Time_2_1 + 60 Time_2_2 = Time_2_2 - 1 End If If Time_2_2 < Time_1_2 Then Time_2_2 = Time_2_2 + 60 Time_2_3 = Time_2_3 - 1 End If Time_ = Time_2_1 - Time_1_1 & " часов " & Time_2_2 - Time_1_2 & " минут " & Time_2_3 - Time_1_3 & " секунд" Application.DisplayAlerts = False ActWB.SaveAs Filename:=pathAWB & NameNWB & FormExlNWB Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox ("Выполненно за " & Time_ & Chr(13) & "Исправлено " & ActWB.Worksheets.Count _ & " листов. Ниже приведён перечень листов, в которых была откорректирована таблица: " _ & Chr(13) & shtName) End Sub
[/vba] Почему-то частенько получается отрицательное время)))) Не пойму, где я ошибся...) Автор - Roman777 Дата добавления - 27.03.2015 в 09:49
_Boroda_
Дата: Пятница, 27.03.2015, 10:13 |
Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16957
Репутация:
6631
±
Замечаний:
±
2003; 2007; 2010; 2013 RUS
Я обычно вот так пишу [vba]Код
tt = Timer 'Код tt = Timer - tt MsgBox "Все" & Chr(10) & "Время работы - " & Format(tt / 24 / 60 / 60, "hh\ч mm\м ss\с")
[/vba]
Я обычно вот так пишу [vba]Код
tt = Timer 'Код tt = Timer - tt MsgBox "Все" & Chr(10) & "Время работы - " & Format(tt / 24 / 60 / 60, "hh\ч mm\м ss\с")
[/vba] _Boroda_
Скажи мне, кудесник, любимец ба’гов... Платная помощь: Boroda_Excel@mail.ru Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
Ответить
Сообщение Я обычно вот так пишу [vba]Код
tt = Timer 'Код tt = Timer - tt MsgBox "Все" & Chr(10) & "Время работы - " & Format(tt / 24 / 60 / 60, "hh\ч mm\м ss\с")
[/vba] Автор - _Boroda_ Дата добавления - 27.03.2015 в 10:13
Rioran
Дата: Пятница, 27.03.2015, 10:16 |
Сообщение № 3
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация:
290
±
Замечаний:
0% ±
Excel 2013
Roman777 , здравствуйте. Предлагаю отказаться от замысловатого метода Format и использовать функции специально для этого предназначенные =) Плюс перевёл Ваш код в удобную для тестирования форму. Сразу обращают на себя внимание условия IF . Заменить, нельзя оставить =) [vba]Код
Sub Test04() 'начало кода Time_1_1 = Hour(Now()) Time_1_2 = Minute(Now()) Time_1_3 = Second(Now()) Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3) 'конец кода Time_2_1 = Hour(Now()) Time_2_2 = Minute(Now()) Time_2_3 = Second(Now()) If Time_2_1 < Time_1_1 Then 'Если час финиша меньше часа старта... Time_2_1 = Time_2_1 + 60 'Час финиша увеличиваем на 60 Time_2_2 = Time_2_2 - 1 'От минут финиша отнимаем 1 End If If Time_2_2 < Time_1_2 Then 'Если минуты финиша меньше минут старта... Time_2_2 = Time_2_2 + 60 'К минутам финиша добавляем 60 Time_2_3 = Time_2_3 - 1 'От секунд финиша отнимаем 1 End If 'От часов финиша отнимаем часы старта Time_ = Time_ & Time_2_1 - Time_1_1 & " часов " 'От минут финиша отнимаем минуты старта Time_ = Time_ & Time_2_2 - Time_1_2 & " минут " 'От секунд финиша отнимаем секунды старта Time_ = Time_ & Time_2_3 - Time_1_3 & " секунд" MsgBox ("Выполненно за " & Time_) End Sub
[/vba] Update: Вариант Александра куда более оптимален.
Roman777 , здравствуйте. Предлагаю отказаться от замысловатого метода Format и использовать функции специально для этого предназначенные =) Плюс перевёл Ваш код в удобную для тестирования форму. Сразу обращают на себя внимание условия IF . Заменить, нельзя оставить =) [vba]Код
Sub Test04() 'начало кода Time_1_1 = Hour(Now()) Time_1_2 = Minute(Now()) Time_1_3 = Second(Now()) Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3) 'конец кода Time_2_1 = Hour(Now()) Time_2_2 = Minute(Now()) Time_2_3 = Second(Now()) If Time_2_1 < Time_1_1 Then 'Если час финиша меньше часа старта... Time_2_1 = Time_2_1 + 60 'Час финиша увеличиваем на 60 Time_2_2 = Time_2_2 - 1 'От минут финиша отнимаем 1 End If If Time_2_2 < Time_1_2 Then 'Если минуты финиша меньше минут старта... Time_2_2 = Time_2_2 + 60 'К минутам финиша добавляем 60 Time_2_3 = Time_2_3 - 1 'От секунд финиша отнимаем 1 End If 'От часов финиша отнимаем часы старта Time_ = Time_ & Time_2_1 - Time_1_1 & " часов " 'От минут финиша отнимаем минуты старта Time_ = Time_ & Time_2_2 - Time_1_2 & " минут " 'От секунд финиша отнимаем секунды старта Time_ = Time_ & Time_2_3 - Time_1_3 & " секунд" MsgBox ("Выполненно за " & Time_) End Sub
[/vba] Update: Вариант Александра куда более оптимален.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Пятница, 27.03.2015, 10:21
Ответить
Сообщение Roman777 , здравствуйте. Предлагаю отказаться от замысловатого метода Format и использовать функции специально для этого предназначенные =) Плюс перевёл Ваш код в удобную для тестирования форму. Сразу обращают на себя внимание условия IF . Заменить, нельзя оставить =) [vba]Код
Sub Test04() 'начало кода Time_1_1 = Hour(Now()) Time_1_2 = Minute(Now()) Time_1_3 = Second(Now()) Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3) 'конец кода Time_2_1 = Hour(Now()) Time_2_2 = Minute(Now()) Time_2_3 = Second(Now()) If Time_2_1 < Time_1_1 Then 'Если час финиша меньше часа старта... Time_2_1 = Time_2_1 + 60 'Час финиша увеличиваем на 60 Time_2_2 = Time_2_2 - 1 'От минут финиша отнимаем 1 End If If Time_2_2 < Time_1_2 Then 'Если минуты финиша меньше минут старта... Time_2_2 = Time_2_2 + 60 'К минутам финиша добавляем 60 Time_2_3 = Time_2_3 - 1 'От секунд финиша отнимаем 1 End If 'От часов финиша отнимаем часы старта Time_ = Time_ & Time_2_1 - Time_1_1 & " часов " 'От минут финиша отнимаем минуты старта Time_ = Time_ & Time_2_2 - Time_1_2 & " минут " 'От секунд финиша отнимаем секунды старта Time_ = Time_ & Time_2_3 - Time_1_3 & " секунд" MsgBox ("Выполненно за " & Time_) End Sub
[/vba] Update: Вариант Александра куда более оптимален.Автор - Rioran Дата добавления - 27.03.2015 в 10:16
Roman777
Дата: Пятница, 27.03.2015, 10:16 |
Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация:
127
±
Замечаний:
0% ±
Excel 2007, Excel 2013
_Boroda_ , Спасибо большое))). Попробую Ваш вариант, гораздо проще)
_Boroda_ , Спасибо большое))). Попробую Ваш вариант, гораздо проще)Roman777
Много чего не знаю!!!!
Ответить
Сообщение _Boroda_ , Спасибо большое))). Попробую Ваш вариант, гораздо проще)Автор - Roman777 Дата добавления - 27.03.2015 в 10:16
Roman777
Дата: Пятница, 27.03.2015, 10:20 |
Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация:
127
±
Замечаний:
0% ±
Excel 2007, Excel 2013
Rioran , Не очень понял почему if надо убрать? у меня же может быть следующее. Началось в 12:34:56 закончился код в 12:35:05. Тогда код станет вычитать: 12-12, 35-34, 05-56 и получит 0:1:-51. Вот условие и прописал...
Rioran , Не очень понял почему if надо убрать? у меня же может быть следующее. Началось в 12:34:56 закончился код в 12:35:05. Тогда код станет вычитать: 12-12, 35-34, 05-56 и получит 0:1:-51. Вот условие и прописал...Roman777
Много чего не знаю!!!!
Ответить
Сообщение Rioran , Не очень понял почему if надо убрать? у меня же может быть следующее. Началось в 12:34:56 закончился код в 12:35:05. Тогда код станет вычитать: 12-12, 35-34, 05-56 и получит 0:1:-51. Вот условие и прописал...Автор - Roman777 Дата добавления - 27.03.2015 в 10:20
Rioran
Дата: Пятница, 27.03.2015, 10:23 |
Сообщение № 6
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация:
290
±
Замечаний:
0% ±
Excel 2013
Roman777 , я имел в виду необходимость его пересмотреть, т.к. он считает некорректно. Проследите за логикой, описанной в комментариях. Вариант Александра, кстати, не учитывает переход отсчёта на новые сутки. Если не опередят - покажу, как я решал эту задачу. Где-то было... Update: Нашёл. Вставляем в книгу: [vba]Код
Dim StartSec As Double Dim StartDay As Long Dim FinishSec As Double Dim FinishDay As Long Dim Control As Byte Public Sub Main_Timer() Select Case Control Case 0 StartSec = Timer StartDay = DateDiff("d", "01.01.2015", Date) Case 1 FinishSec = Timer FinishDay = DateDiff("d", "01.01.2015", Date) MsgBox Time_Calculation(StartSec, StartDay, FinishSec, FinishDay) End Select Control = 1 - Control End Sub Function Time_Calculation(StartX As Double, StartD As Long, FinishX As Double, FinishD As Long) As String Dim Duration As Double Dim Seconds Dim Minutes Dim Hours Dim Days If StartD <> FinishD Then FinishX = FinishX + (FinishD - StartD) * 86400 End If Duration = FinishX - StartX Days = Duration \ 86400 Duration = Duration - Days * 86400 Hours = Duration \ 3600 If Hours < 10 Then Hours = "0" & Hours Duration = Duration - Hours * 3600 Minutes = Duration \ 60 If Minutes < 10 Then Minutes = "0" & Minutes Seconds = Round(Duration - Minutes * 60, 0) If Seconds < 10 Then Seconds = "0" & Seconds Time_Calculation = Hours & " : " & Minutes & " : " & Seconds If Days > 0 Then Time_Calculation = Time_Calculation & vbNewLine & "And " & Days & " days." End If End Function
[/vba] Теперь в той же книге можем в начале и в конце кода писать один и тот же метод: [vba]Код
Sub Time_Test() Call Main_Timer 'Начало кода 'хххххххххххххххххххххххххххххххххххх 'ххх Всякие операции и вычисления ххх 'хххххххххххххххххххххххххххххххххххх Call Main_Timer 'Конец кода End Sub
[/vba]
Roman777 , я имел в виду необходимость его пересмотреть, т.к. он считает некорректно. Проследите за логикой, описанной в комментариях. Вариант Александра, кстати, не учитывает переход отсчёта на новые сутки. Если не опередят - покажу, как я решал эту задачу. Где-то было... Update: Нашёл. Вставляем в книгу: [vba]Код
Dim StartSec As Double Dim StartDay As Long Dim FinishSec As Double Dim FinishDay As Long Dim Control As Byte Public Sub Main_Timer() Select Case Control Case 0 StartSec = Timer StartDay = DateDiff("d", "01.01.2015", Date) Case 1 FinishSec = Timer FinishDay = DateDiff("d", "01.01.2015", Date) MsgBox Time_Calculation(StartSec, StartDay, FinishSec, FinishDay) End Select Control = 1 - Control End Sub Function Time_Calculation(StartX As Double, StartD As Long, FinishX As Double, FinishD As Long) As String Dim Duration As Double Dim Seconds Dim Minutes Dim Hours Dim Days If StartD <> FinishD Then FinishX = FinishX + (FinishD - StartD) * 86400 End If Duration = FinishX - StartX Days = Duration \ 86400 Duration = Duration - Days * 86400 Hours = Duration \ 3600 If Hours < 10 Then Hours = "0" & Hours Duration = Duration - Hours * 3600 Minutes = Duration \ 60 If Minutes < 10 Then Minutes = "0" & Minutes Seconds = Round(Duration - Minutes * 60, 0) If Seconds < 10 Then Seconds = "0" & Seconds Time_Calculation = Hours & " : " & Minutes & " : " & Seconds If Days > 0 Then Time_Calculation = Time_Calculation & vbNewLine & "And " & Days & " days." End If End Function
[/vba] Теперь в той же книге можем в начале и в конце кода писать один и тот же метод: [vba]Код
Sub Time_Test() Call Main_Timer 'Начало кода 'хххххххххххххххххххххххххххххххххххх 'ххх Всякие операции и вычисления ххх 'хххххххххххххххххххххххххххххххххххх Call Main_Timer 'Конец кода End Sub
[/vba]Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Пятница, 27.03.2015, 10:30
Ответить
Сообщение Roman777 , я имел в виду необходимость его пересмотреть, т.к. он считает некорректно. Проследите за логикой, описанной в комментариях. Вариант Александра, кстати, не учитывает переход отсчёта на новые сутки. Если не опередят - покажу, как я решал эту задачу. Где-то было... Update: Нашёл. Вставляем в книгу: [vba]Код
Dim StartSec As Double Dim StartDay As Long Dim FinishSec As Double Dim FinishDay As Long Dim Control As Byte Public Sub Main_Timer() Select Case Control Case 0 StartSec = Timer StartDay = DateDiff("d", "01.01.2015", Date) Case 1 FinishSec = Timer FinishDay = DateDiff("d", "01.01.2015", Date) MsgBox Time_Calculation(StartSec, StartDay, FinishSec, FinishDay) End Select Control = 1 - Control End Sub Function Time_Calculation(StartX As Double, StartD As Long, FinishX As Double, FinishD As Long) As String Dim Duration As Double Dim Seconds Dim Minutes Dim Hours Dim Days If StartD <> FinishD Then FinishX = FinishX + (FinishD - StartD) * 86400 End If Duration = FinishX - StartX Days = Duration \ 86400 Duration = Duration - Days * 86400 Hours = Duration \ 3600 If Hours < 10 Then Hours = "0" & Hours Duration = Duration - Hours * 3600 Minutes = Duration \ 60 If Minutes < 10 Then Minutes = "0" & Minutes Seconds = Round(Duration - Minutes * 60, 0) If Seconds < 10 Then Seconds = "0" & Seconds Time_Calculation = Hours & " : " & Minutes & " : " & Seconds If Days > 0 Then Time_Calculation = Time_Calculation & vbNewLine & "And " & Days & " days." End If End Function
[/vba] Теперь в той же книге можем в начале и в конце кода писать один и тот же метод: [vba]Код
Sub Time_Test() Call Main_Timer 'Начало кода 'хххххххххххххххххххххххххххххххххххх 'ххх Всякие операции и вычисления ххх 'хххххххххххххххххххххххххххххххххххх Call Main_Timer 'Конец кода End Sub
[/vba]Автор - Rioran Дата добавления - 27.03.2015 в 10:23
Roman777
Дата: Пятница, 27.03.2015, 10:33 |
Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация:
127
±
Замечаний:
0% ±
Excel 2007, Excel 2013
Rioran , Да, тоже заметил, ну переход суток в моём случае не критично...) Ну и я тоже заметил, что при выполнении первого условия, у меня могут появиться "-" значения во 2-м... Я это решил, путём перемены местами данных условий. Ну и в моём случае счёт идёт на минуты, поэтому этого должно было быть достаточно. Спасибо за ответ. Кстати, что такое "Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3)"? Ого какой большой код, казалось бы для такой простой задачи...) Спасибо!
Rioran , Да, тоже заметил, ну переход суток в моём случае не критично...) Ну и я тоже заметил, что при выполнении первого условия, у меня могут появиться "-" значения во 2-м... Я это решил, путём перемены местами данных условий. Ну и в моём случае счёт идёт на минуты, поэтому этого должно было быть достаточно. Спасибо за ответ. Кстати, что такое "Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3)"? Ого какой большой код, казалось бы для такой простой задачи...) Спасибо!Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 27.03.2015, 10:34
Ответить
Сообщение Rioran , Да, тоже заметил, ну переход суток в моём случае не критично...) Ну и я тоже заметил, что при выполнении первого условия, у меня могут появиться "-" значения во 2-м... Я это решил, путём перемены местами данных условий. Ну и в моём случае счёт идёт на минуты, поэтому этого должно было быть достаточно. Спасибо за ответ. Кстати, что такое "Application.Wait TimeSerial(Time_1_1, Time_1_2, Time_1_3 + 3)"? Ого какой большой код, казалось бы для такой простой задачи...) Спасибо!Автор - Roman777 Дата добавления - 27.03.2015 в 10:33
Rioran
Дата: Пятница, 27.03.2015, 10:38 |
Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация:
290
±
Замечаний:
0% ±
Excel 2013
Roman777 , да, код большой =) Писал давно, с тех пор его упрощать необходимости не было, хотя даже с идеей Александра он сожмётся в два раза. Метод Application.Wait скажет макросу бездействовать до указанного момента. Метод TimeSerial( ... ) превращает числовые значения часов, минут и секунд в значение формата времени. Операция Time_1_3 + 3 нужна для прибавления к текущему моменту 3-х секунд.
Roman777 , да, код большой =) Писал давно, с тех пор его упрощать необходимости не было, хотя даже с идеей Александра он сожмётся в два раза. Метод Application.Wait скажет макросу бездействовать до указанного момента. Метод TimeSerial( ... ) превращает числовые значения часов, минут и секунд в значение формата времени. Операция Time_1_3 + 3 нужна для прибавления к текущему моменту 3-х секунд.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Ответить
Сообщение Roman777 , да, код большой =) Писал давно, с тех пор его упрощать необходимости не было, хотя даже с идеей Александра он сожмётся в два раза. Метод Application.Wait скажет макросу бездействовать до указанного момента. Метод TimeSerial( ... ) превращает числовые значения часов, минут и секунд в значение формата времени. Операция Time_1_3 + 3 нужна для прибавления к текущему моменту 3-х секунд.Автор - Rioran Дата добавления - 27.03.2015 в 10:38
Roman777
Дата: Пятница, 27.03.2015, 10:49 |
Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация:
127
±
Замечаний:
0% ±
Excel 2007, Excel 2013
Rioran , оо, можно даже выставить таймер на запуск в определённое время, круто))). Спасибо за разъяснения.
Rioran , оо, можно даже выставить таймер на запуск в определённое время, круто))). Спасибо за разъяснения.Roman777
Много чего не знаю!!!!
Ответить
Сообщение Rioran , оо, можно даже выставить таймер на запуск в определённое время, круто))). Спасибо за разъяснения.Автор - Roman777 Дата добавления - 27.03.2015 в 10:49