Как преобразовать 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