2011-11-30 11 views
16

Czy istnieje sposób uzyskania podstawowej liczby całkowitej dla funkcji Date w języku VBA? Odnoszę się do liczby całkowitej zapisanej w Excelu, aby opisać daty w pamięci pod względem liczby dni (kiedy czas jest włączony, może to być spławik, jak sądzę). Jestem jednak zainteresowany tylko częścią całkowitą. Czy istnieje tylko inna funkcja?VBA Data jako liczba całkowita

Na przykład dzisiaj() Chciałbym móc wrócić 40877 ..

Dziękuję chłopaki;)

Odpowiedz

24

Data nie jest liczbą całkowitą w VB (A), jest to dwukrotnie. Można uzyskać wartość daty, przekazując ją do CDbl().

CDbl(Now())  ' 40877.8052662037 

Aby uzyskać część całkowitą, użyj

Int(CDbl(Now())) ' 40877 

który zwróci Długi Dwuosobowy bez miejsc po przecinku (to co Floor() zrobi w innych językach).

Używanie CLng() lub Round() spowoduje zaokrąglenie, które zwróci "dzień w przyszłości", gdy zostanie wywołane po godzinie 12:00, więc nie rób tego.

+0

Int (CDbl (teraz())) nie zwraca długo, zwraca wartość podwójną. Wartość double jest po prostu liczbą całkowitą, ale jej typ danych jest nadal podwójny. – phoog

+0

@phoog: 'TypeName (VarType (Int (CDbl (Now()))))) =" Long "' w moim systemie – Tomalak

+0

@ Tomalek oczywiście, ponieważ 'VarType (Int (CDbl (teraz())))' zwraca 5, który jest wartością 'vbDouble', ale sam jest' Long'. Wypróbuj 'TypeName (Int (CDbl (Now())))'. – phoog

9

Wystarczy użyć CLng(Date).

Należy pamiętać, że trzeba użyć Long nie Integer za to jako wartość dla bieżącej daty jest> 32767

+0

Rzeczywiście nie myślałem o problemie Long/Integer! Dzięki ! – Jerome

+2

CLng obejmie wartości popołudniowe do następnego dnia. – phoog

+0

@phoog. Użyłem "Date", a nie "Now". 'Date' nie ma składnika czasu, dlatego' CLng' jest w porządku i bezpieczny. –

1
Public SUB test() 
    Dim mdate As Date 
    mdate = now() 
    MsgBox (Round(CDbl(mdate), 0)) 
End SUB 
0

Można użyć miech przykład kodu dla data ciąg jak mdate a teraz() jak dziś, można również obliczyć szacunek między obu daty jak Aging

Public Sub test(mdate As String) 
    Dim toDay As String 
    mdate = Round(CDbl(CDate(mdate)), 0) 
    toDay = Round(CDbl(Now()), 0) 
    Dim Aging as String 
    Aging = toDay - mdate 
    MsgBox ("So aging is -" & Aging & vbCr & "from the date - " & _ 
    Format(mdate, "dd-mm-yyyy")) & " to " & Format(toDay, "dd-mm-yyyy")) 
End Sub 

NB: Używany CDate do konwersji Data ciąg na poprawną datę

Używam tego w Office 2007 :)

Powiązane problemy