2017-01-19 1 views
4

Ich versuche, ein Datum in lange mit VBA-Skript zu konvertieren. Unten ist der CodeVBA cDate funktioniert nicht auf Mac Excel 2011 (14.7.1)

Sub test() 
    Dim str as string 
    Dim d as variant 
    str="1/1/2016" 
    d=cdate(str) 
end sub 

Die obige Snippet läuft gut auf Windows-Schnipsel aber gibt mir auf MAC Fehlanpassungsfehler geben. Gibt es einen Turnaround, um eine gültige Zeichenfolge in einem Datum zu konvertieren.

+0

Wie lauten die Regions-/Spracheinstellungen Ihres Mac? – Dai

+0

Auch, welche Zeile erhalten Sie den Fehler auf und was ist die genaue Fehlermeldung? – Dai

+0

Es ist auf US-Einstellungen –

Antwort

1

Ihr Code hat auf meinem lokalen OS X-Rechner mit Excel funktioniert. Ich habe jedoch verschiedene Regionseinstellungen. Ich würde vorschlagen, versuchen Sie es mit dem internationalen Datumsformat ("YYYY-mm-dd").

Sub Main 
    Dim str as String 
    Dim d as Variant 
    str = "2016-01-01" 
    d = CDate(str) 
End Sub 

Alternativ können Sie versuchen "Jan/1/2016".


PS: Sie können Ihre Datum & Zeiteinstellungen in OS X unter Systemeinstellungen siehe -> Sprache & Region -> Erweitert -> Termine:

OS X language & region date settings

+0

Bitte beachten Sie den Link von Hank in den Kommentaren zur Verfügung gestellt –

+0

Das Problem ist, wenn CDate verwendet wird, um von einem seltsamen Format zu covern, wie [diese Frage] (https://stackoverflow.com/questions/23990811/convert-mmm- dd-yyyy-hhmmss-am-in-excel) .... –

0

Vielleicht versucht das Entfernen der „/ "vor der Konvertierung? Ich habe keinen Mac zum Testen:

Public Sub test() 
    Dim str As String 
    Dim d As Long 'should be Date, but your question states Long 
    str = "1/1/2016" 
    d = CDate(Replace(str, "/", "")) 
    Debug.Print d 
End Sub 

Haben Sie auch versucht, nach fehlenden Referenzen zu suchen? Date for VBA not working in Excel 2011?

1

Ihre regionalen Einstellungen sind die Ursache.

Können Sie versuchen, sie zu ändern?

defaults write NSGlobalDomain AppleICUDateFormatStrings -dict 1 dd/MM/yyyy 
+0

Nur neugierig, wie dies in VBA getan werden kann? – KyloRen

+0

Dies sollte in MacOS Terminal, in Bezug auf Systemeinstellungen erfolgen. –

+0

@HanSoalone, liebe den Namen !!! – KyloRen

0

Sie konnten die IsDate() Funktion verwenden, um zu überprüfen, ob es sich um ein Datum vor der Konvertierung ist. Ansonsten eine Abhilfe verwenden:

Sub test() 
    Dim str as string 
    Dim d as variant 
    str = "1/1/2016" 

    If IsDate(str) then 
     d = CDate(str) 
    Else 
     Dim aDateParts() as String 
     aDateParts() = Split(str, "/") 

     ' DateSerial(Year, Month, Day) 
     d = DateSerial(CInt(aDateParts(2)), CInt(aDateParts(0)), CInt(aDateParts(1))) 
    End If 
end sub 
+0

Bis jetzt ist die einzige Antwort eine mögliche Problemumgehung, aber ich bin mir nicht sicher, ob 'IsDate (str)' verhindert, dass str als Datum validiert wird, obwohl die Zuweisung von 'd' fehlschlagen kann. Auch wenn der Datums-String etwas Lustiges wie "1/32/2017" ist, kommen wir zum else Teil, wo schlimme Dinge passieren. –

+0

Ich würde dies mit einem Links/Mitte/Rechts für den Tag Monat Jahr tun, ist Ihre Antwort besser mit der Split-Funktion. Meiner Ansicht nach könnte dies verbessert werden, indem man es in ein: Function ConDate (InputDate als String) als Datum – User632716

+0

@HanSoalone einfügt Dieser Code war mehr ein Proof of Concept als eine funktionierende Lösung, er sollte verfeinert werden, wenn das eine akzeptable Lösung ist. Tom, danke, es scheint eine gute Idee zu sein! Was ist die beste Vorgehensweise hier? Sollte ich Ihre Lösung verbessern? – sebifeixler

0

Viele andere Antwort, so kann ich auch auf diese Weise werfen es sie in den Ring zu tun,

Sub test() 
    Dim str As String 
    Dim d As Variant 
    str = "1/1/2016" 
    d = CDate(Format(str, "dd/MM/yyyy")) 
    Debug.Print d 
End Sub 
0

Das habe ich nicht schreiben ursprünglich, weil ich glaubte, Wenn Sie eine Problemumgehung verwenden möchten, können Sie die folgende Funktion auf ähnliche Weise verwenden, als würden Sie eine CDate verwenden, indem Sie ConDate("12/12/2016") aufrufen.

Dies ist die Art, wie ich das Problem angesprochen:

Sub MainTest() 
    Dim InputString As String, OutputDate As Date 

    InputString = "01/12/2016" 
    OutputDate = ConDate(InputString) 

    Debug.Print OutputDate, TypeName(OutputDate) 
End Sub 

Function ConDate(ByRef InputString As String) As Date 
    Dim Day As Long, Month As Long, year As Long 
    'mmddyyyy format 
    Month = CLng(Left(InputString, InStr(1, InputString, "/", vbTextCompare) - 1)) 
    Day = CLng(Mid(InputString, InStr(1, InputString, "/", vbTextCompare) + 1, InStrRev(InputString, "/", , vbTextCompare) - InStr(1, InputString, "/", vbTextCompare) - 1)) 
    year = CLng(Right(InputString, 4)) 
    ConDate = DateSerial(year, Month, Day) 
End Function 

Viele wollen nicht sebifeixler Antwort auf plagerise ich meine ursprüngliche links gehalten/Mitte/rechts den Tag/Monat/Jahr zu trennen, aber ich fühle es viel ist besser, seine Trennfunktion zu verwenden, um das Datum durch "/" zu trennen. Eine Kombination der beiden wäre ein guter Workaround.

Verwandte Themen