Vba-Makro ile İki Tarih Arasındaki Farkın Gün, Ay, Yıl Şeklinde Tam Olarak Hesaplanması

V

VBA|Script|Proje

VBA ile iki tarih arasındaki farkın gün, ay, yıl şeklinde tam olarak elde edilmesine ilişkin bir komut bulunmadığından bir algoritma oluşturmak gerekir. Ancak iki tarih arasındaki farkın hesaplanmasında, kabul edilen yaklaşıma göre sayısal sonuçlarda “görünürde” farklılıklar olacaktır. Söz konusu farklılıklar ayların sabit bir gün içermemesine ve 4 yılda bir yılın 365 değil, 366 gün olmasına bağlı olarak algoritmanın oluşturulma sürecinde kabul edilen yaklaşımlardan kaynaklanmaktadır. Bu sebeple görünürde farklı sonuçlar olsa da esas (gün) olarak aynı sonuca ulaştıran 3 farklı yöntem ile geliştirdiğim algoritmalar tüm detayları ile aşağıda yer almaktadır.

Yöntem-1: İki Tarihin Farkının Alınması

Aşağıdaki algoritmada temel yaklaşım, son tarih ile ilk tarihin sırasıyla gün, ay ve yıl arasındaki farkların alınmasıdır (13.05.2021-11.01.2020=2/4/1 gibi).

Sub ExactDateDiff1()
Dim ilk_tarih As Date, son_tarih As Date, GunSonucu As Integer, AySonucu As Integer, YilSonucu As Integer
Dim GunOperatoru As Integer, AyOperatoru As Integer, YilOperatoru As Integer
Dim AyTakip As Boolean

'1. YÖNTEM
'__________________
'Farklı bir tarih aralığının hesaplatılması için aşağıdaki ilk ve son tarih değerlerinin değiştirilmesi dışında,
'algoritmada herhangi bir değişiklik yapılmasına gerek yoktur.

''Örnek-1
'ilk_tarih = DateValue("31.12.2007")
'son_tarih = DateValue("01.02.2019")
''1. Yöntemin Sonucu: 1/1/11
''2. Yöntemin Sonucu: 1/1/11
''3. Yöntemin Sonucu: 1/1/11

''Örnek-2
'ilk_tarih = DateValue("31.12.2008")
'son_tarih = DateValue("01.03.2019")
''1. Yöntemin Sonucu: 29/1/10
''2. Yöntemin Sonucu: 1/2/10
''3. Yöntemin Sonucu: 1/2/10

'Örnek-3
ilk_tarih = DateValue("05.10.2004")
son_tarih = DateValue("28.06.2019")
'1. Yöntemin Sonucu: 23/8/14
'2. Yöntemin Sonucu: 54/7/14
'3. Yöntemin Sonucu: 23/8/14

'Yukarıdaki x/x/x ifadeleri iki tarih arasındaki farkı sırasıyla gün, ay, yıl olarak temsil eder.
'__________________

'Eğer ilk_tarih son_tarih değerinden küçükse,
'yani aşağıdaki If koşulu gerçekleştiğinde derleyici,
'aşağıdaki If koşulundan sonraki kodları okumadan
'prosedürün en altında yer alan "HesaplamayiAtla:" ifadesinden itibaren okuma yapacak.
'Başlangıç koşulu
If son_tarih < ilk_tarih Then
    GoTo HesaplamayiAtla
End If

AyTakip = False
If Day(son_tarih) >= Day(ilk_tarih) Then
    GunSonucu = Day(son_tarih) - Day(ilk_tarih)
    If Month(son_tarih) >= Month(ilk_tarih) Then 'son_tarihin ayı ilk_tarihin ayından büyük veya ona eşit
        AySonucu = Month(son_tarih) - Month(ilk_tarih)
        YilSonucu = Year(son_tarih) - Year(ilk_tarih)
    Else 'son_tarihin ayı ilk_tarihin ayından küçük
        AyOperatoru = Month(son_tarih) + 12 'Yıldan 12 ay alındı
        YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
        AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
        YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
    End If
