Merhaba Sayın @
HORZUM
Bahsettiğiniz sorun Excel'in sayısal veri girişi yaptığınızda formatlarken baştaki sıfırı kaldırmasından kaynaklanıyor ve kodunuzda bu husus dikkate alınmamış.
Her zaman belirttiğimiz şey ne olursa ne olacak, olmazsa ne olacak mantığı ile kod kurgulamanız ve hata denetimi yapmanız gerekli. Şimdi düşünelim Excelde 10 girdiğim takdirde bunu sayı olarak formatlayacak, 01 girdiğimde yine bunu sayı olarak formatlayacak ve baştaki sıfırı silecek. Siz doğrudan tarih formatında değil sayısal olarak tarihi girip girilen veriyi biçimlendirmek üzere kod yazmışsınız. Örneğimiz üzerinden devam edersek
- 10092024 şeklinde girdiğiniz tarihi Excel sayı olarak formatlayacak ve aynen hücreye yazacak bu durumda kodunuz biçimlendirme bloğuna geldiğinde If Len(Target) = 8 yani "girdiğiniz değerin uzunluğu 8 karakter mi" mantık sınamasında True değerini döndürüp işlemlere devam edecek ve 10.09.2024 string metnini oluşturacak (Excel otomatik olarak tarihe formatlayacak) ve sorun olmayacak.
- Fakat 01092024 şeklinde girdiğiniz tarihi Excel sayı olarak formatlayacak ve baştaki sıfırı silerek 1092024 olarak hücreye yazacak bu durumda kodunuz biçimlendirme bloğuna geldiğinde If Len(Target) = 8 mantık sınamasında False değerini döndürüp biçimlendirme işlemlerine girmeden End If'e devam edecek ve ve koddan çıkacak.
O zaman kurgumuzda eksik olan ne 01092024 şeklinde girdiğim tarih 1092024 olarak hücreye yansıyacak ise girilen verinin karakter sayısı 7'ye düşüyor bunu hesaba katmamışız. Bunu eklememiz gerekli, ayrıca kod işlem sonuçlarını string olarak döndürüp hücreye işlediğine ve
Excel otomatik olarak girilen veriyi algılayarak formatladığına göre işimizi şansa bırakmayıp istediğimiz formatı da koda tanımlamamız gerekmekte. Buradan yola çıkarak kodunuzu
Dim blg As Range
If Target.Count > 1 Then Exit Sub
Set blg = Range("A:A")
If Intersect(Target, blg) Is Nothing Then Exit Sub
If Len(Target) = 8 Then
If InStr(Target, ".") = 0 Then Target = Format(Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Right(Target, 4), "dd/mm/yyyy;@")
ElseIf Len(Target) = 7 Then
If InStr(Target, ".") = 0 Then Target = Format(Left(Target, 1) & "." & Mid(Target, 2, 2) & "." & Right(Target, 4), "dd/mm/yyyy;@")
End If
şeklinde revize ederseniz hem 8 karakter uzunlukta veri hem de 7 karakter uzunlukta veriyi dikkate almış ayrıca hepsini de dd/mm/yyyy formatında biçimlendirmiş olacağınızdan baştaki sıfır sorununuz da çözümlenmiş olacaktır. Kodlama yaparken kontrol etmek amaçlı kullanılan debug.print gibi kodları da ya silin ya başına ' ekleyerek yoruma alın ki işlemlerinizde hız/performans üzerinde negatif etki göstermesin, zira bunların kodunuza bir etkisi yoktur. Ayrıca if / elseif ile 8 karakter ve 7 karakter durumu ele alınmış durumda else ile farklı veri girişi yapılmasının kontrolü eklenmesi yerinde olacaktır ancak çalışmanızı bilmediğimiz için o kısma girmedim sadece belirtmiş olayım.