4

レコードセットで CDate() を使用してテキスト フィールドを日付に変換しようとしていますが、タイプの不一致エラーが発生し続けます。入力テキスト形式は MMDDYYYY です。CDate はこの形式を認識しませんか? 別の機能が必要ですか?何か案は?

Text Date  -> Converted Date
---------     --------------
04122012   -> 04/12/2012


Dim db As DAO.Database
Dim rst As DAO.Recordset

Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_dates", Type:=dbOpenDynaset)

Do Until rst.EOF
rst.Edit
rst![Converted Date]=CDate(rst![Text Date])
rst.Update
rst.MoveNext

Loop

Set rst = Nothing
Set db = Nothing
4

2 に答える 2

11

CDate()月、日、年の部分の間に何らかの種類の区切り文字がないと、日付文字列を受け入れません。この試行は、タイプの不一致エラーで失敗します。

? CDate("04122012")

役立つ場合は、この関数を使用して、日付文字列が受け入れるIsDate()形式であるかどうかを確認できます。CDate()

? IsDate("04122012")
False
? IsDate("04-12-2012")
True
? IsDate("04/12/2012")
True
? CDate("04-12-2012")
4/12/2012
bar = "04122012" : Debug.Print CDate(Left(bar,2) & "-" & _
    Mid(bar,3,2) & "-" & Right(bar,4))
4/12/2012 

編集:システムのロケール設定と日付文字列の形式に不一致がある場合は、これらの日付文字列をyyyy-mm-dd形式に変換して、の問題を回避できますCDate()

bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _
    Left(bar,2) & "-" & Mid(bar,3,2))
4/12/2012 
于 2012-05-08T17:07:23.310 に答える
5

のヘルプにCDateは次のように書かれています。

CDate は、システムのロケール設定に従って日付形式を認識します。認識されている日付設定以外の形式で提供された場合、日、月、年の正しい順序が決定されない場合があります。

ロケール設定による潜在的な混乱を避けるために、次のような式のようにDateSerialの代わりに を使用できます ( MMDDYYYY 形式で常に 8 文字であると仮定します)。CDateText Date

DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2))
于 2012-05-08T21:35:34.900 に答える