Else 'son_tarihin günü ilk_tarihin gününden küçük
    If Month(son_tarih) = 1 Then 'Ocak
        son_tarih = Month(DateAdd("m", -1, son_tarih)) '04.01.2021, 04.12.2020 oldu
        
        GunOperatoru = Day(son_tarih) + 31 '12. ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        '_______
        AyOperatoru = 12 '12. aydan güne 31 gün verildiği için ay 1 azaltılarak 12 oldu
        YilOperatoru = Year(son_tarih)
        AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru=12, Month(ilk_tarih<=12 olmak zorundadır.
        YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
    ElseIf Month(son_tarih) = 2 Then 'Şubat
        GunOperatoru = Day(son_tarih) + 31 '1. ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 3 Then 'Mart
        If Year(son_tarih) Mod 4 = 0 Then '29 gün (Şubat)
            GunOperatoru = Day(son_tarih) + 29
            If GunOperatoru >= Day(ilk_tarih) Then
                GunSonucu = GunOperatoru - Day(ilk_tarih)
                AyTakip = True
            Else
                GunOperatoru = GunOperatoru + 31 '1.ayın gün sayısı
                GunSonucu = GunOperatoru - Day(ilk_tarih)
                
                AyOperatoru = Month(DateAdd("m", -2, son_tarih)) '2 ay geriye gidildiği için
                If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
                    AySonucu = AyOperatoru - Month(ilk_tarih)
                    YilSonucu = Year(son_tarih) - Year(ilk_tarih)
                Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
                    AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
                    YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
                    AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
                    YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
                End If
            End If
        Else '28 gün (Şubat)
            GunOperatoru = Day(son_tarih) + 28
            If GunOperatoru >= Day(ilk_tarih) Then
                GunSonucu = GunOperatoru - Day(ilk_tarih)
                AyTakip = True
            Else
                GunOperatoru = GunOperatoru + 31 '1.ayın gün sayısı
                GunSonucu = GunOperatoru - Day(ilk_tarih)
                
                AyOperatoru = Month(DateAdd("m", -2, son_tarih)) '2 ay geriye gidildiği için
                If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
                    AySonucu = AyOperatoru - Month(ilk_tarih)
                    YilSonucu = Year(son_tarih) - Year(ilk_tarih)
                Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
                    AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
                    YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
                    AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
                    YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
                End If
            End If
        End If
    ElseIf Month(son_tarih) = 4 Then 'Nisan
        GunOperatoru = Day(son_tarih) + 31 '3.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 5 Then 'Mayıs
        GunOperatoru = Day(son_tarih) + 30 '4.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 6 Then 'Haziran
        GunOperatoru = Day(son_tarih) + 31 '5.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 7 Then 'Temmmuz
        GunOperatoru = Day(son_tarih) + 30 '6.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 8 Then 'Ağustos
        GunOperatoru = Day(son_tarih) + 31 '7.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 9 Then 'Eylül
        GunOperatoru = Day(son_tarih) + 31 '8.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 10 Then 'Ekim
        GunOperatoru = Day(son_tarih) + 30 '9.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 11 Then 'Kasım
        GunOperatoru = Day(son_tarih) + 31 '10.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    ElseIf Month(son_tarih) = 12 Then 'Aralık
        GunOperatoru = Day(son_tarih) + 30 '11.ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        AyTakip = True
    End If
    
    '3. ayda kısmen, 2., 4., 5. aylar ve sonrasında tamamen ortak
    'Yani yukarıda AyTakip = True yazan her yere hiçbir değişiklik yapılmadan aşağıdaki kodlar yazılacaktı.
    'Kod tekrarı olmaması amacıyla bu şekilde aşağıda birleştirildi.
    If AyTakip = True Then
        AyOperatoru = Month(DateAdd("m", -1, son_tarih)) 'Aydan güne (28, 29, 30 veya 31) gün verildiği için ay 1 azaltılacak.
        If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
            AySonucu = AyOperatoru - Month(ilk_tarih)
            YilSonucu = Year(son_tarih) - Year(ilk_tarih)
        Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
            AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
            YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
            AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
            YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
        End If
    End If
End If

'SONUÇ
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında tam olarak " & GunSonucu & " gün, " & AySonucu & " ay, " & YilSonucu & " yıl vardır.", vbOKOnly, "ishakkutlu.com"

HesaplamayiAtla:
End Sub

Ön koşul olarak son tarih, kesinlikle ilk tarihten büyük olmalıdır. Bu koşul son tarihin yılının daima ilk tarihin yılından büyük veya ona eşit olması gerektiğini ifade eder. Diğer yöntemlerde de bu koşul geçerlidir. Söz konusu bölüm aşağıda yer almaktadır.

'Başlangıç koşulu
If son_tarih < ilk_tarih Then
    GoTo HesaplamayiAtla
End If

Son tarihin günü ve ayı, ilk tarihin gününden ve ayından büyük veya gününe/ayına eşit ise; son tarihin gününden ilk tarihin gününü, son tarihin ayından ilk tarihin ayını ve son tarihin yılından da ilk tarihin yılını çıkarmak yeterli olacaktır (15.07.2021-10.06.2020=5/1/1 gibi).  Söz konusu bölüm aşağıda yer almaktadır.

If Day(son_tarih) >= Day(ilk_tarih) Then
    GunSonucu = Day(son_tarih) - Day(ilk_tarih)
    If Month(son_tarih) >= Month(ilk_tarih) Then 'son_tarihin ayı ilk_tarihin ayından büyük veya ona eşit
        AySonucu = Month(son_tarih) - Month(ilk_tarih)
        YilSonucu = Year(son_tarih) - Year(ilk_tarih)

Eğer son tarihin günü, ilk tarihin gününden büyük veya ona eşit, ancak son tarihin ayı, ilk tarihin ayından küçükse; son tarihin gününden ilk tarihin gününü çıkarmak mümkün olmakla birlikte, son tarihin ayından ilk tarihin ayını çıkarmak mümkün olmayacaktır. Bu durumda son tarihin yılından 1 yıl alınarak (ve son tarihin yılı da 1 eksiltilerek) son tarihin ayı 12 ay arttırılır. Böylece son tarihin ayından ilk tarihin ayı ve benzer şekilde son tarihin yılından ilk tarihin yılı çıkarılır (15.05.2021-10.06.2020=5/9/0 gibi). Söz konusu bölüm, yukarıdaki bölüme ilave edilerek aşağıda yer almaktadır.

If Day(son_tarih) >= Day(ilk_tarih) Then
    GunSonucu = Day(son_tarih) - Day(ilk_tarih)
    If Month(son_tarih) >= Month(ilk_tarih) Then 'son_tarihin ayı ilk_tarihin ayından büyük veya ona eşit
        AySonucu = Month(son_tarih) - Month(ilk_tarih)
        YilSonucu = Year(son_tarih) - Year(ilk_tarih)
    Else 'son_tarihin ayı ilk_tarihin ayından küçük
        AyOperatoru = Month(son_tarih) + 12 'Yıldan 12 ay alındı
        YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
        AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
        YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
    End If

Eğer son tarihin günü, ilk tarihin gününden küçükse, son tarihin gününden ilk tarihin gününü çıkarmak mümkün olmayacaktır. Bu durumda son tarihin ayından 1 ay alınarak (ve son tarihin ayı da 1 eksiltilerek) son tarihin günü, “bir önceki” ayın gün sayısı kadar (30, 31, Şubat için 4 yılda bir 29, diğer yıllarda 28 gün) arttırılır. Böylece son tarihin gününden ilk tarihin günü, benzer mantık süreciyle son tarihin ayından ilk tarihin ayı ve son tarihin yılından ilk tarihin yılı çıkarılır (05.09.2021-10.06.2020=26/2/1 gibi). Ancak burada ayların gün sayıları birbirinden farklı ve Şubat ayına ilişkin 4 yılda bir artık günün de göz önünde bulundurulması gerekir. Yukarıda da belirtildiği gibi son tarihin ayından 1 ay alınarak son tarihin günü “bir önceki” ayın gün sayısı kadar arttırılır. Bu sebeple 12. ve 2. ayları etkileyen 1. ve 3. ayların kendine özgü koşulları olduğu için algoritmaları diğer aylardan farklı kurgulanmıştır.  Ocak ayının algoritmaları aşağıdadır.

If Month(son_tarih) = 1 Then 'Ocak
        son_tarih = Month(DateAdd("m", -1, son_tarih)) '04.01.2021, 04.12.2020 oldu
        
        GunOperatoru = Day(son_tarih) + 31 '12. ayın gün sayısı
        GunSonucu = GunOperatoru - Day(ilk_tarih)
        '_______
        AyOperatoru = 12 '12. aydan güne 31 gün verildiği için ay 1 azaltılarak 12 oldu
        YilOperatoru = Year(son_tarih)
        AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru=12, Month(ilk_tarih<=12 olmak zorundadır.
        YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.

Son tarihin gününün, ilk tarihin gününden küçük ve son tarihin ayının da ocak ayı olduğu varsayılmıştır. Son tarihin ayından son tarihin günü için 1 ay alınacak olursa, söz konusu 1 ay ocak ayından değil, bir önceki ay olan aralık ayından alınmış olunur (04.01.2021-24.03.2020=11/9/0 gibi). Söz konusu mantık süreci tüm aylar için geçerlidir. Şubat ayının algoritmaları aşağıdadır.

ElseIf Month(son_tarih) = 2 Then 'Şubat
    GunOperatoru = Day(son_tarih) + 31 '1. ayın gün sayısı
    GunSonucu = GunOperatoru - Day(ilk_tarih)
    AyTakip = True

Son tarihin gününün, ilk tarihin gününden küçük ve son tarihin ayının da şubat ayı olduğu varsayılmıştır. Yukarıda da bahsedildiği gibi son tarihin ayından son tarihin günü için 1 ay alınacak olursa, söz konusu 1 ay şubat ayından değil, bir önceki ay olan ocak ayından alınmış olunur. Mart ayı için kısmen, şubat, nisan, mayıs ayları ve sonrasında “AyTakip = True” koşuluna bağlı olarak ortak çalışan algoritmalar aşağıdadır.

'3. ayda kısmen, 2., 4., 5. aylar ve sonrasında tamamen ortak
'Yani yukarıda AyTakip = True yazan her yere hiçbir değişiklik yapılmadan aşağıdaki kodlar yazılacaktı.
'Kod tekrarı olmaması amacıyla bu şekilde aşağıda birleştirildi.
If AyTakip = True Then
    AyOperatoru = Month(DateAdd("m", -1, son_tarih)) 'Aydan güne (28, 29, 30 veya 31) gün verildiği için ay 1 azaltılacak.
    If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
        AySonucu = AyOperatoru - Month(ilk_tarih)
        YilSonucu = Year(son_tarih) - Year(ilk_tarih)
    Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
        AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
        YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
        AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
        YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
    End If
End If

Yukarıdaki algoritmalar şubat ayı (2. ay) için değerlendirilecek olursa, 1. aydan güne 1 ay (yani 31 gün) verildiğinde, son tarihin ayı 1 olacak ve halen ilk tarihin ayından büyük veya ona eşit ise çıkarma yapmak mümkün olacaktır. Ancak son tarihin ayından son tarihin gününe 1 ay (yani 31 gün) verildikten sonra, son tarihin ayı ilk tarihin ayından küçük ise çıkarma yapmak mümkün olmayacaktır. Bu durumda son tarihin yılından 1 yıl alınarak son tarihin yılı 1 eksiltilir, ayı ise 12 arttırılır ve böylece son tarihin ayından ilk tarihin ayını çıkarmak mümkün olur (04.02.2021-24.03.2020=11/10/0 gibi). Son olarak mart ayının algoritmaları aşağıdadır.

ElseIf Month(son_tarih) = 3 Then 'Mart
    If Year(son_tarih) Mod 4 = 0 Then '29 gün (Şubat)
        GunOperatoru = Day(son_tarih) + 29
        If GunOperatoru >= Day(ilk_tarih) Then
            GunSonucu = GunOperatoru - Day(ilk_tarih)
            AyTakip = True
        Else
            GunOperatoru = GunOperatoru + 31 '1.ayın gün sayısı
            GunSonucu = GunOperatoru - Day(ilk_tarih)
            
            AyOperatoru = Month(DateAdd("m", -2, son_tarih)) '2 ay geriye gidildiği için
            If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
                AySonucu = AyOperatoru - Month(ilk_tarih)
                YilSonucu = Year(son_tarih) - Year(ilk_tarih)
            Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
                AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
                YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
                AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
                YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
            End If
        End If
    Else '28 gün (Şubat)
        GunOperatoru = Day(son_tarih) + 28
        If GunOperatoru >= Day(ilk_tarih) Then
            GunSonucu = GunOperatoru - Day(ilk_tarih)
            AyTakip = True
        Else
            GunOperatoru = GunOperatoru + 31 '1.ayın gün sayısı
            GunSonucu = GunOperatoru - Day(ilk_tarih)
            
            AyOperatoru = Month(DateAdd("m", -2, son_tarih)) '2 ay geriye gidildiği için
            If AyOperatoru >= Month(ilk_tarih) Then 'son_tarihin kalan ayı ilk_tarihin ayından büyük veya ona eşit
                AySonucu = AyOperatoru - Month(ilk_tarih)
                YilSonucu = Year(son_tarih) - Year(ilk_tarih)
            Else 'son_tarihin kalan ayı ilk_tarihin ayından küçük
                AyOperatoru = AyOperatoru + 12 'Yıldan 12 ay alındı
                YilOperatoru = Year(DateAdd("yyyy", -1, son_tarih)) 'Aya 12 ay verildiği için yılı 1 azalt
                AySonucu = AyOperatoru - Month(ilk_tarih) 'AyOperatoru>12, Month(ilk_tarih<=12 olmak zorundadır.
                YilSonucu = YilOperatoru - Year(ilk_tarih) 'Başlangıç koşulundan dolayı YilOperatoru>=Year(ilk_tarih) olmak zorundadır.
            End If
        End If
    End If

Yukarıdaki algoritmalar mart ayı (2. ay) için değerlendirilecek olursa, 2. aydan güne verilmek istenen 1 ay, 4’e tam bölünebilen yıllarda (2020 Mod4=0 gibi)  29 gün, 4’e tam bölünemeyen yıllarda (2018 Mod4<>0 gibi) ise 28 güne karşılık gelecektir. Şubat ayının 29 gün olduğu varsayımında, eğer son tarihin ayından gününe 1 ay, yani 29 gün verilmesi durumunda, son tarihin günü ilk tarihin gününden büyük veya ona eşit ise son tarihin gününden ilk tarihin gününü çıkarmak mümkün olacaktır (01.03.2020-20.05.2019=10/9/0 gibi). Bu senaryo, “AyTakip = True” koşuluna bağlı olarak çalışan ortak algoritmalar ile aynıdır.

Ancak şubat ayından gün alınmasına bağlı olarak mart ayını farklı kılan ikinci bir konu daha vardır. Son tarihin gününün 1, ilk tarihin gününün 31 olduğu varsayımında, son tarih için diğer tüm aylardan güne 1 ay vermek yeterli olurken, 2. aydan güne 28 veya 29 gün verildiğinde, son tarihin günü toplamda 29 veya 30 olacaktır. Ancak ilk tarihin günü 31 iken, son tarihin gününden ilk tarihin gününü çıkarmak mümkün olmayacaktır. Bu durumda son tarihin ayından (yani 3’ten 2’ye düşen son tarihin ayından) 1 ay, yani ocak ayından 31 gün daha alınır (01.03.2020-31.05.2019=30/8/0 gibi). Yukarıda “AyTakip=True” ifadesinden sonra gelen Else komutu içindeki kodlar bu koşulu düzenlemektedir.

Bir önceki iki paragrafta yapılan açıklamalar şubat ayının 28 gün olduğu varsayımında da geçerlidir.

Yöntem-2: Gün ve Ayların Tamamlanması

Yukarıda, birinci yöntem ile iki tarih arasındaki farkın gün, ay, yıl şeklinde tam olarak elde edilmesinde özelleştirilmiş bir çıkarma işleminden yararlanılmıştır. Esasında 28.06.2019 ile 05.10.2004 tarihleri arasındaki fark, ilk tarihten son tarihe doğru ilk tarihin günlerinin aya, aylarının da son tarihin yılına ve ayına tamamlanarak son tarihe ulaşılması suretiyle de elde edilebilir. İlk tarihte yer alan 5 Ekim tarihinin, ekim ayını tamamlaması için (ekim ayı 31 gün olduğu için) 26 güne ihtiyacı vardır. Ekim ayını tamamlayan Kasım 2004 değerine sahip ilk tarihin, son tarihin ayını temsil eden Haziran 2019 değerine ulaşması için 7 ay 14 yıla ihtiyacı vardır. Son tarihin haziran ayından gelecek 28 gün ile birlikte, yukarıda ilk tarihin ekim ayını tamamlayan 26 günü, 7 ay 14 yıla ilave edildiğinde, 28.06.2019 ile 05.10.2004 tarihleri arasındaki farkın 54 gün, 7 ay, 14 yıl olduğu da söylenebilir. Ancak birinci yöntem ile iki tarih arasındaki fark 23 gün, 8 ay, 14 yıl olarak elde edilmişti. Eğer tamamlama yaklaşımı ile elde edilen 54 günü, ilk tarihin ayını (5 Ekim) esas alarak ay olarak ifade etmek istersek, ekim 31 gün olduğu için 1 ay 23 gün (54-31=23) olarak da ifade edebiliriz. Eğer ilk ve son tarihlerin ay içindeki artık günlerin toplamının (54 günün), ilk tarihin ayına referans verilmesi tercih edilmezse,  sonuç 23 gün, 8 ay, 14 yıl değil, 54 gün, 7 ay, 14 yıl olur. Söz konusu ikinci yöntemin algoritmaları aşağıdadır.

Sub ExactDateDiff2()
Dim ilk_tarih As Date, son_tarih As Date, GunSonucu As Integer, AySonucu As Integer, YilSonucu As Integer
Dim GunOperatoru As Integer, AyOperatoru As Integer, YilOperatoru As Integer
Dim AyTamamlayici As Boolean

'2. YÖNTEM
'__________________
'Farklı bir tarih aralığının hesaplatılması için aşağıdaki ilk ve son tarih değerlerinin değiştirilmesi dışında,
'algoritmada herhangi bir değişiklik yapılmasına gerek yoktur.

''Örnek-1
'ilk_tarih = DateValue("31.12.2007")
'son_tarih = DateValue("01.02.2019")
''1. Yöntemin Sonucu: 1/1/11
''2. Yöntemin Sonucu: 1/1/11
''3. Yöntemin Sonucu: 1/1/11

''Örnek-2
'ilk_tarih = DateValue("31.12.2008")
'son_tarih = DateValue("01.03.2019")
''1. Yöntemin Sonucu: 29/1/10
''2. Yöntemin Sonucu: 1/2/10
''3. Yöntemin Sonucu: 1/2/10

'Örnek-3
ilk_tarih = DateValue("05.10.2004")
son_tarih = DateValue("28.06.2019")
'1. Yöntemin Sonucu: 23/8/14
'2. Yöntemin Sonucu: 54/7/14
'3. Yöntemin Sonucu: 23/8/14

'Yukarıdaki x/x/x ifadeleri iki tarih arasındaki farkı sırasıyla gün, ay, yıl olarak temsil eder.
'__________________

'Eğer ilk_tarih son_tarih değerinden küçükse,
'yani aşağıdaki If koşulu gerçekleştiğinde derleyici,
'aşağıdaki If koşulundan sonraki kodları okumadan
'prosedürün en altında yer alan "HesaplamayiAtla:" ifadesinden itibaren okuma yapacak.
'Başlangıç koşulu
If son_tarih < ilk_tarih Then
    GoTo HesaplamayiAtla
End If

AyTamamlayici = False
If Year(son_tarih) > Year(ilk_tarih) Then
    AyTamamlayici = True
    AyOperatoru = Month(son_tarih) - Month(ilk_tarih) - 1 'Son ay işleme dahil edilmediğinden 1 ay düşülür.
    YilOperatoru = Year(son_tarih) - Year(ilk_tarih)
    AyOperatoru = AyOperatoru + YilOperatoru * 12
    'MsgBox AyOperatoru
    If AyOperatoru >= 12 Then
        YilSonucu = (AyOperatoru - (AyOperatoru Mod 12)) / 12
        AySonucu = AyOperatoru Mod 12
    Else
        YilSonucu = 0
        AySonucu = AyOperatoru
    End If
ElseIf Year(son_tarih) = Year(ilk_tarih) Then
    YilSonucu = 0
    If Month(son_tarih) > Month(ilk_tarih) Then
        AyTamamlayici = True
        AyOperatoru = Month(son_tarih) - Month(ilk_tarih) - 1 'Son ay işleme dahil edilmediğinden 1 ay düşülür.
        AySonucu = AyOperatoru
    ElseIf Month(son_tarih) = Month(ilk_tarih) Then
        AyTamamlayici = False
        GunSonucu = Day(son_tarih) - Day(ilk_tarih)
        AySonucu = 0
    End If
End If

If AyTamamlayici = True Then
    If Month(ilk_tarih) = 4 Or Month(ilk_tarih) = 6 Or _
        Month(ilk_tarih) = 9 Or Month(ilk_tarih) = 11 Then '30 günlük aylar
        GunSonucu = 30 - Day(ilk_tarih) + Day(son_tarih)
    ElseIf Month(ilk_tarih) = 2 Then 'Şubat 28 veya 29 gün
        If Year(ilk_tarih) Mod 4 = 0 Then '29 gün
            GunSonucu = 29 - Day(ilk_tarih) + Day(son_tarih)
        Else '28 gün
            GunSonucu = 28 - Day(ilk_tarih) + Day(son_tarih)
        End If
    Else '31 günlük aylar
        GunSonucu = 31 - Day(ilk_tarih) + Day(son_tarih)
    End If
End If

'SONUÇ
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında tam olarak " & GunSonucu & " gün, " & AySonucu & " ay, " & YilSonucu & " yıl vardır.", vbOKOnly, "ishakkutlu.com"

HesaplamayiAtla:
End Sub

Birinci yöntemin algoritmasına göre daha basit bir mantığa sahip olan yukarıdaki algoritmada, son tarihin yılı ilk tarihin yılından büyük ise son tarihin ayı ile ilk tarihin ayının ve son tarihin yılı ile ilk tarihin yılının farkı alınır. Farkı alınan yıl, 12 ile çarpılarak aya dönüştürülerek farkı alınan aya ilave edilir. Söz konusu ayların toplamı 12’den büyük veya ona eşit ise Mod işleminden yararlanılarak yıl ve ay sayısı bulunur. Ayların toplamı 12’den küçük ise yılın sonucu sıfıra, ayın sonucu da son tarihin ayı ile ilk tarihin ayının farkına eşit olacaktır. Söz konusu bölüm aşağıda yer almaktadır.

If Year(son_tarih) > Year(ilk_tarih) Then
    AyTamamlayici = True
    AyOperatoru = Month(son_tarih) - Month(ilk_tarih) - 1 'Son ay işleme dahil edilmediğinden 1 ay düşülür.
    YilOperatoru = Year(son_tarih) - Year(ilk_tarih)
    AyOperatoru = AyOperatoru + YilOperatoru * 12
    'MsgBox AyOperatoru
    If AyOperatoru >= 12 Then
        YilSonucu = (AyOperatoru - (AyOperatoru Mod 12)) / 12
        AySonucu = AyOperatoru Mod 12
    Else
        YilSonucu = 0
        AySonucu = AyOperatoru
    End If

Konuyla ilgili olarak mod işlemine kısaca değinmek gerekirse, örneğin 25 Mod 12=1 ifadesi, 25’in 12’ye bölümünden kalanı temsil eder. Eğer 25’in içindeki yıl sayısını elde etmek istersek, 25’ten 25’in 12’ye bölümünden kalan olan 1’i çıkarır ve 12’ye böleriz ({25-1]/12}=2). 25’in 12’ye bölümünden kalan olan 1 ifadesini 25 Mod 12 ile ifade edebileceğimize göre 1 yerine 25 Mod 12  yazılarak ({25-(25 Mod 12)]/12}=2) ifadesi elde edilir.

