2012-07-21 583 views
6

我有一個excel工作表以下列格式數據:VBA轉換字符串到日期

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

我已經存儲在數組DeliveryDate的值。我需要決定日期的基礎知識,然後將結果打印在新的工作表中。所以,我必須將這些值轉換成數組:

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) 

不幸的是,CDATE()函數引發錯誤:

Run-time error '13':

Type mismatch

是否有VBA一個功能,可以:

  • 解析字符串與任何日期格式並返回一個日期對象來處理。
  • 返回一個空的日期對象,如果該字符串爲空或格式錯誤(用於循環中的比較)。

編輯:

重現錯誤,只需運行 myDate = CDate("24.01.2009")

+0

據本網[http://www.example-code.com /vb/stringtodate.asp]你這樣做是正確的。它在哪裏拋出錯誤?在哪一行上 - 第一行或第二行(空字符串)?你有沒有嘗試改變字符串格式?你可能想要改變你在那裏解析你的日期字符串的格式。 「2009年1月24日」可能不被承認,但「2009年12月24日」可能 - 嘗試轉換2009年12月24日只,並看看它是否有效。如果確實有效,那麼2009年1月24日的格式可能是不可接受的。 – 2012-07-21 02:58:14

+0

嘗試轉換12/24/2009以查看它是否有效。如果它確實起作用,那麼格式dd.MM.yyyy可能不適用於CDate。您可能有一種方法可以指定它的格式,以便可以按照您希望的方式進行解析。如果dd.MM.yyyy格式是導致問題的原因,請首先更改格式,例如替換「。」。用「/」並嘗試再次轉換它。或將其格式化爲MM/dd/yyyy,然後將其轉換。我想我只想知道「12/24/2009」是否會出錯。先檢查並讓我知道。 – 2012-07-21 03:08:54

+0

@AnnB。,我的第一個問題是,是否有一個VBA函數可以用任何*日期格式解析字符串並返回一個日期對象來處理? – 2012-07-21 03:12:59

回答

8

嘗試使用Replace以查看它是否適合您。正如我所看到的,上面已經提到過幾次的問題是CDate功能在這段時間內令人窒息。您可以使用替換將它們更改爲斜槓。要回答你關於可以解析任何日期格式的vba函數的問題,沒有任何你有非常有限的選擇。

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我將它添加到答案,你確定要使用「0」它默認爲一個時間(12:00:00上午)不是日期。 – 2012-07-21 04:50:17

0

看起來可能在空數據行被拋出錯誤,你有沒有試過只要確保itemDate ISN在運行CDate()函數之前沒有空?我認爲這可能是你的問題。

+0

沒有它的情況。檢查編輯。 – 2012-07-21 03:10:35

+1

好的。如果你把數據放在那裏,那將是有用的。 – 2012-07-21 03:22:08

+0

並且你檢查了CDate()所需的格式,如果你沒有[類似的線程],這可能是有用的(http://stackoverflow.com/questions/7481309/vba-issues-converting-string-to-date - 使用格式或 - CDATE)。從它的外觀你可能需要重新格式化你通過的日期。 – 2012-07-21 03:28:56

0

我用這個代碼:

ws.Range( 「A:A」)。FormulaR1C1 = 「= DATEVALUE(RC [1])」

列A將MM/DD月/年

RC [1]是列B,文本串,例如,12年1月30日,這不是DATE TYPE

+0

這並沒有真正回答這個問題。他們試圖解析'dd.mm.yyyy',它不是由VB/VBA/Excel函數原生處理的。 – Deanna 2012-10-11 09:55:59