2016-03-30 7 views
0

Ich berechne mit Daten in MS Access mit VBA. Das funktioniert gut, wenn ich zwei Daten auf dem gleichen Formular habe (ex 2016-01-21), aber nicht, wenn ich zuerst eine Zeichenfolge in Datumsform ändern muss: 20160121 -> 2016-01-21.Inkompatible Typen mit CDate() in Access VBA

Das ist, was ich versuche zu tun:

Dim sYear As String, sMonth As String, sDay As String, sDate As String 

sYear = Left("20160121", 4) 
sMonth = Mid("20160121", 5, 2) 
sDay = Mid("20160121", 7, 2) 

sDate = sYear & "-" & sMonth & "-" & sDay 

MsgBox CDate(sDate) 

Dies gibt Fehler 13, Inkompatible Typen. obwohl

Dies funktioniert:

MsgBox CDate("2016-01-21") 

Warum nicht meine Art und Weise der Arbeit?

+0

Der obige Code funktioniert. Meine Vermutung ist, dass '" 20160121 "' nicht wirklich ein fester Wert ist, sondern ein Datenbankfeld, das Null enthalten kann? Wenn das so ist, benutze [die 'Nz()' -Funktion] (https://msdn.microsoft.com/en-us/library/office/aa172237%28v=office.11%29.aspx?f=255&MSPPError=- 2147217396). – Tomalak

+0

Du hast recht, es funktioniert, aber ... Statt "20160121" habe ich eine Variable, var, die ich von einer Textbox bekomme. Ich kann var in den Funktionen Left() und cDate() verwenden, aber wenn ich es in Mid() verwende, tut es das nicht ... Macht es das klarer? – PoorCadaver

+0

Nein, nicht wirklich, leider. Setzen Sie einen Haltepunkt in Ihrem Code, durchlaufen Sie ihn Zeile für Zeile, notieren Sie sich die genaue Zeile, in der der Fehler auftritt, und alle Variablenwerte zu diesem Zeitpunkt. Dies muss eine einfache Aufsicht und kein echtes Problem sein. – Tomalak

Antwort

0

Der Fehler war, weil ich mit einem falschen Datum getestet: 12345678 statt. Mit einem korrekten Datum funktioniert es gut ...

0

Sie müssen entscheiden, was bei ungültigen Eingabewerten zu tun ist.

Eine Option ist ein Standarddatum Ihrer Wahl, das heutige Datum zu liefern oder hier 1980-01-01:

Public Function ConvertDate(ByVal TextDate As String) As Date 

    Dim RealDate As Date 
    Dim NullDate As Date 

    NullDate = #1/1/1980# 

    TextDate = Format(TextDate, "@@@@/@@/@@") 
    If IsDate(TextDate) Then 
     RealDate = CDate(TextDate) 
    Else 
     RealDate = NullDate 
    End If 

    ConvertDate = RealDate 

End Function 

zurück um:

20160121 -> 2016-01-21 
20160141 -> 1980-01-01 

Oder Sie können das ändern Datentyp RealDate bis Variante und zurück Null für ungültige Daten:

Public Function ConvertDate(ByVal TextDate As String) As Variant 

    Dim RealDate As Variant 
    Dim NullDate As Variant 

    NullDate = Null  

    TextDate = Format(TextDate, "@@@@/@@/@@") 
    If IsDate(TextDate) Then 
     RealDate = CDate(TextDate) 
    Else 
     RealDate = NullDate 
    End If 

    ConvertDate = RealDate 

End Function 

Wir kommen wieder:

20160121 -> 2016-01-21 
20160141 -> Null