Son tarihin yılı ilk tarihin yılına eşit ise son tarihin yılı ile ilk tarihin yılının farkı sıfır olur. Yıla ilişkin bir önceki koşul geçerli iken son tarihin ayı ilk tarihin ayından büyük ise son tarihin ayı ile ilk tarihin ayının farkı alınır. Eğer son tarihin ayı ilk tarihin ayına eşit ise son tarihin ayı ile ilk tarihin ayının farkı sıfır olacaktır. Söz konusu bölüm, yukarıdaki bölüme ilave edilerek aşağıda gösterilmiştir.

If Year(son_tarih) > Year(ilk_tarih) Then
    AyTamamlayici = True
    AyOperatoru = Month(son_tarih) - Month(ilk_tarih) - 1 'Son ay işleme dahil edilmediğinden 1 ay düşülür.
    YilOperatoru = Year(son_tarih) - Year(ilk_tarih)
    AyOperatoru = AyOperatoru + YilOperatoru * 12
    'MsgBox AyOperatoru
    If AyOperatoru >= 12 Then
        YilSonucu = (AyOperatoru - (AyOperatoru Mod 12)) / 12
        AySonucu = AyOperatoru Mod 12
    Else
        YilSonucu = 0
        AySonucu = AyOperatoru
    End If
