Excel’de tarih ile ilgili işlemler yapmadan önce tarih bilgisinin nasıl tutulduğunu anlamak gerekir. Excel’de tarih bilgisi; gün bazlı olarak 1900 yılının 1 Ocak gününden itibaren geçen gün olarak tutulur.

Araçlar menüsü altındaki “Seçenekler”den bu referans tarihini isterseniz 1904 olarak değiştirebilirsiniz.

tarih

Hemen bir ufak deneme ile tarih sistemimizin ne olduğunu öğrenelim. Bir hücre seçip içine “01.01.1900” yazalım sonrada “Hücre Biçimlendirme”den sayı formatına dönüştürelim. Ya da tam tersini; hücre içine 1 yazdıktan sonra hücre biçimini tarih formatına dönüştürebiliriz. Böylelikle referans tarihimizi belirlemiş oluruz.

1 01 Ocak 1900 Pazar

Exelde tarih ile ilgili oldukça kullanışlı formüller ve otomatik tamamlama özellikleri vardır.

  • Türkçe versiyonlarda hücre içine “23 mart” yazdığınızda Excel otomatik olarak tarihin sonuna bu yıl ekler. Yani hücre değerini “23 Mart 2010” yapar.
  • Alt alta iki hücreye sırasıyla “Ocak” ve “Şubat” yazıp otomatik tamamlaması için sürüklediğinizde bunların ay olduğunu anlayarak diğer hücrelere sırası ile Mart, Nisan vs. yazmaya başlar.
  • Yaklaşık 15-20 tarih fonksiyonu içinde en çok kullanılan bugün() ve şimdi() fonksiyonlarıdır. Bu fonksiyonlar bilgisayardan sistem saatini alarak hücreye yazar. Bu gün fonksiyonu sadece gün bilgisine kadar alır. Yani saat ve dakika kısımları yoktur. (yada 00:00 dır). Şimdi ise daha ayrıntılı olarak alır. Aradaki farkı görmek için alt alta iki hücreye “=bugün()” ve “=şimdi()” yazalım ve sonra bunların sayı karşılıklarına bakalım.

tarih2

Excel’in tarih bilgisini referans olan günden itibaren geçen gün sayısı olarak sakladığını daha önce söylemiştik.  İşte yine aynı mantıkla saat ve dakika bilgisini de günün küsuratı olarak saklıyor. Yani 1 Ocak 1900 yılından bu güne kadar (9 Mart 2010 saat 20:32) tam olarak 40246,86 gün geçmiş.

Ya da şöyle diyebiliriz. Günümüzün yüzde 86’sı bitmiş. Geriye yaşanacak yüzde 14 kalmış :) )

Bu fonksiyonların ingilizce karşılıkları date() ve now()’dur.

Birazda bu bilgileri pratik olarak nasıl kullanırız ona bir bakalım. Bir okurumuzun şöyle basit bir isteği var. Bir tablo üzerinde (ödeme tablosu) bulunan tarih sütununa veri girildiği zaman otomatik olarak girilen günün tarihi yazılsın istiyor.

tarih3

Bu işlem için 3 ayrı yol izleyebiliriz. Bunlardan ilki en kullanışlısı yani elle yazmak :) )

Diğer bir seçenek ise diğer iki sütundan birine (yada her ikisine birden) bakarak eğer içinde veri varsa tarih hücresine tarihi yazdırmak. Bunu için tarih sütunundaki her hücreye lu formülü yazabiliriz.


=Eğer(A3=””;””;bugün())

Bu formülü tarih bütün tarih sütunu için kopyalıyruz. Formül A sütununun dolu mu boş mu olduğuna bakıyor. Eğer dolu ise sistemden o günün tarihini alarak hücreye yazıyor. Eğer boş ise boş bırakıyor. Ancak bu işlem oldukça büyük bir handikaba sahip. Oda bu förmülün sürekli aktif halde olması. Yani ertesi gün gelip aynı exceli açtığımızda tarihlerin hepsinin yine o gün olacak. Yani formül aktif olduğu için yine kendini hesaplayacak. Yada bunu baştan engellediyseniz, size açılışta otomatik güncelleştirme soracak. Siz kazara evet derseniz bütün tarihler aynı güne dönecek.

Yani aslında kullanılması oldukça zor bir yöntem. Tek yolu hesaplanmış olan hücrelerdeki formülleri kaldırmak. Bunun için dolu satırlar kopyalanıp özel yapıştır ile hücre değerleri yapıştırılmalı, boş satırlardaki formüller ise aktif kalmalı. Her değişiklik yapıldığında ise bu işlem tekrarlanmalı. (off yazarken daraldım…)

Üçüncü yöntem ise biraz daha karışık. Bunun için arka plandaki makroları kullanmamız gerekecek. Amacımız yine aynı, ilk sütunda bir değişiklik gördüğünde tarih sütununa o günün tarihi yazmak. Bunun için “Event Listener” olayına ihtiyacımız var. Buradaki listener (yani tetikleyicimiz) sayfa içeriğinin değişip değişmemesi durumu. Bu durum altına uygun kodlarımızı yazıyoruz. Tabi tetikleyicimizin sürekli aktif olması için onu bir yeni bir modül içinde değil de istediğimiz sayfanın kodları içine yazıyoruz.

tarih4

Option Explicit
Dim KontrolSutunNo As Integer
Dim TarihSutunNo As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
Dim hucre As Range
Dim tarihvar As Boolean
tarihvar = False


'Burada tarih ve kontrol edilen sutun numaraları gerekli
KontrolSutunNo = 1 ‘A Sütunu
TarihSutunNo = 3 ‘C Sütunu


'Çoklu işlemlerin olabileceğini düşünüyoruz. Bu yüzden target değişkeni tek bir hücre değilde
'bir hücre dizisi olabilir. Bu yüzden for each döngüsüne ihtiyacımız var



' Toplu copy-paste'ler için tarih kısmı ile bereber mi kopyalanıyor ona bakmalıyız


For Each hucre In Target.Cells
If hucre.Column = TarihSutunNo Then
tarihvar = True
Exit For
End If
Next hucre


'Eğer tarih kısmı yok ise
If tarihvar = False Then
For Each hucre In Target.Cells
If hucre.Value <> "" And hucre.Column = KontrolSutunNo Then
Cells(hucre.Row, TarihSutunNo).Value = VBA.Date()
ElseIf hucre.Value = "" And hucre.Column = KontrolSutunNo Then
Cells(hucre.Row, TarihSutunNo).Value = ""
End If
Next hucre
End If
End Sub

Kod biraz ayrıntı oldu. Aslında sade mantığı şu şekilde

Eğer (değişenhücre.kolon=istediğimiz.kolon) ve (değişenhucre.değeri =boştan farklı) ise tarihhücresi.değeri=bugün

Diğer kodlar olası diğer muhtemel durumlar için (örneğin sayfa üzerine toplu copy-paste ile veri girilmesi vs.) tasarlanmıştır. KontrolSutunNo hangi sütundaki değişikliğin bu makroyu tetikleyeceği, TarihSutunNo ise girilecek tarih bilgisinin kaçıncı sutunda olduğudur. Bu ikisini değiştirerek kendi tablonuza göre uyarlayabilirsiniz.

Son versiyonun exceline bu linkten ulaşabilirsiniz