2011-11-30 21 views
16

esiste un modo per ottenere il numero intero sottostante per la funzione Date in VBA? Mi riferisco al numero intero memorizzato da Excel per descrivere le date in memoria in termini di numero di giorni (quando il tempo è incluso può essere un float, suppongo). Tuttavia, mi interessa solo la parte intera. C'è solo un'altra funzione per questo?VBA Data come intero

Ad esempio, per oggi() Mi piacerebbe essere in grado di tornare 40877 ..

Grazie ragazzi;)

risposta

24

data non è un numero intero in VB (A), si tratta di un doppio.

È possibile ottenere il valore di una data passandolo a CDbl().

CDbl(Now())  ' 40877.8052662037 

Per ottenere la parte intera, utilizzare

Int(CDbl(Now())) ' 40877 

che restituirà un lungo Doppia senza decimali (vale a dire che cosa Floor() avrebbe fatto in altre lingue).

Utilizzare CLng() o Round() risulterebbe in un arrotondamento, che restituirà un "giorno nel futuro" quando chiamato dopo mezzogiorno, quindi non farlo.

+0

Int (CDbl (Now())) non restituisce un valore long, restituisce un double. Il valore del double capita semplicemente di rappresentare un numero intero, ma il tipo di dati è ancora doppio. – phoog

+0

@phoog: 'TypeName (VarType (Int (CDbl (Now())))) =" Long "' sul mio sistema – Tomalak

+0

@Tomalek ovviamente, perché 'VarType (Int (CDbl (Now())))' restituisce 5, che è il valore di 'vbDouble', ma è esso stesso un' Long'. Prova 'TypeName (Int (CDbl (Now())))'. – phoog

9

Basta usare CLng(Date).

Si noti che è necessario utilizzare Long non Integer per questo come valore per la data corrente è> 32767

+0

Infatti non ho pensato al problema Long/Integer! Grazie ! – Jerome

+2

CLng arrotonderà i valori del pomeriggio fino al giorno successivo. – phoog

+0

@phoog. Ho usato 'Date' not' Now'. 'Date' non ha componenti temporali, quindi' CLng' va bene e sicuro. –

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

È possibile utilizzare il codice di esempio muggito per stringa di data come mdate and Now() come oggi, è anche possibile calcolare la deferenza tra i due data come invecchiamento

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: Macchine CDate per convertire la stringa di data a data valida

Sto usando questo in Office 2007 :)

Problemi correlati