2016-03-30 13 views
0

VBA kullanarak MS Access'teki tarihlerle hesaplıyorum. Bu, aynı formda iki tarihim olduğunda (örneğin 2016-01-21), ancak bir dizeyi şu şekilde değiştirmem gerektiğinde iyi olmaz: 20160121 -> 2016-01-21.Uyumsuz türleri CDate() kullanılarak Access VBA'da

Bu benim yapmaya çalıştığım şey bu:

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) 

Bu Hata 13 Uyumsuz türlerini döndürür.

Bu olsa çalışır:

MsgBox CDate("2016-01-21") 

Neden benim yöntemimle çalışır?

+0

Yukarıdaki kod çalışır. Benim tahminim "20160121" 'aslında sabit bir değer değil, Null içerebilen veritabanı alanı mı? Eğer öyleyse, [Nz() işlevini kullanın] (https://msdn.microsoft.com/en-us/library/office/aa172237%28v=office.11%29.aspx?f=255&MSPPError=- 2147217396). – Tomalak

+0

Haklısınız, işe yarıyor ama ... "20160121" yerine, bir metin kutusundan aldığım bir değişken var. Left() ve cDate() çalışmalarında kullanabiliyorum, ancak bunu Mid() 'de kullandığımda bunu yapmıyor ... Bunu daha açık hale getiriyor mu? – PoorCadaver

+0

Hayır, aslında, maalesef. Kodunuzda bir kesme noktası ayarlayın, satır satır boyunca ilerleyin, hatanın oluştuğu satırın tamamını ve bu noktada tüm değişken değerleri not edin. Bu basit bir gözetim olmalı ve gerçek bir sorun değil. – Tomalak

cevap

0

hata oldu: 12345678 yerine. Doğru bir tarihle çalışıyor ...

0

Geçersiz giriş değerleri için ne yapmanız gerektiğine karar vermelisiniz.

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 

döndürür::

Bir seçenek burada varsayılan senin seçimin, bugünün tarihi tarihi veya 1980-01-01 sağlamaktır

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

Yoksa değişebiliriçin Varyantı için veri türü ve numaralı numaralı geçersiz değerleri geri döndürün:

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 

döndürür: Ben sahte tarih ile test çünkü

20160121 -> 2016-01-21 
20160141 -> Null