ElseIf Year(son_tarih) = Year(ilk_tarih) Then
    YilSonucu = 0
    If Month(son_tarih) > Month(ilk_tarih) Then
        AyTamamlayici = True
        AyOperatoru = Month(son_tarih) - Month(ilk_tarih) - 1 'Son ay işleme dahil edilmediğinden 1 ay düşülür.
        AySonucu = AyOperatoru
    ElseIf Month(son_tarih) = Month(ilk_tarih) Then
        AyTamamlayici = False
        GunSonucu = Day(son_tarih) - Day(ilk_tarih)
        AySonucu = 0
    End If
End If

Yukarıda yılın ve ayın sonucuna ilişkin algoritmaların arasında yer alan “AyTamamlayici = True” ifadesi dikkatinizi çekmiştir. Bu ifade algoritmada gün sonucuna ilişkin aynı hesaplama süreçlerine sahip bölümler için AyTamamlayici = True” koşuluna bağlı olarak çalışacak şekilde prosedürün altında konumlandırılmıştır.

İkinci yöntemde ilk tarihin gününü ayına tamamlayan artık gün sayısı (05.10.2004, ekim 31 olduğu için 31-5=26) ile son tarihin artık gün sayısının (28.06.2019, yani 28) toplamı (26+28=54) günün sonucu verir. Aşağıda yer alan ve “AyTamamlayici = True” koşuluna bağlı olarak ortak çalışan algoritmalar, tüm aylara göre artık günlerin toplamını (ilk tarihten 26 gün, son tarihten ise 28 gün olmak üzere toplam 54 artık günü) vermektedir.

