Özellik ikonu

DateSerial

İndirme izni yok

Genel Bakış

DateSerial (DateSerial function), verdiğiniz yıl, ay ve gün sayılarından bir tarih değeri (Date türünde Variant) üreten VBA işlevidir. Tarihi metinden çevirmek yerine bileşenlerinden kurduğunuz için bölgesel tarih biçimlerinden etkilenmez. Ay başı, ay sonu, çeyrek başlangıcı ve vade tarihi gibi hesaplarda çok kullanılır.

Söz dizimi​

DateSerial işlevi üç sayısal bağımsız değişken alır ve her zaman üçünü de ister:

VBA
DateSerial(year, month, day)

  • year: Yıl sayısı; zorunludur. 100 ile 9999 arasındaki değerler olduğu gibi kullanılır. 0 ile 99 arasındaki iki haneli değerler Windows'un iki haneli yıl ayarına göre yorumlanır (varsayılan ayarda 0-29 arası 2000-2029, 30-99 arası 1930-1999).
  • month: Ay sayısı; zorunludur. Normal aralık 1-12'dir, bu aralığın dışındaki değerler yıla taşar.
  • day: Gün sayısı; zorunludur. Normal aralık ayın gün sayısı kadardır, bu aralığın dışındaki değerler aya taşar.

Üç bağımsız değişkenin de sayısal olması gerekir. Metin ya da boş hücre gibi sayıya çevrilemeyen bir değer verirseniz çalışma zamanı hatası alırsınız.

Taşan ay ve gün değerleri​

DateSerial normal sınırların dışındaki değerleri hata vermeden doğru tarihe çevirir. Bu özellik tarih aritmetiği için çok kullanışlıdır:

  • Gün 0: Bir önceki ayın son günüdür. Bu yüzden ay sonunu bulmak için bir sonraki ayın 0. gününü isteyebilirsiniz.
  • Negatif gün: Önceki aya doğru geri gider.
  • Gün ayın uzunluğunu aşarsa: Fazlalık sonraki aya geçer.
  • Ay 12'den büyükse: Fazlalık sonraki yıla geçer; ay 0 ya da negatifse önceki yıla gidilir.

VBA 4 satır
DateSerial(2024, 13, 1)   ' 1 Ocak 2025
DateSerial(2024, 3, 0)    ' 29 Şubat 2024 (şubat ayının son günü)
DateSerial(2024, 1, 0)    ' 31 Aralık 2023
DateSerial(2024, 1, 32)   ' 1 Şubat 2024

Ay sayısını artırırken gün sayısı hedef ayın uzunluğunu aşarsa tarih sonraki aya kayar. Örneğin 31 Ocak tarihine bir ay eklediğinizde şubat sonunu değil, mart ayının ilk günlerini elde edersiniz.

Dönüş değeri ve hücreye yazma​

İşlev, Date alt türünde bir Variant döndürür. Bu değeri hücreye yazdığınızda Excel onu tarih seri numarası olarak saklar; ekranda tarih görünmesi için hücrenin NumberFormat özelliğini ayarlamanız gerekir. VBA'da biçim kodları her zaman İngilizce yazılır:

VBA 2 satır
Range("D2").Value = DateSerial(2024, 5, 17)
Range("D2").NumberFormat = "dd.mm.yyyy"

Yıl, ay ve gün değerlerini ayrı ayrı elde etmek için Year, Month ve Day işlevlerini kullanabilir, ardından DateSerial ile yeniden birleştirebilirsiniz.

1. Yıl, ay ve gün sütunlarından tarih üretme​

Sayfada yıl, ay ve gün ayrı sütunlarda duruyor; bazı satırlarda 30 Şubat, 14. ay, 0. gün ve 32. gün gibi sınır dışı değerler var. Aşağıdaki kodu Geliştirici > Visual Basic (Developer > Visual Basic) ile açtığınız standart bir modüle yapıştırın ve makroyu çalıştırın.
VBA 16 satır
Option Explicit

Sub TarihOlustur()
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ActiveSheet

    ' Yıl, ay ve gün sütunlarından gerçek tarih üretir
    For i = 2 To 7
        ws.Cells(i, 4).Value = DateSerial(ws.Cells(i, 1).Value, ws.Cells(i, 2).Value, ws.Cells(i, 3).Value)
    Next i

    ' Sonuç sütununu tarih olarak biçimlendirir
    ws.Range("D2:D7").NumberFormat = "dd.mm.yyyy"
