Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Учёт времени расчёта. - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Учёт времени расчёта.
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
Дата добавления - 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]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
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: Вариант Александра куда более оптимален.


Роман, Москва, 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
Дата добавления - 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
Дата добавления - 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]


Роман, Москва, 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)"?

Ого какой большой код, казалось бы для такой простой задачи...) Спасибо!


Много чего не знаю!!!!

Сообщение отредактировал 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-х секунд.


Роман, Москва, 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
Дата добавления - 27.03.2015 в 10:49
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!