ETARİHLİ ve DateDiff komutu hakkında

Katılım
5 Ocak 2009
Mesajlar
1,586
Excel Vers. ve Dili
2003 Türkçe
Selam,

1.sorum;
Aşağıdaki koddaki ETARİHLİ ile 2 tarih arasındaki yıl,ay,gün farklarnıı buluyorum.
Kod:
Sub tarih_farkı()

Range("O1") = "=DATEDIF(""01.05.2004"",""17.03.2010"",""y"")"
Range("P1") = "=DATEDIF(""01.05.2004"",""17.03.2010"",""ym"")"
Range("Q1") = "=DATEDIF(""01.05.2004"",""17.03.2010"",""md"")"

End Sub
ve sonuç olarak
O1= 5 yıl
P1= 10 ay
Q1= 16 gün çıkıyor. Benim isteğim budur.

Ancak bunu yerine DateDiff ile aşağıdaki kodları kullandığımda
Kod:
Sub tarih_farkı()

yıl = DateDiff("yyyy", CDate("01.05.2004"), CDate("17.03.2010"))
ay = DateDiff("m", CDate("01.05.2004"), CDate("17.03.2010"))
gün = DateDiff("d", CDate("01.05.2004"), CDate("17.03.2010"))

MsgBox yıl & "-" & ay & "-" & gün

End Sub
sonuç olarak 6-70-2146 (yani yıl=6, ay=70, gün=2146) olarak buluyor?

ETARİHLİ ile DateDiff 'in sonuçları neden aynı çıkmıyor?


2.Sorum;
Kod:
Range("O1") = "=DATEDIF(""01.05.2004"",""17.03.2010"",""y"")"
kodunu Range("O1") 'e değil de MsgBox'a veya kullanıcı tanımlı'ya yazmak istedim. Aşağıdaki gibi denedim. Olmadı. Sebebi nedir? Neden diğer formüller gibi çalıştıramadım? msgbox'a nasıl aktarabilirim?
Kod:
MsgBox Evaluate("=DATEDIF(""01.05.2004"",""17.03.2010"",""y"")")
3.sorum;
DateDiff(Interval As String, Date1, Date2)'deki Interval as String bölümüne "y", "yyyy", "m", "d" 'den başka özellikleri nelerdir?

Yardımcı olabilirseniz çok sevinirim.
İyi çalışmalar.
 

Ömer

Moderatör
Yönetici
Katılım
18 Ağustos 2007
Mesajlar
22,184
Excel Vers. ve Dili
Microsoft 365 Tr
Ofis 2016 Tr
Merhaba,

Kısaca ve bilgimin yettiğince anlatmaya çalışayım.

DateDif fonksiyonunu vba'da "=DateDif bu biçiminde formül ile excel çalışma sayfasını yazdırabilirsiniz fakat vba içinde ayrı olarak kullanamazsınız. Bunun zıttı olarak da DateDiff fonksiyonunu vba da kullanabilirsiniz fakat excel çalılşma sayfasında formül biçiminde kullanamazsınız.

2. sorunuzun cevabını bu açıklama karşılar sanırım.