End Sub
DateSerial
Formülünü incelemek için bir hücre seçin.
ABCD
1YılAyGünTarih
2202451717.05.2024
3202423001.03.2024
4202514505.02.2026
520243029.02.2024
62023123201.01.2024
7202411515.01.2024
Tarih ÜretmeExcelDepo v1.0.0
İlk satırda sınır dışı değer olmadığı için tarih doğrudan 17.05.2024 olur. 2024 şubatında 30. gün bulunmadığından fazlalık mart ayına taşar ve sonuç 01.03.2024 olur. 14. ay bir sonraki yıla geçerek 05.02.2026 değerini verir. Gün olarak 0 girildiğinde önceki ayın son günü olan 29.02.2024 elde edilir. 32. gün ise sonraki aya taşar ve 01.01.2024 sonucunu verir.

2. Ay başı, ay sonu ve bir ay sonrası​

Sipariş tarihlerinden her satır için ayın ilk gününü, son gününü ve bir ay sonrasını hesaplayacaksınız. Sipariş tarihlerinden biri 31 Ocak olduğu için bir ay sonrası hesabında taşma davranışını da göreceksiniz. Kodu standart bir modüle yapıştırıp çalıştırın.
VBA 24 satır
Option Explicit

Sub AySinirlari()
    Dim ws As Worksheet
    Dim i As Long
    Dim t As Date

    Set ws = ActiveSheet

    For i = 2 To 6
        t = ws.Cells(i, 2).Value

        ' Ayın ilk günü
        ws.Cells(i, 3).Value = DateSerial(Year(t), Month(t), 1)

        ' Ayın son günü: sonraki ayın 0. günü
        ws.Cells(i, 4).Value = DateSerial(Year(t), Month(t) + 1, 0)

        ' Aynı gün numarasıyla bir ay sonrası (taşma olabilir)
        ws.Cells(i, 5).Value = DateSerial(Year(t), Month(t) + 1, Day(t))
    Next i

    ws.Range("C2:E6").NumberFormat = "dd.mm.yyyy"
End Sub
DateSerial
Formülünü incelemek için bir hücre seçin.
ABCDE
1Sipariş NoSipariş TarihiAy BaşıAy SonuBir Ay Sonrası
2SP-00131.01.202401.01.202431.01.202402.03.2024
3SP-00215.02.202401.02.202429.02.202415.03.2024
4SP-00331.03.202401.03.202431.03.202401.05.2024
5SP-00410.12.202301.12.202331.12.202310.01.2024
6SP-00531.08.202401.08.202431.08.202401.10.2024
Ay SonuExcelDepo v1.0.0
İlk siparişin ay başı 01.01.2024, ay sonu 31.01.2024 olarak bulunur. Şubat siparişinin ay sonu, artık yıl nedeniyle 29.02.2024 değerini verir. Aynı gün numarasıyla bir ay sonrası hesabında 31 Ocak siparişi sonraki aya taştığı için 02.03.2024 çıkar; 31 Mart siparişi ise nisan 30 gün olduğundan 01.05.2024 sonucunu verir. Her zaman ay sonuna denk gelmesini istiyorsanız bir ay sonrası için de gün olarak 0 kullanıp iki ay ilerisini isteyin.

3. Sekiz haneli kodu tarihe çevirme​

Muhasebe programından gelen fatura tarihleri yyyyaagg biçiminde sekiz haneli kod olarak duruyor. Makro kodu parçalara ayırıp DateSerial ile gerçek tarihe çevirir ve her faturanın içinde bulunduğu çeyreğin başlangıcını da hesaplar. Kodu standart bir modüle yapıştırın.
VBA 24 satır
Option Explicit

