2016-03-30 9 views
0

VBAを使用してMS Accessで日付を計算しています。これは、同じフォーム(例2016-01-21)に2つの日付がある場合にはうまく動作しますが、最初にこのような日付形式に文字列を変更する必要はありません:20160121 - > 2016-01-21Access VBAでCDate()を使用する互換性のないタイプ

これは私がやろうとしているものです:

Dim sYear As String, sMonth As String, sDay As String, sDate As String 

sYear = Left("20160121", 4) 
sMonth = Mid("20160121", 5, 2) 
sDay = Mid("20160121", 7, 2) 

sDate = sYear & "-" & sMonth & "-" & sDay 

MsgBox CDate(sDate) 

これはエラー13、互換性のない型を返します。

これはしかし作品:

MsgBox CDate("2016-01-21") 

はなぜ私の方法では動作しませんか?

+0

上記のコードは動作します。私の推測では、 "20160121"は実際には固定値ではなく、Nullを含むことができるデータベースフィールドですか?そうであれば、[Nz() '関数](https://msdn.microsoft.com/en-us/library/office/aa172237%28v=office.11​​%29.aspx?f=255&MSPPError=- 2147217396)。 – Tomalak

+0

あなたは正しいですが、それは動作しますが... "20160121"の代わりに、変数varをテキストボックスから取得します。私は左()とcDate()の作業でユーザvarを使うことができますが、Mid()で使用するときはそうではありません...それはもっと明確になりますか? – PoorCadaver

+0

いいえ、残念ながら、実際はありません。コード内にブレークポイントを設定し、行単位でステップ実行し、エラーが発生した正確な行とその時点のすべての変数値を書き留めます。これは簡単な見落としであり、実際の問題ではありません。 – Tomalak

答えて

0

エラー:12345678代わりに。正しい日付でそれは正常に動作します...

0

無効な入力値に対して何をすべきかを決める必要があります。

Public Function ConvertDate(ByVal TextDate As String) As Date 

    Dim RealDate As Date 
    Dim NullDate As Date 

    NullDate = #1/1/1980# 

    TextDate = Format(TextDate, "@@@@/@@/@@") 
    If IsDate(TextDate) Then 
     RealDate = CDate(TextDate) 
    Else 
     RealDate = NullDate 
    End If 

    ConvertDate = RealDate 

End Function 

が返されます:

1つのオプションは、ここでデフォルトの選択肢、今日の日付の日付または1980年1月1日を提供することである

20160121 -> 2016-01-21 
20160141 -> 1980-01-01 

それとも、変更される可能性がありデータ型:RealDateバリアントおよび返信無効日のヌル

Public Function ConvertDate(ByVal TextDate As String) As Variant 

    Dim RealDate As Variant 
    Dim NullDate As Variant 

    NullDate = Null  

    TextDate = Format(TextDate, "@@@@/@@/@@") 
    If IsDate(TextDate) Then 
     RealDate = CDate(TextDate) 
    Else 
     RealDate = NullDate 
    End If 

    ConvertDate = RealDate 

End Function 

が返されます:私は偽の日付でテストしているため

20160121 -> 2016-01-21 
20160141 -> Null 
関連する問題