1.sorunuza dönersek; DateDiff ile aynı sonucu almak için ise aşağıdaki gibi bir kod yazılabilir. ( Bu mantığı Sayın Alpen'in çalışmalarından öğrenmiştim.)

Kod:
Sub DateDiff_Tarih_Farkı()
    Dim Tarih1 As Date, Tarih2 As Date
 
    Tarih1 = CDate("01.05.2004")
    Tarih2 = CDate("17.03.2010")
 
    Yıl = DateDiff("yyyy", Tarih1, Tarih2)
    Ay = DateDiff("m", Tarih1, Tarih2) + (Day(Tarih1) > Day(Tarih2))
 
    Yıl = Yıl + ((Ay - Yıl * 12) < 0)
    Ay = Ay Mod 12
 
    Gün = DateDiff("d", Tarih1, Tarih2) - DateDiff("d", Tarih1, _
    DateAdd("yyyy", Yıl, DateAdd("m", Ay, Tarih1)))
 
    MsgBox Yıl & "-" & Ay & "-" & Gün
End Sub
3. sorunuzdaki argumanları vba daki yardım menüsünden bulabilirsiniz..

Kod:
[U][B]Setting[/B][/U]    [U][B]Description[/B][/U]
 
yyyy    Year
q    Quarter
m    Month
y    Day of year
d    Day
w    Weekday
ww    Week
h    Hour
n    Minute
s    Second
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,384
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Ben de aşağıdaki fonksiyon ile hesaplıyorum.

Kod:
Function DateDiffZ(ByRef kucuk As Date, ByRef buyuk As Date) As String
Dim yil As Integer, ay As Byte, gun As Byte

    If Day(buyuk) < Day(kucuk) Then
    
        gun = buyuk - DateSerial(Year(buyuk), Month(buyuk) - 1, Day(buyuk))
        gun = gun + Day(buyuk) - Day(kucuk)
        
        If Month(buyuk) <= Month(kucuk) Then
            yil = (Year(buyuk) - 1) - Year(kucuk)
            ay = 12 + (Month(buyuk) - 1) - Month(kucuk)
        Else
            yil = Year(buyuk) - Year(kucuk)
            ay = Month(buyuk) - Month(kucuk) - 1
        End If
        
    Else
    
        gun = Day(buyuk) - Day(kucuk)
        
        If Month(buyuk) < Month(kucuk) Then
            yil = (Year(buyuk) - 1) - Year(kucuk)
            ay = 12 + Month(buyuk) - Month(kucuk)
        Else
            yil = Year(buyuk) - Year(kucuk)
            ay = Month(buyuk) - Month(kucuk)
        End If
        
    End If

DateDiffZ = yil & " YIL " & ay & " AY " & gun & " GÜN"
End Function
 
Katılım
5 Ocak 2009
Mesajlar
1,586
Excel Vers. ve Dili
2003 Türkçe
Merhaba,

Kısaca ve bilgimin yettiğince anlatmaya çalışayım.

DateDif fonksiyonunu vba'da "=DateDif bu biçiminde formül ile excel çalışma sayfasını yazdırabilirsiniz fakat vba içinde ayrı olarak kullanamazsınız. Bunun zıttı olarak da DateDiff fonksiyonunu vba da kullanabilirsiniz fakat excel çalılşma sayfasında formül biçiminde kullanamazsınız.

2. sorunuzun cevabını bu açıklama karşılar sanırım.
Selam Sayın Ömer Hocam,
Nasılsınız?
Çoktandır Sizin kafanızı ağrıtmıyordum. Nasip ETARİHLİ koduna imiş:))
Açıklamalarınız ve yardımlarınız için çok teşekkür ederim. Sizlerden istifade ile,
2. sorumu şu şekil giderdim. Bu sayede 1. soruma da çözüm olmuş oldu.

Kod:
Sub tarih_farkı()
   
    T1 = CLng(CDate("15.03.2006"))
    T2 = CLng(CDate("01.01.2010"))
    
    YIL = Evaluate("=DATEDIF(" & T1 & "," & T2 & ",""y"")")
    AY = Evaluate("=DATEDIF(" & T1 & "," & T2 & ",""ym"")")
    GÜN = Evaluate("=DATEDIF(" & T1 & "," & T2 & ",""md"")")
    MsgBox YIL & " Yıl , " & AY & " Ay , " & GÜN & " Gün"

End Sub
metni önce tarihe sonra da, sayıya çeviriyorum. Bu sayede VBA'nın DATEIFF yerine Excel'in DATEIF'ini kullanarak daha kısa pratik sonuç elde ediyorum.
Üstelik herhangi bir aralıktan almadan ve herhangi bir aralığa yazmadan Msgbox'a yazabiliryorum.

Kodlarından alıntı yaptığım Sayın Korhan Ayhan hocam'a ve sizlere çok teşekkür ederim.
 
Katılım
5 Ocak 2009
Mesajlar
1,586
Excel Vers. ve Dili
2003 Türkçe
Ben de aşağıdaki fonksiyon ile hesaplıyorum.
Selam Sayın Zeki Hocam,
yardımlarınız için çok teşekkür ederim.
Ben de 4. mesajımda DateDiff yerine DATEDIF'i evaluate içinde kullanarak tarih farkını buldum. Bana daha sade ve pratik geldi. Ancak, sizin verdiğiniz kodlar sayesinde DateDiff'in mantığı öğrendim.

Çok teşekkürler.
İyi çalışmalar.
 
Üst