Как преобразовать VBA Now() в секунды, чтобы определить общее время выполнения программы
Я работаю над проблемой, где мне нужно определить общее время моей программы выполняться. Первая строка кода должна записать текущее "время начала", а последние строки кода-текущее"время окончания". Затем я вычитаю "время начала" - "Время окончания" = Общее время.
Я смущен, как я буду использовать функцию FORMAT () в VBA по значению C2 для преобразования в секунды? Есть ли другая функция, которая будет работать лучше, чем формат? В общем, я запутался. о последовательных значениях даты Excel и о том, что они представляют.
код ниже
EDIT: Спасибо за ответы всем. Оба ответа ниже работают для того, что я пытаюсь сделать.
sub ExecutionTime()
Worksheets("Table").Range("A2").Value = Now()
'All my executable code goes here. It's a relatively small program compiling a table so it
runs very quick.
Worksheets("Table").Range("B2").Value = Now()
Worksheets("Table").Range("C2").Value = Worksheets("Table").Range("A2").Value - Worksheets("Table").Range("B2").Value
end Sub
5 ответов
есть несколько способов использовать VBA для форматирования ячеек / переменных.
в определенном порядке, во-первых, вы можете форматировать диапазоны с помощью NumberFormat
свойство, которое может быть применено как так:
Worksheets("Table").Range("C2").Value = Now()
Worksheets("Table").Range("C2").NumberFormat = "ss"
другой способ заключается в том, что вы можете отформатировать Now()
С помощью Format()
функция:
Worksheets("Table").Range("C2").Value = Format(Now(), "ss")
см. документацию от Microsoft для реализации различных форматов:
NumberFormat
: http://msdn.microsoft.com/en-us/library/office/ff196401%28v=office.15%29.aspx
Format
: http://msdn.microsoft.com/en-us/library/office/gg251755%28v=office.15%29.aspx
не использовать Date
элемент данных или Now
метод анализа времени выполнения вашей программы. Вместо Timer
функция является наиболее подходящим решением, поскольку она возвращает Single
представляющий секунд. Это не потребует преобразования типа и дает более точный результат, чем целочисленное количество секунд.
использование ответа LimaNightHawk в качестве шаблона, поскольку вы должны хранить их в локальных переменных вместо записи непосредственно в рабочий лист.
Dim startTime as Single
startTime = Timer()
' Do stuff
Dim endTime as Single
endTime = Timer()
Dim runTime as Single
runTime = endTime - startTime
результаты должны быть записаны в конце процедуры.
With Worksheets("Table")
.Range("A2").Value = startTime
.Range("B2").Value = endTime
.Range("C2").Value = runTime
End With
DateDiff () - это то, что вы ищете. "S" определяет, что вы ищете разницу в секундах.
Worksheets("Table").Range("C2").Value = DateDiff("s", Worksheets("Table").Range("A2").Value, Worksheets("Table").Range("B2").Value)
EDIT:http://www.likeoffice.com/28057/excel-date чтобы узнать больше о работе с датами и временем в Excel VBA. Важно понимать, что даты работают по-разному в контексте VBA и имеют свой собственный уникальный набор синтаксических функций для манипулирования.
2nd EDIT: более чистая версия этого будет быть:
StartDateTime = Now()
'Run Code
Worksheets("Table").Range("C2").Value = DateDiff("s", StartDateTime, Now())
В первой строке вашей программы узнать дату (не требуется) формат:
Dim startTime as Date
startTime = Now()
В конце вашей программы, получить дату еще раз:
Dim endTime as Date
endTime = Now()
тогда используйте DateDiff
Dim timeInSeconds as long
timeInSeconds = DateDiff("s", startTime, endTime)
Как я обычно хвастаюсь своим временем процесса пользователю
Sub Process()
Dim startTime as Date
Dim endTime as Date
startTime = Now
'Logic for what your process must do
endTime = Now
MsgBox "Process completed in : " & Format(endTime - startTime, "hh:mm:ss")
End Sub