If AyTamamlayici = True Then
    If Month(ilk_tarih) = 4 Or Month(ilk_tarih) = 6 Or _
        Month(ilk_tarih) = 9 Or Month(ilk_tarih) = 11 Then '30 günlük aylar
        GunSonucu = 30 - Day(ilk_tarih) + Day(son_tarih)
    ElseIf Month(ilk_tarih) = 2 Then 'Şubat 28 veya 29 gün
        If Year(ilk_tarih) Mod 4 = 0 Then '29 gün
            GunSonucu = 29 - Day(ilk_tarih) + Day(son_tarih)
        Else '28 gün
            GunSonucu = 28 - Day(ilk_tarih) + Day(son_tarih)
        End If
    Else '31 günlük aylar
        GunSonucu = 31 - Day(ilk_tarih) + Day(son_tarih)
    End If
End If

Yöntem-3: İki Tarihin Günü ile Ayının Birbirine Eşitlenmesi

Diğer iki yöntemin kurgusundan tamamen farklı olan bu yöntemde, ilk tarihin günü ve ayı, son tarihin gününe ve ayına eşitlenir. Örneğin ilk tarih 07.03.2007 ve son tarih 02.07.2019 olmak üzere, ilk tarihin gününü ve ayını, son tarihin gününe ve ayına eşitlemek amacıyla, ilk tarihin günü 7’den 2’ye (-5) düşürülür, ayı ise 3’ten 7’ye (4) yükseltilir. Böylece yıl da 02.07.2019-02.07.2007=0/0/12 olarak elde edilir. Konuya iki tarih arasındaki fark olarak bakıldığında, sonuç -5 gün, 4 ay, 12 yıl olacaktır. Ancak nihai sonucu negatif bir değerle ifade edemeyiz. Bu yüzden gün değeri olan-5 sebebiyle sonuçtan 5 günü çıkarak bir düzeltme yapmalıyız. Bu durumda da 5 günü hangi aydan çıkarmalıyız sorusu öne çıkacaktır. Son tarihin ayı henüz gerçekleşmemiş bir ay olduğu için 5 günü son tarihin ayından çıkaramayız. Makul olan ilk tarihin ayından (yani 07.03.2007 ve mart ayı 31 gün olduğu için 31-5=26) veya son tarihin bir önceki ayından (02.07.2019 ve haziran ayı 30 gün olduğu için 30-5=25) 5 günü çıkararak gün değerini pozitife çevirmiş oluruz. Son olarak ise bir önceki aşamada ayın sonucu olan 4’ten de 1 çıkarıp ayı 3 olarak ifade ederiz. Sonuç ilk tarihin ayının referans alınması durumunda 26 gün, 3 ay, 12 yıl, son tarihin bir önceki ayının referans alınması durumunda 25 gün, 3 ay, 12 yıl olacaktır. 26 gün 3 ayı güne çevirmek istersek söz konusu 3 ay (mart ayı bir önceki aşamada güne çevrilmiş olduğundan) nisan (30), mayıs (31) ve haziran (30) olacak ve toplamı ise 26+30+31+30=117 gün olacaktır. Benzer şekilde 25 gün 3 ayı güne çevirmek istersek de söz konusu 3 ay (haziran ayı bir önceki aşamada güne çevrilmiş olduğundan) mart (31), nisan (30), mayıs (31) olacak ve toplamı ise 25+31+30+31=117 gün olacaktır. Kolaylık anlaşılacağı gibi her iki yöntemde de iki tarih aralığındaki (ayların ve artık güne sahip yıllarda yılların da güne çevrilmesi koşuluyla) toplam gün sayısı aynı kalacaktır.