Sub KodtanTarih()
    Dim ws As Worksheet
    Dim i As Long
    Dim kod As String
    Dim d As Date

    Set ws = ActiveSheet

    For i = 2 To 6
        ' Kod sayı ya da metin olsa da CStr ile metne çevrilir
        kod = CStr(ws.Cells(i, 2).Value)

        ' Yıl, ay ve gün parçalarını ayırıp tarihe dönüştürür
        d = DateSerial(CInt(Left(kod, 4)), CInt(Mid(kod, 5, 2)), CInt(Right(kod, 2)))
        ws.Cells(i, 3).Value = d

        ' İçinde bulunulan çeyreğin ilk günü (1, 4, 7 veya 10. ay)
        ws.Cells(i, 4).Value = DateSerial(Year(d), ((Month(d) - 1) \ 3) * 3 + 1, 1)
    Next i

    ws.Range("C2:D6").NumberFormat = "dd.mm.yyyy"
End Sub
DateSerial
Formülünü incelemek için bir hücre seçin.
ABCD
1Fatura NoTarih KoduFatura TarihiÇeyrek Başı
2FTR-1012024031515.03.202401.01.2024
3FTR-1022024070202.07.202401.07.2024
4FTR-1032024113030.11.202401.10.2024
5FTR-1042025010909.01.202501.01.2025
6FTR-1052024063030.06.202401.04.2024
Tarih KoduExcelDepo v1.0.0
İlk kod 15.03.2024 tarihine dönüşür ve bu fatura 01.01.2024 ile başlayan çeyreğe aittir. Temmuz faturasının çeyrek başı 01.07.2024, kasım faturasının çeyrek başı 01.10.2024 olarak hesaplanır. Ocak 2025 tarihli fatura için sonuç 01.01.2025 olur; haziran sonu faturası ise ilk çeyreğin değil ikinci çeyreğin içinde kaldığından 01.04.2024 değerini verir.

Kullanırken dikkat edin​

  • İki haneli yıllara dikkat edin: 0 ile 99 arasındaki yıl değerleri Windows'un iki haneli yıl ayarına göre yorumlanır, bu yüzden aynı kod farklı bilgisayarlarda farklı sonuç verebilir. Kesin sonuç için her zaman dört haneli yıl kullanın.
  • Hata oluşabilecek durumlar: Sonuç tarihi VBA'nın desteklediği aralığın dışına çıkarsa (yıl 100'ün altı ya da 9999'un üstü) çalışma zamanı hatası oluşur. Bağımsız değişkenlerden biri metin, hata değeri ya da boş (Null) olursa da hata alırsınız. Hücreden okuduğunuz değerleri kullanmadan önce IsNumeric ile denetlemek iyi bir alışkanlıktır.
  • Ay ilerletirken gün taşması: Bir tarihe ay eklemek için DateSerial(Year(t), Month(t) + n, Day(t)) kalıbını kullanırsanız 29, 30 ve 31. günlerde sonraki aya kayma olabilir. Ay sonuna sabitlemek gerekiyorsa gün için 0 kullanın ya da DateAdd işlevini tercih edin; DateAdd taşma yerine hedef ayın son gününü verir.
  • Biçimi ayrı ayarlayın: DateSerial bir tarih değeri üretir, görünümünü belirlemez. Hücreye yazdıktan sonra NumberFormat özelliğini ayarlamazsanız hücrede 45000 gibi bir seri numarası görebilirsiniz. VBA'da biçim kodları her zaman İngilizce yazılır (dd.mm.yyyy gibi).
  • Çalışma sayfası işleviyle farkı: Çalışma sayfasındaki TARİH işlevi de benzer şekilde yıl, ay ve gün alır ve taşmaları aynı biçimde çözer. Ancak sayfa işlevinde 0-1899 arası yıl değerlerine 1900 eklenir; VBA'daki DateSerial'da ise 0-99 arası değerler iki haneli yıl kuralıyla yorumlanır. Bu yüzden iki işlevin sonuçlarını kıyaslarken yılı dört haneli verin.
  • İlgili konular:
    • DateAdd: Bir tarihe gün, ay ya da yıl ekler.
    • DateDiff: İki tarih arasındaki farkı hesaplar.
    • DateValue: Metin olarak yazılmış tarihi tarih değerine çevirir.
    • TimeSerial: Saat, dakika ve saniyeden saat değeri üretir.
    • Year, Month, Day: Bir tarihin bileşenlerini verir.
    • Date ve Now: Bugünün tarihini ve şu anki zamanı verir.
    • NumberFormat: Hücrenin sayı ve tarih biçimini belirler.
    • TARİH, AYSONU, TARİHSAYISI: Aynı işi çalışma sayfası formülleriyle yapan işlevler.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
12
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst