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.
Üç 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.
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.
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.
İ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.
İ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.
İ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.
Söz dizimi
DateSerial işlevi üç sayısal bağımsız değişken alır ve her zaman üçünü de ister: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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Yıl | Ay | Gün | Tarih |
| 2 | 2024 | 5 | 17 | 17.05.2024 |
| 3 | 2024 | 2 | 30 | 01.03.2024 |
| 4 | 2025 | 14 | 5 | 05.02.2026 |
| 5 | 2024 | 3 | 0 | 29.02.2024 |
| 6 | 2023 | 12 | 32 | 01.01.2024 |
| 7 | 2024 | 1 | 15 | 15.01.2024 |
Tarih ÜretmeExcelDepo v1.0.0
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Sipariş No | Sipariş Tarihi | Ay Başı | Ay Sonu | Bir Ay Sonrası |
| 2 | SP-001 | 31.01.2024 | 01.01.2024 | 31.01.2024 | 02.03.2024 |
| 3 | SP-002 | 15.02.2024 | 01.02.2024 | 29.02.2024 | 15.03.2024 |
| 4 | SP-003 | 31.03.2024 | 01.03.2024 | 31.03.2024 | 01.05.2024 |
| 5 | SP-004 | 10.12.2023 | 01.12.2023 | 31.12.2023 | 10.01.2024 |
| 6 | SP-005 | 31.08.2024 | 01.08.2024 | 31.08.2024 | 01.10.2024 |
Ay SonuExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Fatura No | Tarih Kodu | Fatura Tarihi | Çeyrek Başı |
| 2 | FTR-101 | 20240315 | 15.03.2024 | 01.01.2024 |
| 3 | FTR-102 | 20240702 | 02.07.2024 | 01.07.2024 |
| 4 | FTR-103 | 20241130 | 30.11.2024 | 01.10.2024 |
| 5 | FTR-104 | 20250109 | 09.01.2025 | 01.01.2025 |
| 6 | FTR-105 | 20240630 | 30.06.2024 | 01.04.2024 |
Tarih KoduExcelDepo v1.0.0
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.