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 SubDate değişkeninin formatına ilişkin kullanılabilecek değerler aşağıdaki tabloda yer almaktadır.
| Değer | Örnek | Açıklama |
| m | 06.9.2021 | Başında sıfır olmadan ay |
| mm | 06.09.2021 | Başında sıfır olan ay |
| mmm | 6 Eyl 2021 | Ayın kısaltması |
| mmmm | 6 Eylül 2021 | Ayın tam adı |
| d | 6.09.2021 | Başında sıfır olmadan gün |
| dd | 06.09.2021 | Başında sıfır olan gün |
| ddd | Pzt | Günün kısaltması |
| dddd | Pazartesi | Günün tam adı |
| yy | 21 | Yılın son iki hanesi |
| yyyy | 2021 | 4 haneli yıl |
| h | 9 | Başında sıfır olmadan saat (0-23) |
| hh | 09 | Başında sıfır olan saat (00-23) |
| n (yada m) | 5 | Başında sıfır olmadan dakika (0-59) |
| nn (yada mm) | 05 | Başında sıfır olan dakika (00-59) |
| s | 7 | Başında sıfır olmadan saniye (0-59) |
| ss | 07 | Başı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 SubYukarı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 Sub3. 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 Sub5. 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 SubDateAdd komutuna ilişkin kullanılabilecek değerler aşağıdaki tabloda yer almaktadır.
| Değer | Açıklama |
| yyyy | Year-Yıl |
| q | Quarter-Çeyrek |
| m | Month-Ay |
| y | Day of the year-Yılın günü |
| d | Day-Gün |
| w | Weekday-Haftanın günü |
| ww | Week-Hafta |
| h | Hour-Saat |
| n | Minute-Dakika |
| s | Second-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 SubSadece 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 SubSadece 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 SubSadece 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 SubSonuç 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.
| Sabit | Değer | Gün İsmi |
| vbSunday | 1 | Pazar (varsayılan) |
| vbMonday | 2 | Pazartesi |
| vbTuesday | 3 | Salı |
| vbWednesday | 4 | Çarşamba |
| vbThursday | 5 | Perşembe |
| vbFriday | 6 | Cuma |
| vbSaturday | 7 | Cumartesi |
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 SubYukarı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ı

mükemmel bir eğitim, teşşekkürler
Teşekkürler.