Date-Tarih Değişkeni

D

VBA|Seviye|Temel

Tarih veya zaman değerlerinin taşınması için Date değişkeninden yararlanılır. Deklarasyonu ise Dim … As Date şeklinde yapılır.

Private Sub CommandButton1_Click()
Dim Tarih As Date

Tarih = Date

MsgBox Tarih, vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıda örneklendiği gibi Date değişkenin kendisi bugünü gösterir.

1.  Date Format ve DateValue-Tarih Formatı ve Tarih Değeri

Tarihin formatı String bir değişken aracılığıyla aşağıdaki şekilde düzenlenebilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "dd.mm.yyyy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "d.mm.yyyy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "d mmmm yyyy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "yyyy.mm.dd")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "d mmmm yyyy dddd")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "dd.mm.yy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Date

TarihStr = Format(Tarih, "dd-mm-yyyy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String
Tarih = Date

TarihStr = Format(Tarih, "dd.mm.yyyy")
TarihStr = Replace(TarihStr, ".", "/")
‘ya da şu komut kullanılabilir
TarihStr = Format(Tarih, "dd\/mm\/yyyy")

MsgBox TarihStr & " formatı.", vbOKOnly, "ishakkutlu.com"

End Sub

Tarihlerde gün, ay ve yıl arasında “.” ayracı yerine “/” ayracı kullanmak için yukarıda gösterildiği gibi TarihStr = Replace(TarihStr, “.”, “/”) şeklinde bir replace kodu kullanabilirsiniz. Söz konusu kod gün, ay ve yılın arasında bulunan noktaları slash işareti ile değiştirir. Dilerseniz tarih ayracı olarak slash (“/”) kullanmak için doğrudan TarihStr = Format(Tarih, “dd\/mm\/yyyy”) komutunu da kullanabilirsiniz.

Belirli bir tarihin değerini (Tarih gibi) bir Date değişkeninde taşımak için Date(“06.10.2021”) değil, aşağıdaki gibi DateValue(“06.10.2021”) şeklinde bir kod kullanılmalıdır.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = DateValue("06.10.2021")

TarihStr = Format(Tarih, "dd.mm.yyyy")
'Sonuç: 06.10.2021

TarihStr = Format(Tarih, "d.mm.yyyy")
'Sonuç: 6.10.2021

End Sub

Date değişkeninin formatına ilişkin kullanılabilecek değerler aşağıdaki tabloda yer almaktadır.

DeğerÖrnekAçıklama
m06.9.2021Başında sıfır olmadan ay
mm06.09.2021Başında sıfır olan ay
mmm6 Eyl 2021Ayın kısaltması
mmmm6 Eylül 2021Ayın tam adı
d6.09.2021Başında sıfır olmadan gün
dd06.09.2021Başında sıfır olan gün
dddPztGünün kısaltması
ddddPazartesiGünün tam adı
yy21Yılın son iki hanesi
yyyy20214 haneli yıl
h9Başında sıfır olmadan saat (0-23)
hh09Başında sıfır olan saat (00-23)
n (yada m)5Başında sıfır olmadan dakika (0-59)
nn (yada mm)05Başında sıfır olan dakika (00-59)
s7Başında sıfır olmadan saniye (0-59)
ss07Başında sıfır olan saniye (00-59)

2.  Day, Month, Year Metotları-Bir Tarihin Gün, Ay ve Yıl Olarak Ayrıştırılması

Bir tarihin içindeki günü, ayı veya yılı aşağıdaki gibi ayrıştırıp sayı veya isim şeklinde elde edebilirsiniz.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = DateValue("06.10.2021")

TarihStr = Format(Tarih, "d")
MsgBox TarihStr & " (sadece gün)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 6

TarihStr = Format(Tarih, "dddd")
MsgBox TarihStr & " (sadece gün)", vbOKOnly, "ishakkutlu.com"
'Sonuç: Çarşamba

TarihStr = Format(Tarih, "mm")
MsgBox TarihStr & " (sadece ay)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 10

TarihStr = Format(Tarih, "mmmm")
MsgBox TarihStr & " (sadece ay)", vbOKOnly, "ishakkutlu.com"
'Sonuç: Ekim

TarihStr = Format(Tarih, "yyyy")
MsgBox TarihStr & " (sadece yıl)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 2021

End Sub

Yukarıdaki yöntemden farklı olarak bir tarihe ilişkin gün, ay ve yıl, değeri, String değişkene aktarılmadan doğrudan Date formatında Day, Month, Year kodlarıyla da aşağıdaki gibi ayrıştırılabilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = DateValue("06.10.2021")

TarihStr = Day(Tarih)
MsgBox TarihStr & " (sadece gün)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 6

TarihStr = Month(Tarih)
MsgBox TarihStr & " (sadece ay)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 10

TarihStr = Year(Tarih)
MsgBox TarihStr & " (sadece yıl)", vbOKOnly, "ishakkutlu.com"
'Sonuç: 2021

End Sub

3.  Now Format ve TimeValue Metodu-Zaman Formatı ve Zaman Değeri

İçinde bulunulan zamanı gün, ay, yıl, saat, dakika, saniye olarak elde edebilir ve formatını düzenleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = Now()
MsgBox Tarih, vbOKOnly, "ishakkutlu.com"

TarihStr = Format(Tarih, "dd.mm.yyyy, hh:mm:ss")
MsgBox TarihStr, vbOKOnly, "ishakkutlu.com"

TarihStr = Format(Tarih, "hh:mm:ss, dd.mm.yyyy")
MsgBox TarihStr, vbOKOnly, "ishakkutlu.com"

End Sub

4. Hour, Minute, Second Metotları-Zamanın Saat, Dakika ve Saniye Olarak Ayrıştırılması

Gün, ay ve yılın ayrıştırılması gibi saat, dakika ve saniye de ayrıştırılabilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, TarihStr As String

Tarih = TimeValue("10:42:05")

TarihStr = Hour(Tarih)
MsgBox TarihStr, vbOKOnly, "ishakkutlu.com"
'Sonuç: 10

TarihStr = Minute(Tarih)
MsgBox TarihStr, vbOKOnly, "ishakkutlu.com"
'Sonuç: 42

TarihStr = Second(Tarih)
MsgBox TarihStr, vbOKOnly, "ishakkutlu.com"
'Sonuç: 5

End Sub

5.  DateAdd Metodu-Bir Tarihe Gün, Ay veya Yıl Eklemek/Çıkarmak

DateAdd komutu ile aşağıda gösterildiği gibi bir tarihe gün, ay, yıl, hafta vb. ekleyebilir veya bir tarihten gün, ay, yıl, hafta vb. çıkarabilirsiniz.

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date

ilk_tarih = DateValue("27.09.2021")
son_tarih = DateAdd("d", 4, ilk_tarih)
MsgBox son_tarih
'Sonuç: 01.10.2021

ilk_tarih = DateValue("03.01.2021")
son_tarih = DateAdd("d", -5, ilk_tarih)
MsgBox son_tarih
'Sonuç: 29.12.2020

ilk_tarih = DateValue("06.09.2021")
son_tarih = DateAdd("m", 3, ilk_tarih)
MsgBox son_tarih

'Sonuç: 06.12.2021
ilk_tarih = DateValue("06.03.2021")
son_tarih = DateAdd("m", -6, ilk_tarih)
MsgBox son_tarih
'Sonuç: 06.09.2020

ilk_tarih = DateValue("06.09.2021")
son_tarih = DateAdd("yyyy", -5, ilk_tarih)
MsgBox son_tarih
'Sonuç: 06.09.2016

End Sub

DateAdd komutuna ilişkin kullanılabilecek değerler aşağıdaki tabloda yer almaktadır.

DeğerAçıklama
yyyyYear-Yıl
qQuarter-Çeyrek
mMonth-Ay
yDay of the year-Yılın günü
dDay-Gün
wWeekday-Haftanın günü
wwWeek-Hafta
hHour-Saat
nMinute-Dakika
sSecond-Saniye

6.  Excel Hücrelerinin Tarih Formatında Düzenlenmesi

Excel sayfasında yer alan hücrelerin tarih formatını düzenleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Tarih As Date

Tarih = DateValue("06.10.2021")

Range("A1").Value = Tarih
Range("A1").NumberFormat = "dd.mm.yyyy"
'Sonuç: 06.10.2021

Range("A2").Value = Tarih
Range("A2").NumberFormat = "d.mm.yyyy"
'Sonuç: 6.10.2021

Range("A3").Value = Tarih
Range("A3").NumberFormat = "dd\/mm\/yyyy"
'Sonuç: 06/10/2021

Range("A4").Value = Tarih
Range("A4").NumberFormat = "d mmmm yyyy"
'Sonuç: 6 Ekim 2021

Range("A5").Value = Tarih
Range("A5").NumberFormat = "d mmm. yy"
'Sonuç: 6 Eki. 21

End Sub

7.  Tarihlerde Karşılaştırma Yapmak

Tarihleri aşağıda gösterildiği gibi değişkenler üzerinden karşılaştırabilirsiniz.

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date

ilk_tarih = DateValue("06.09.2021") '9 Eylül 2021
son_tarih = DateValue("02.10.2021") '2 Ekim 2021

If ilk_tarih < son_tarih Then 'küçük
    MsgBox "İlk tarih, son tarihten küçük.", vbOKOnly, "ishakkutlu.com"
ElseIf ilk_tarih <= son_tarih Then 'küçük eşit
    MsgBox "İlk tarih, son tarihten küçük veya ona eşit.", vbOKOnly, "ishakkutlu.com"
ElseIf ilk_tarih > son_tarih Then 'büyük
    MsgBox "İlk tarih, son tarihten büyük.", vbOKOnly, "ishakkutlu.com"
ElseIf ilk_tarih >= son_tarih Then 'büyük eşit
    MsgBox "İlk tarih, son tarihten büyük veya ona eşit.", vbOKOnly, "ishakkutlu.com"
ElseIf ilk_tarih = son_tarih Then 'eşit
    MsgBox "İlk tarih, son tarihe eşit.", vbOKOnly, "ishakkutlu.com"
ElseIf ilk_tarih <> son_tarih Then 'eşit değil
    MsgBox "İlk tarih, son tarihe eşit değil.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

Benzer şekilde tarihleri aşağıda gösterildiği gibi Excel sayfasında bulunan hücreler üzerinden de karşılaştırabilirsiniz.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer

Tarih = DateValue("01.01.2021")

'A2 ile A6 arasında Tarih değişkeninden daha büyük tarih değeri
'içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If Range("A" & i).Value > Tarih Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
Next i

End Sub

Yukarıda basit bir For-Next döngüsü kullanıldı. Döngüler konusunda daha detaylı bir şekilde ele alınacak olunmakla birlikte kısaca, i değeri 2’den 6’ya kadar (6 dahil) ardışık olarak 2, 3, 4, 5, 6 değerlerini alır. Örneğin i=2 değerini aldığında Range(“A” & i) ifadesi de Range(“A” & 2), yani Range(“A2”) hücresini temsil eder. Döngünün Next i kısmına gelindiğinde, i=2 değeri sonlanarak bir sonraki i değeri olan i=3 değeri için benzer süreç (Range(“A” & i) ifadesi de Range(“A” & 3), yani Range(“A3”) hücresin, temsil ederek) tekrar eder. Döngü, i=6 değerinde son kez tekrar ederek, döngü sonunda yer alan Next i sonrasında kendisini sonlandırır.

RGB(132, 151, 176) ifadesi ise bir renk kodudur. Excel dosyasından herhangi bir rengin RGB cinsinden renk kodu aşağıdaki resimlerde gösterildiği gibi elde edilebilir.

Tarihlerin kendi değeri yerine, tarihlerin sadece günü, ayı veya yılı aşağıda gösterildiği gibi karşılaştırılabilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer

Tarih = DateValue("01.01.2021")

'A2 ile A6 arasında Tarih değişkeninden daha büyük GÜN değeri
'içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If Day(Range("A" & i).Value) > Day(Tarih) Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
Next i

End Sub

Sadece günlerin karşılaştırıldığı örnek ekran görüntüsü aşağıdadır.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer

Tarih = DateValue("01.01.2021")

''A2 ile A6 arasında Tarih değişkeninden daha büyük AY değeri
''içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If Month(Range("A" & i).Value) > Month(Tarih) Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
Next i

End Sub

Sadece ayların karşılaştırıldığı örnek ekran görüntüsü aşağıdadır.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer

Tarih = DateValue("01.01.2021")

''A2 ile A6 arasında Tarih değişkeninden daha büyük YIL değeri
''içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If Year(Range("A" & i).Value) > Year(Tarih) Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
Next i

End Sub

Sadece yılların karşılaştırıldığı örnek ekran görüntüsü aşağıdadır.

8.  String Bir Değişkeni Date Değişkenine Dönüştürmek

Eğer bir tarih, yukarıda açıklandığı gibi String bir değişken aracılığıyla formatı değiştirilmiş ise daha önce de belirtildiği gibi Date değişkeninin matematiksel özellikleri String değişkene aktarılmayacağı için doğru bir karşılaştırma da yapılamaz.

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date
Dim ilk_tarih_str As String, son_tarih_str As String

ilk_tarih = DateValue("06.09.2021") '9 Eylül 2021
son_tarih = DateValue("02.10.2021") '2 Ekim 2021

ilk_tarih_str = Format(ilk_tarih, "dd.mm.yyyy")
son_tarih_str = Format(son_tarih, "dd.mm.yyyy")
If son_tarih_str > ilk_tarih_str Then
    MsgBox "Son tarih, ilk tarihten büyük; ancak önerme doğrulanamaz.", vbOKOnly, "ishakkutlu.com"
Else
    MsgBox "Son tarih, ilk tarihten büyük olmasına rağmen, tarihler String değişken tipinde olduğu için karşılaştırma yapılamaz.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

String tipinde tarihlerin karşılaştırılması, değişkenlerin Date tipine dönüştürülmesi suretiyle yapılır.

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date
Dim ilk_tarih_str As String, son_tarih_str As String

ilk_tarih = DateValue("06.09.2021") '9 Eylül 2021
son_tarih = DateValue("02.10.2021") '2 Ekim 2021

ilk_tarih_str = Format(ilk_tarih, "dd.mm.yyyy")
son_tarih_str = Format(son_tarih, "dd.mm.yyyy")
If CDate(son_tarih_str) > CDate(ilk_tarih_str) Then
    MsgBox "Son tarih, ilk tarihten büyük; String değişken, Date tipi değişkene dönüştürülerek karşılaştırma yapılabildi.", vbOKOnly, "ishakkutlu.com"
Else
    MsgBox "Son tarih, ilk tarihten büyük ve tarihler String değişken tipinden Date değişken tipine dönüştürüldüğü için karşılaştırma yapılabilir.", vbOKOnly, "ishakkutlu.com"
End If

End Sub

Excel hücrelerine yazılan String tipi tarihlerde karşılaştırma yapabilmek için yukarıdaki sürece benzer şekilde (hücrelere yazılan) String tipi tarihlerin Date değişken tipine dönüştürülmesi gerekir. Örnek bir simülasyon olması amacıyla, aşağıdaki örnek tarih formatları, hücre formatları metne (text) dönüştürülen hücrelere String olarak yazılmıştır.

Private Sub CommandButton1_Click()
Dim TarihStr As String

TarihStr = Format("03.05.2021", "dd.mm.yyyy")
Range("A2").Value = TarihStr
Range("A2").NumberFormat = "@" 'Metin/text formatı

TarihStr = Format("15.06.2019", "d.mm.yyyy")
Range("A3").Value = TarihStr
Range("A3").NumberFormat = "@" 'Metin/text formatı

TarihStr = Format("01.01.2020", "d mmmm yyyy")
Range("A4").Value = TarihStr
Range("A4").NumberFormat = "@" 'Metin/text formatı

TarihStr = Format("29.10.2018", "yyyy.mm.dd")
Range("A5").Value = TarihStr
Range("A5").NumberFormat = "@" 'Metin/text formatı

TarihStr = Format("23.04.2022", "dd\/mm\/yyyy")
Range("A6").Value = TarihStr
Range("A6").NumberFormat = "@" 'Metin/text formatı

End Sub

Yukarıdaki hücrelere yazılan tarihlerin tümü String değişken tipindedir. Dikkat edilirse değerler sayısal değerlerde olduğu gibi sağa değil, metinlerde olduğu gibi sola yaslıdır. Yukarıda String değişken olarak hücrelere yazılan tarihler ile String tipi bir tarihin karşılaştırılması aşağıdaki kodlarla yapılmaya çalışılmıştır.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer, TarihStr As String

Tarih = DateValue("01.01.2021")
TarihStr = Format(Tarih, "dd.mm.yyyy")

'A2 ile A6 arasında Tarih değişkeninden daha büyük tarih değeri
'içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If Range("A" & i).Value > TarihStr Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
    Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
Next i

End Sub

Sonuç aşağıdaki resimde gösterilmektedir.

Kolaylıkla anlaşılabileceği gibi derleyici yanlış bir karşılaştırma yaparak, hücrelerdeki tüm tarihlerin 01.01.2021 tarihinden büyük olduğu sonucuna varmıştır. Yukarıdaki kodların aşağıda gösterildiği gibi Date tipi değişkene dönüştürülmesi suretiyle doğru karşılaştırma yapılabilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, i As Integer, TarihStr As String

Tarih = DateValue("01.01.2021")
TarihStr = Format(Tarih, "dd.mm.yyyy")

'A2 ile A6 arasında Tarih değişkeninden daha büyük tarih değeri
'içeren hücrelerin arka plan (dolgu) rengini değiştir.
For i = 2 To 6
    If CDate(Range("A" & i).Value) > CDate(TarihStr) Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır
    End If
Next i

End Sub

Özetle Date tipi değişkenler dışında (String vb. tipte) tarihler arasında matematiksel işlem yapılabilmesi için kesinlikle söz konusu değişkenin Date tipi değişkene dönüştürülmesi gerekir.

9.  DateDiff Metodu-İki Tarih Arasındaki Gün, Ay, Yıl Farkı

İki tarih arasındaki gün, ay, yıl sayısı DateDiff (DateDifferent) komutu aracılığıyla aşağıdaki gibi elde edilebilir.

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date, Sonuc As Integer

'__________________GÜN

ilk_tarih = DateValue("02.10.2021")
son_tarih = DateValue("05.10.2021")
Sonuc = DateDiff("d", ilk_tarih, son_tarih)
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında " & Sonuc & " gün vardır.", vbOKOnly, "ishakkutlu.com"
'Sonuç: 3 gün

End Sub

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date, Sonuc As Integer

'__________________AY

ilk_tarih = DateValue("07.10.2021")
son_tarih = DateValue("02.02.2022")
Sonuc = DateDiff("m", ilk_tarih, son_tarih)
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında " & Sonuc & " ay vardır.", vbOKOnly, "ishakkutlu.com"
'Sonuç: 4 ay

End Sub

Private Sub CommandButton1_Click()
Dim ilk_tarih As Date, son_tarih As Date, Sonuc As Integer

'__________________YIL

ilk_tarih = DateValue("07.10.2015")
son_tarih = DateValue("02.02.2022")
Sonuc = DateDiff("yyyy", ilk_tarih, son_tarih)
MsgBox son_tarih & " ile " & ilk_tarih & " tarihleri arasında " & Sonuc & " yıl vardır.", vbOKOnly, "ishakkutlu.com"
'Sonuç: 7 yıl

End Sub

DateDiff komutu iki tarih arasındaki farkı gün, ay, yıl şeklinde tam olarak vermez. Örneğin DateDiff komutu, 28.06.2021 ve 08.10.2021 tarihleri arasındaki ay farkını 4 olarak hesaplar. Esasında söz konusu tarihlerin arasında 3 ay, 10 gün vardır.

İki tarih arasındaki farkın gün, ay, yıl şeklinde tam olarak elde edilebilmesi için bir algoritma kurgulamak gerekir. Konuya ilişkin 3 farklı yönteme göre hazırladığım algoritmalar ile ilgili ” VBA-Makro ile İki Tarih Arasındaki Farkın Gün, Ay, Yıl Şeklinde Tam Olarak Hesaplanması” isimli makaleyi inceleyebilirsiniz.

10.  Hafta İçi Günlerin Hesaplanması

Bir tarih değişkeninin karşılık geldiği haftanın günleri (haftanın 7 günü için Weekday komutunun döndürdüğü değerler) aşağıdaki tabloda listelenmiştir.

SabitDeğerGün İsmi
vbSunday1Pazar (varsayılan)
vbMonday2Pazartesi
vbTuesday3Salı
vbWednesday4Çarşamba
vbThursday5Perşembe
vbFriday6Cuma
vbSaturday7Cumartesi

Yukarıdaki tabloda yer alan değerlerden yararlanılarak aşağıdaki gibi belirli bir tarih listesinde yer alan tarihlerden sadece hafta içi günler aşağıdaki algoritma ile elde edilebilir.

Private Sub CommandButton1_Click()
Dim Tarih As Date, Say As Integer, i As Integer

'Yeni başlıklar
Range("B1").Value = "Sadece Hafta İçleri"
Range("B1").Font.Bold = True
Range("C1").Value = "Gün İsimleri"
Range("C1").Font.Bold = True

Say = 1
For i = 2 To 18
    Tarih = CDate(Range("A" & i).Value)
    If Weekday(Tarih) >= 2 And Weekday(Tarih) <= 6 Then
        Range("A" & i).Interior.Color = RGB(132, 151, 176) 'dolgu ekler
        'Range("A" & i).Interior.Color = xlNone 'dolguyu kaldırır

        'Yeni listeyi oluştur
        Say = Say + 1
        Range("B" & Say).Value = Range("A" & i).Value
        Range("B" & Say).NumberFormat = "dd.mm.yyyy" 'Hücrenin formatını tarih yap

        'Yeni listede tarihlerin karşısına gün adlarını yaz.
        Range("C" & Say).Value = Format(Tarih, "dddd")
        Range("C" & Say).NumberFormat = "@" 'Hücrenin formatını metin yap
    End If
Next i

End Sub

Yukarıdaki algoritmada “Yeni Başlıklar” ifadesinin hemen altındaki 4 satırlık kod, adından da anlaşılacağı gibi hafta içi günlerin ve gün isimlerinin yazılacağı kolonların başlıklarını temsil etmektedir. Devamında For döngüsünün 2’den 18’e kadar olması, Tarihler isimli kolonda ilk verinin 2. satırda ve son verinin ise 18. satırda bulunmasından kaynaklanmaktadır. Döngü yardımıyla A kolonunda bulunan tüm tarihler sırayla “Tarih” ismiyle deklare edilen Date değişkene atanır. Sırayla Tarih değişkenine aktarılan tarihlerin hafta içi gününe karşılık gelenleri ayıklamak için Tarih değişkeninin Weekday komutuyla döndürülen değerin 2 ile 6 arasında olması gerekir. Çünkü yukarıdaki tabloda pazartesi, salı, çarşamba, perşembe, cuma günlerini temsil eden hafta içi günlerin değeri, sırasıyla, 2, 3, 4, 5, 6’dır. Eğer Tarih değişkenin aldığı değer bu koşulu sağlıyorsa, yani Weekday(Tarih) komutu 2 ile 6 arasında bir değer döndürmüşse, Tarih değişkenin i. değere göre taşıdığı tarih, aradığımız hafta içi günlere karşılık gelen tarihlerden birisidir. Bu durumda Say değişkenine 1 ilave edilir ve A kolonundaki ilgili tarih değeri B kolonunda 2. satıra yazılır. Çünkü Say değişkeni döngünün dışında, başlangıçta 1 olarak tanımlandığı için döngü içinde yer alan Say değişkenine 1 eklenmesi, Say değişkeninin değerini 2 yapacaktır. Döngü içi hafta içi gün koşuluna uyan her Tarih değişkeninde Say değişkenine 1 ilave daha yapılacağı için hafta içi günleri B kolonuna alt alta yazdırılmış olur. Benzer mantık süreci hafta içi gün isimlerinin C kolonuna yazdırılmasında da geçerlidir.

 

 

İshak Kutlu, VBA Notları

2 Yorum

İ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