Ara sonuçta negatif günün yanı sıra veya gün pozitif olmakla birlikte negatif bir ay söz konusu olursa da yıldan 12 ay alınarak aya aktarılır ve yıldan da 1 düşülür.

Aşağıdaki algoritmalarda, yukarıdaki iki yöntem ile karşılaştırılabilmesi amacıyla, negatif günlerin pozitife dönüştürülmesinde referans ay olarak son tarihin bir önceki ayı esas alınmıştır.

Sub ExactDateDiff3()
Dim ilk_tarih As Date, son_tarih As Date, GunSonucu As Integer, AySonucu As Integer, YilSonucu As Integer
Dim GunOperatoru As Integer, AyOperatoru As Integer, YilOperatoru As Integer

'3. YÖNTEM
'__________________
'Farklı bir tarih aralığının hesaplatılması için aşağıdaki ilk ve son tarih değerlerinin değiştirilmesi dışında,
'algoritmada herhangi bir değişiklik yapılmasına gerek yoktur.

''Örnek-1
'ilk_tarih = DateValue("31.12.2007")
'son_tarih = DateValue("01.02.2019")
''1. Yöntemin Sonucu: 1/1/11
''2. Yöntemin Sonucu: 1/1/11
''3. Yöntemin Sonucu: 1/1/11

