2014-12-01 32 views
5

Pracuję nad problemem, w którym muszę określić całkowity czas, jaki mój program potrzebuje do wykonania. Pierwszy wiersz kodu musi zawierać bieżący "Czas rozpoczęcia", a ostatnie wiersze kodu muszą zawierać bieżący "Czas zakończenia". Odejmuję "Czas rozpoczęcia" - "Czas końcowy" = Całkowity czas.Jak przekonwertować VBA teraz() na kilka sekund, aby określić całkowite działanie programu

Nie rozumiem, w jaki sposób mogę użyć funkcji FORMAT() w VBA na wartość C2 do konwersji na sekundy? Czy istnieje inna funkcja, która działałaby lepiej niż FORMAT? Zasadniczo jestem zdezorientowany wartością daty szeregowej programu Excel i tym, co reprezentują.

Kod jest poniżej

EDYCJA: Dzięki za odpowiedzi wszyscy. Obydwie poniższe odpowiedzi odpowiadają za to, co próbuję zrobić.

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 

Odpowiedz

2

Istnieje kilka sposobów można użyć VBA do formatowania komórek/zmienne.

W przypadkowej kolejności, po pierwsze można sformatować zakresy z właściwością NumberFormat, które mogą być stosowane w taki sposób:

Worksheets("Table").Range("C2").Value = Now() 
Worksheets("Table").Range("C2").NumberFormat = "ss" 

Innym sposobem jest to, że można sformatować Now() pomocą Format() funkcję:

Worksheets("Table").Range("C2").Value = Format(Now(), "ss") 

Zobacz dokumentację firmy Microsoft, aby zaimplementować różne formaty:

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

+0

Formatowanie C2 nie konieczne rozwiązać swój początkowy pytanie. DateDiff jest znacznie prostszym sposobem na rozwiązanie swojego problemu z kodem. – Chrismas007

+1

@ Chrismas007 To nie było jednak pierwsze pytanie. Pytanie brzmiało: "jestem zdezorientowany, w jaki sposób użyłbym funkcji FORMAT() w VBA na wartości C2, aby przekształcić ją w sekundy?' – Gareth

+0

@Gareth robi 'Range (" C2 "). NumberFormat =" ss "' just w rundzie do całej sekundy? Myślę, że to jest to, czego bym potrzebował, ale czy istnieje sposób, aby obsłużyć w tym miejscu przecinki dziesiętne? – arooney88

3

DateDiff() jest tym, czego szukasz. "S" określa, że ​​szukasz różnicy w sekundach.

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 aby dowiedzieć się więcej na temat pracy z datami i czasem w Excel VBA. Ważne jest, aby zrozumieć, że daty działają inaczej w kontekście VBA i mają swój własny, unikalny zestaw funkcji składniowych do manipulowania.

2-ty EDIT: Czystsze wersja ta będzie:

StartDateTime = Now() 
'Run Code 
Worksheets("Table").Range("C2").Value = DateDiff("s", StartDateTime, Now()) 
2

W pierwszym wierszu programu uzyskać datę (nie trzeba sformatować):

Dim startTime as Date 
startTime = Now() 

Pod koniec programu, uzyskać datę znowu:

Dim endTime as Date 
endTime = Now() 

Następnie użyj DateDiff

Dim timeInSeconds as long 
timeInSeconds = DateDiff("s", startTime, endTime) 
3

Nie należy używać elementu danych Date ani metody Now do analizy czasu wykonywania programu. Zamiast tego, najodpowiedniejszym rozwiązaniem jest funkcja Timer, ponieważ zwraca ona Single reprezentującą sekundy. Nie wymaga konwersji typu i daje dokładniejszy wynik niż liczba całkowita sekund.

Używanie odpowiedzi LimaNightHawk jako szablonu, ponieważ powinieneś przechowywać je w zmiennych lokalnych zamiast pisać bezpośrednio do arkusza roboczego.

Dim startTime as Single 
startTime = Timer() 

' Do stuff 

Dim endTime as Single 
endTime = Timer() 

Dim runTime as Single 
runTime = endTime - startTime 

Wyniki należy zapisać na końcu procedury.

With Worksheets("Table") 
    .Range("A2").Value = startTime 
    .Range("B2").Value = endTime 
    .Range("C2").Value = runTime 
End With 

Documentation on the timer function

0

Jak zwykle go o chwalenie się mój czas procesu użytkownikowi

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 
Powiązane problemy