2012-07-21 22 views
6

Ich habe Daten in einer Excel-Tabelle in folgendem Format:VBA Konvertieren String Datum

 
ItemCode       DeliveryDate 
5456987        24.01.2009 
5456988           
5456989        12.24.2009 
5456990        12/24/2009 

I die Werte von DeliveryDate in einem Array gespeichert ist. Ich muss über die Grundlagen des Datums entscheiden und dann das Ergebnis in einem neuen Blatt drucken. Also muss ich die Werte in ein Array konvertieren:

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray 
    current = CDate(itemDate) 
    if current > highest then 
     highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 

Leider CDate() Funktion führt der Fehler:

Run-time error '13':

Type mismatch

Gibt es eine Funktion in VBA, wo:

  • Parse Zeichenkette mit beliebiges Datumsformat und gibt ein Datumobjekt zurück, mit dem zu arbeiten ist.
  • Rückgabe eines leeren Datumsobjekts, wenn die Zeichenfolge leer oder fehlerhaft ist (zum Vergleich in der Schleife).

Edit:

den Fehler zu reproduzieren, einfach laufen myDate = CDate("24.01.2009")

+0

nach [http://www.example-code.com /vb/stringtodate.asp] Du hast es richtig gemacht ... Wo ist der Fehler? Auf welcher Zeile - die erste oder die zweite Zeile (leere Zeichenfolge)? Haben Sie versucht, das Zeichenfolgenformat zu ändern? Möglicherweise möchten Sie das Format ändern, in dem Sie Ihre Datumszeichenfolgen analysieren. "24.01.2009" darf nicht erkannt werden aber "24.12.2009" darf - versuchen Sie nur den 12/24/2009 zu konvertieren und sehen Sie, ob es funktioniert. Wenn es funktioniert, kann das Format vom 24.01.2009 inakzeptabel sein. –

+0

Versuchen Sie, den 24.12.2009 zu konvertieren, um zu sehen, ob es funktioniert. Wenn es funktioniert, könnte das Format dd.MM.yyyy für CDate nicht verfügbar sein. Es gibt möglicherweise eine Möglichkeit für Sie, anzugeben, wie es formatiert ist, damit es es genau so parsen kann, wie Sie es wollen. Wenn das Format dd.MM.yyyy das Problem verursacht, ändern Sie zuerst das Format, indem Sie das "." mit einem "/" und versuchen Sie es erneut zu konvertieren. Oder formatiere es so, dass es MM/TT/JJJJ wird und konvertiere es dann. Ich denke, ich möchte nur wissen, ob "24.12.2009" Fehler ausgibt oder nicht. Überprüfe zuerst und lass es mich wissen. –

+0

@AnnB., Nun meine erste Frage ist; Gibt es eine VBA-Funktion, die Zeichenfolge mit * beliebigem * Datumsformat analysieren und ein Datumsobjekt zurückgeben kann, um damit zu arbeiten? –

Antwort

8

Versuchen Sie Replace zu verwenden, um zu sehen, ob es für Sie arbeitet. Das Problem, wie ich es sehe, das ein paar Mal oben erwähnt wurde, ist, dass die CDate-Funktion an den Perioden erstickt. Sie können replace verwenden, um sie zu Schrägstrichen zu ändern. Um Ihre Frage zu einer Funktion in vba zu beantworten, die ein beliebiges Datumsformat parsen kann, gibt es keine sehr begrenzten Möglichkeiten.

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray 
    Dim tempDate As String 
    itemDate = IIf(Trim(itemDate) = "", "0", itemDate) 'Added per OP's request. 
    tempDate = Replace(itemDate, ".", "/") 
    current = Format(CDate(tempDate),"dd/mm/yyyy") 
    if current > highest then 
     highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 
+0

@JasonWilliams Ich werde es zur Antwort hinzufügen, sind Sie sicher, dass Sie "0" verwenden möchten, ist es standardmäßig auf eine Uhrzeit (12:00:00 AM) kein Datum. –

0

Sieht aus wie es den Fehler auf der leeren Datenreihe zu werfen könnte, haben Sie versucht, nur um sicher itemDate isn zu machen ist leer, bevor Sie die CDate() -Funktion ausführen? Ich denke, das könnte dein Problem sein.

+0

Nein, das ist nicht der Fall. Überprüfen Sie die Bearbeitung. –

+1

Ok. Das wäre nützlich gewesen, wenn du deine Daten dort hochgestellt hast. –

+0

Und haben Sie die Formatierung überprüft, die für CDate() benötigt wird, könnte dies nützlich sein, wenn Sie nicht [ähnlicher Thread] (http://stackoverflow.com/questions/7481309/vba-issues-converting-string-to-date) haben -using-format-oder-cdate). Aus den Augen müssen Sie das Datum, an dem Sie gerade vorbeikommen, neu formatieren. –

0

I diesen Code verwendet:

ws.Range ("A: A"). FormulaR1C1 = "= DATWERT (RC) [1]"

Spalte A wird mm/dd/yyyy

RC [1] ist die Spalte B, die Zeichenfolge TEXT, zB 01/30/12, das ist nicht TYPE DATUM auf diese Seite

+0

Dies beantwortet nicht wirklich die Frage. Sie versuchten, 'dd.mm.yyyy' zu parsen, was nativ von den VB/VBA/Excel-Funktionen gehandhabt wird. – Deanna