Skip to main content

AccessTr.neT


Excel Vba Sıfır Sorunu

Excel Vba Sıfır Sorunu

Çözüldü #1
Merhaba. Aşağıdaki Excel Vba kodunda hücreye tarih yazınca isteğim gibi yazıyor. ilk rakamı sıfır olan günlerde yanı 02122024 şeklinde yazınca 22122024 şeklinde tarihi yazıyor. ilk rakam sıfırı nasıl düzeltebiliriz.

Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
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 = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Right(Target, 4)
    Debug.Print "stringtarih2", vbTab, stringtarih2, vbTab, TypeName(stringtarih2), VarType(stringtarih2), IsDate(stringtarih2)
End If
End Sub

şimdiden teşekkürler....
Cevapla
#2
Bu işlem için koda gerek yoktur.
Excelde tarih gireceğiniz tüm hücreleri seçtikten sonra, Hücreleri biçimlendiri seçip, Tarih kategorisinden 14.03.2012 formatını seçin. sorununuzun çözümü budur.
 İyi olan tek şey bilgi ve kötü olan tek şey de cehalettir. (Sokrates)
Cevapla
#3
(09/12/2024, 16:19)onur_can yazdı: Bu işlem için koda gerek yoktur.
Excelde tarih gireceğiniz tüm hücreleri seçtikten sonra, Hücreleri biçimlendiri seçip, Tarih kategorisinden 14.03.2012 formatını seçin. sorununuzun çözümü budur.

tarih girerken örneğin 09122024 veya 10122024 şeklinde girip hızlı geçmek istiyorum, aralarda . veya / gibi işaretler kullanmak istemiyorum
Cevapla
#4
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.
Cevapla
#5
(09/12/2024, 17:55)atoykan yazdı: 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.

Ben bunu nasıl düşünemedim. Teşekkürler kardeş......
Cevapla
#6
Rica ederim. Olabiliyor bazen acele etmekten, bazen mesleki körlük dediğimiz handikaptan.... Önemli olan toparlayıp sonuca ulaşmak, kolay gelsin.
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da