2012-05-08 14 views
3

レコードセット内でCDate()を使用してテキストフィールドを日付に変換しようとしていますが、型の不一致エラーが続いています。入力テキスト形式はMMDDYYYYです。 CDateはこの形式を認識しませんか?私は別の機能が必要ですか?何か案は?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 

答えて

7

CDate()は、月、日、年の部分の間の区切り文字のいくつかの種類せずにあなたの日付文字列を受け付けません。この試行は、タイプの不一致エラーで失敗します。それは便利です場合

? CDate("04122012") 

は、あなたが受け入れる形式CDate()であなたの日付文字列があるかどうかを確認するIsDate()機能を使用することができます。

? 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 

編集:お使いのシステムのロケール設定とあなたの日付文字列の形式との間に不一致がある場合は、CDate()の問題を回避するためにYYYY-MM-DD形式にそれらの日付文字列を変換することができます。

bar = "04122012" : Debug.Print CDate(Right(bar,4) & "-" & _ 
    Left(bar,2) & "-" & Mid(bar,3,2)) 
4/12/2012 
+0

おかげ@HansUpを私は何か愚かなことをしているに違いないと思った! – regulus

+0

+1非常に正確です。 – jacouh

5

CDateのヘルプは言う:

CDate関数は、システムのロケール設定に従って日付形式を認識します。日、月、および年の正しい順序は、認識された日付の設定以外の形式で提供されている場合は決定できません。

によるロケール設定に潜在的な混乱を避けるために、あなたは(Text Dateは常にMMDDYYYY形式で8つの文字があると仮定して)このような表現のように、DateSerial代わりのCDateを使用する可能性があります:、

DateSerial(Right(rst![Text Date], 4), Left(rst![Text Date], 2), Mid(rst![Text Date], 3, 2)) 
+1

+1いつもDateSerialメソッドが好きです –