''Örnek-2
'ilk_tarih = DateValue("31.12.2008")
'son_tarih = DateValue("01.03.2019")
''1. Yöntemin Sonucu: 29/1/10
''2. Yöntemin Sonucu: 1/2/10
''3. Yöntemin Sonucu: 1/2/10

'Örnek-3
ilk_tarih = DateValue("05.10.2004")
son_tarih = DateValue("28.06.2019")
'1. Yöntemin Sonucu: 23/8/14
'2. Yöntemin Sonucu: 54/7/14
'3. Yöntemin Sonucu: 23/8/14

'Yukarıdaki x/x/x ifadeleri iki tarih arasındaki farkı sırasıyla gün, ay, yıl olarak temsil eder.
'__________________

'Eğer ilk_tarih son_tarih değerinden küçükse,
'yani aşağıdaki If koşulu gerçekleştiğinde derleyici,
'aşağıdaki If koşulundan sonraki kodları okumadan
'prosedürün en altında yer alan "HesaplamayiAtla:" ifadesinden itibaren okuma yapacak.
'Başlangıç koşulu
If son_tarih < ilk_tarih Then
    GoTo HesaplamayiAtla
End If

GunOperatoru = 0
AyOperatoru = 0
YilOperatoru = 0

If Day(ilk_tarih) <> Day(son_tarih) Then
    GunOperatoru = Day(son_tarih) - Day(ilk_tarih)
End If
If Month(ilk_tarih) <> Month(son_tarih) Then
    AyOperatoru = Month(son_tarih) - Month(ilk_tarih)
End If
If Year(ilk_tarih) <> Year(son_tarih) Then
    YilOperatoru = Year(son_tarih) - Year(ilk_tarih)
End If

If GunOperatoru < 0 Then 'Son tarih ile ilk tarihin gün farkı sıfırdan küçük
    'Ancak güne kaç gün aktarılacak? 30, 31, 28 veya 29 mu?
    'Son tarihten bir önceki ay kaç gün ise o kadar aktarılmalı.
    son_tarih = Month(DateAdd("m", -1, son_tarih))
    If Month(son_tarih) = 4 Or Month(son_tarih) = 6 Or _
        Month(son_tarih) = 9 Or Month(son_tarih) = 11 Then '30 günlük aylar
        GunSonucu = GunOperatoru + 30
        AyOperatoru = AyOperatoru - 1
    ElseIf Month(son_tarih) = 2 Then 'Şubat 28 veya 29 gün
        If Year(son_tarih) Mod 4 = 0 Then '29 gün
            GunOperatoru = GunOperatoru + 29
            If GunOperatoru >= 0 Then
                GunSonucu = GunOperatoru
                AyOperatoru = AyOperatoru - 1
            Else
                GunOperatoru = GunOperatoru + 31
                GunSonucu = GunOperatoru
                AyOperatoru = AyOperatoru - 2
            End If
        Else '28 gün
            GunOperatoru = GunOperatoru + 28
            If GunOperatoru >= 0 Then
                GunSonucu = GunOperatoru
                AyOperatoru = AyOperatoru - 1
            Else
                GunOperatoru = GunOperatoru + 31
                GunSonucu = GunOperatoru
                AyOperatoru = AyOperatoru - 2
            End If
        End If
    Else '31 günlük aylar
        GunSonucu = GunOperatoru + 31
        AyOperatoru = AyOperatoru - 1
    End If
Else 'Son tarih ile ilk tarihin gün farkı sıfırdan küçük değil; yani sıfırdan büyük veya sıfıra eşit
    GunSonucu = GunOperatoru
End If

If AyOperatoru < 0 Then
    AySonucu = 12 + AyOperatoru 'Yıldan 12 ay alınır
    YilSonucu = YilOperatoru - 1 'Yıldan 12 ay alındığı için yıldan 1 düşülür
Else
    AySonucu = AyOperatoru
    YilSonucu = YilOperatoru
End If

'SONUÇ
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında tam olarak " & GunSonucu & " gün, " & AySonucu & " ay, " & YilSonucu & " yıl vardır.", vbOKOnly, "ishakkutlu.com"

HesaplamayiAtla:
End Sub

Özetle her üç yöntemde de iki tarih arasındaki fark gün, ay, yıl şeklinde tam olarak elde edilmesine rağmen, sonuçlar görünürde birbirinden farklı olmaktadır. Söz konusu farklılık ayların tümünün belirli bir sabite (örneğin 30’a) eşit olmamasından ve 4 yılda bir, yılın 365 yerine 366 gün çekmesinden kaynaklanmaktadır. Ancak her üç yöntemde de elde edilen sonuçların, yukarıda da gösterildiği gibi algoritmalarda kullanılan varsayım veya yöntemlerden hareketle güne dönüştürülmesi suretiyle birbirlerine eşit olduğu kolaylıkla ispat edilebilir.

 

 

İshak Kutlu, VBA Notları

8 Yorum

  • İshak bey hesaplamalarınız için teşekkür ederim. ALLAHIM İLMİNİZİ ARTIRSIN . benim bir sorum var ,çıkan sonuçları biribinden çıkarma işlemi Örneğinn 16 Yıl 2 Ay 15 günden 2 Ay 20 günü çıkarma ve 20 günü ekleme kodları verirseniz memnun olurum

    • İbrahim Bey,

      İyi dilekleriniz için teşekkür ederim.

      Belirli iki tarih arasında işlem yapmayı kast etmediğinize göre yukarıdaki kodlar kadar karmaşık bir koda ihtiyacınız olmayacak. Basitçe 16 yıl 2 ay 15 günden, 2 ay 20 günü çıkarma ve toplama işlemi sırasıyla şu şekilde olacak:

      (16*360+2*30+15) – (2*30+20) = Fark
      (16*360+2*30+15) + (2*30+20) = Toplam

      Her iki işlemde de sonucu gün olarak elde edeceksiniz. Herhangi bir spesifik tarihe dayalı olarak hesaplama yapılmadığı için; emin olmamakla birlikte, bu tür hesaplamalarda yıl 360 gün, aylar da 30 gün olarak kabul ediliyor. Aksi halde tutarlı sonuçlar elde edilemez. Sonucu tekrar yıl, ay ve gün şeklinde ifade etmek istediğiniz varsayımında şu adımları takip edebilirsiniz:

      Gün olarak elde ettiğiniz sonucu, 360 sayısına bölerseniz, bölüm yıl, kalan ise gün olacaktır. Kalanı 30 sayısına bölerseniz, bu defa bölüm ay ve yine kalan gün olacaktır. Böylece sonucu tekrar yıl, ay ve gün şeklinde ifade etmiş olursunuz. Bu kısımda mod işlemlerini de kullanmalısınız. Aşağıda VBA kodlarını da bulabilirsiniz. Umarım yararlı olur. Kolaylıklar dilerim.

      Sub Test()
      Dim yil1, yil2, ay1, ay2, gun1, gun2 As Integer
      Dim sonuc, kalan, yil_sonuc, ay_sonuc, gun_sonuc As Integer
      Dim x, y As Integer, fark_operatoru As Boolean

      yil1 = 16
      ay1 = 2
      gun1 = 15

      yil2 = 0
      ay2 = 2
      gun2 = 20

      fark_operatoru = True ‘True False ‘Çıkarma işlemi için burası True, toplam işlemi için False olmalıdır.

      ‘Girdileri güne dönüştür.
      x = yil1 * 360 + ay1 * 30 + gun1 * 1
      y = yil2 * 360 + ay2 * 30 + gun2 * 1
      If fark_operatoru = True Then
      sonuc = x – y
      Else
      sonuc = x + y
      End If

      ‘Çıktıları yıl, ay ve gün şeklinde ifade et
      yil_sonuc = Int(sonuc / 360)
      kalan = sonuc Mod 360
      ay_sonuc = Int(kalan / 30)
      kalan = kalan Mod 30
      gun_sonuc = kalan

      MsgBox “Sonuc: ” & yil_sonuc & ” yıl, ” & ay_sonuc & ” ay, ” & gun_sonuc & ” gün.”

      End Sub

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube