web-dev-qa-db-ja.com

VBA文字列を日付に変換

Excelシートに次の形式のデータがあります。

アイテムコード配送日
 5456987 2009年1月24日
 5456988 
 5456989 12.24.2009 
 5456990 2009年12月24日

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()関数はエラーをスローします。

実行時エラー '13':

型の不一致

VBAには次の機能がありますか?

  • any日付形式で文字列を解析し、処理する日付オブジェクトを返します。
  • 文字列が空または不正な場合(ループでの比較のため)、空の日付オブジェクトを返します。

編集:

エラーを再現するには、単にmyDate = CDate("24.01.2009")を実行します

6
vulcan raven

Replaceを使用して、うまくいくかどうかを確認してください。上記で何度か言及されているように、私が目にする問題は、CDate関数が期間を窒息させていることです。 replaceを使用して、それらをスラッシュに変更できます。任意の日付形式を解析できる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) 
12
Mark Hall

私はこのコードを使用しました:

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

列Aはyyyy/mm/ddになります

RC [1]は列B、テキスト文字列、たとえば01/30/12、これはIS NOT DATE TYPEです。

0

空のデータ行でエラーをスローしている可能性があるようです。CDate()関数を実行する前に、itemDateが空でないことを確認しようとしましたか?これはあなたの問題かもしれないと思います。

0