SetFocus olayı hakkında

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Merhaba,

Aşağıdaki kodlar ile şunu yapıyorum. Textbox4 e fatura numarası giriyorum. Kodlar bu fatura numarasının daha önce kaydedilip kaydedilmediğini sorguluyor. Kaydedilmemiş ise yola devam ediyor ve bir sonraki textboxa geçiş yapılıyor. Ancak eğer daha önce kaydedilmiş ise MSGBOX ile uyarı veriyor ve devam etmeyi engelliyor. Problem ise şu, ya da yapmayı istediğim ancak yapamadığım olay. Setfocus. İlgili veri, ya da fatura daha önce kaydedilmiş ise textboxlara girilmiş tüm verileri temizleyip , imlecin textbox1 e dönmesini sağlamaya çalışıyorum ama bunu yapamadım. Bunu nasıl yapabilirim.

Private Sub Combobox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then ComboBox1.SetFocus
End Sub

Yukardaki kod satırlarını tüm veriler girildikten sonra Buton ile Kaydet ve tekrardan Combobox1 e dönmek amacı ile kullanmaktayım ayrıca.


Kod:
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim sat As Integer

For sat = 2 To Sheets("Alış").Cells(65536, "A").End(xlUp).Row

If TextBox2.Value <> "" And TextBox4.Value <> "" And Sheets("Alış").Cells(sat, "D") & Sheets("Alış").Cells(sat, "F") = TextBox2.Value & TextBox4.Value Then
MsgBox "Bu Fatura " & TextBox1.Value & " adlı firmaya daha önce kaydedilmiştir", vbExclamation

TextBox4 = ""
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""

TextBox1.SetFocus

Cancel = True
Exit Sub
End If
Next

End Sub
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
If sorgusundan sonraki Mesaj ekrana geldiği halde mi Set Focus olmuyor?
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Altın üyesiniz, dosyanızı gönderin hızlıca bakayım
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Şu sorumu tekrar sorayım.
If sorgusundan sonraki Mesaj ekrana geldiği halde mi Set Focus olmuyor?

Mesajın geldiğini ve gelse dahi TextBox1.SetFocus olmadığını teyit eder misiniz?


Ayrıca o kadar çok Exit ve Change olayı kullanmışsınız ki takip etmesi çok büyük sıkıntı.
TextBoxları direkt doldurun, Exit yada Change olayına bir şey yazmayın.
Kaydet tuşuna basınca önce gerekli kontrolü yaptırın.
Problem varsa bir mesaj box koyup Fatura Daha önc e kaydedilmiş diyerek Kaydet kodlarından çıkarsınız.
Yoksa kayıt edersiniz.

Exit olaylarında sadece TextBoxlara girdiğiniz verinin formatını düzeltme işlemini gerçekleştir.

TextBox3 deki tarih girişi olayında kullandığınız algoritma doğru değil.

Hiç uğraşmayın böyle atraksiyonlara.
Direkt kullanıcıya bırakın.
Exit olayında kontrol edin. Eğer girilen değer tarih değeri değil ya da doğru bir tarih içermiyorsa (29.05.1933 gibi eski tarih) TextBox3 ü resetleyin ve SetFocus yapın.
Aşağıdaki aslında yeterli bir kontrol
C++:
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsDate(TextBox3) Then
TextBox3 = "": TextBox3.SetFocus
Else
TextBox3 = Format(TextBox3, "dd.mm.yyyy")
End if
End Sub
TextBox2 için şu kontrolü yapın
C++:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox2) <> 10 Or Not IsNumeric(TextBox2.Value * 1) Then TextBox2 = "": TextBox2.SetFocus
End Sub
TextBox5 Change olayındaki kodu Exit olayına yazın. Change kullanmayın.
 
Son düzenleme:

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Baktıkça uzuyor.

Yukarıda anlattığım mantıkla ilerlemenizi tavsiye ederim.
Ne kendinizi ne kodları yorun.

Sorunuzun cevabı olarak
Ben TextBox4.Change olayındaki kodlarınızı Exit olayına aktardım ve hiç bir problem göremedim.
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Baktıkça uzuyor.

Yukarıda anlattığım mantıkla ilerlemenizi tavsiye ederim.
Ne kendinizi ne kodları yorun.

Sorunuzun cevabı olarak
Ben TextBox4.Change olayındaki kodlarınızı Exit olayına aktardım ve hiç bir problem göremedim.
Gündüz bakıcam ömer faruk bey, benim için önemli olan textbox4 deki durum. Diğerlerinde düzeltme yapmam gerekirse incelerim. Ancak benim asıl merak ettiğim setfocus olayının nasıl çalıştığı. Benim sorduğum soruya benzer daha önceden sorular sorulmuş forumlarda, sitelerde. Ancak net bir cevap bulamadım. Gündüz bakacağım.
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Şu sorumu tekrar sorayım.
If sorgusundan sonraki Mesaj ekrana geldiği halde mi Set Focus olmuyor?

Mesajın geldiğini ve gelse dahi TextBox1.SetFocus olmadığını teyit eder misiniz?


Ayrıca o kadar çok Exit ve Change olayı kullanmışsınız ki takip etmesi çok büyük sıkıntı.
TextBoxları direkt doldurun, Exit yada Change olayına bir şey yazmayın.
Kaydet tuşuna basınca önce gerekli kontrolü yaptırın.
Problem varsa bir mesaj box koyup Fatura Daha önc e kaydedilmiş diyerek Kaydet kodlarından çıkarsınız.
Yoksa kayıt edersiniz.

Exit olaylarında sadece TextBoxlara girdiğiniz verinin formatını düzeltme işlemini gerçekleştir.

TextBox3 deki tarih girişi olayında kullandığınız algoritma doğru değil.

Hiç uğraşmayın böyle atraksiyonlara.
Direkt kullanıcıya bırakın.
Exit olayında kontrol edin. Eğer girilen değer tarih değeri değil ya da doğru bir tarih içermiyorsa (29.05.1933 gibi eski tarih) TextBox3 ü resetleyin ve SetFocus yapın.
Aşağıdaki aslında yeterli bir kontrol
C++:
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsDate(TextBox3) Then
TextBox3 = "": TextBox3.SetFocus
Else
TextBox3 = Format(TextBox3, "dd.mm.yyyy")
End if
End Sub
TextBox2 için şu kontrolü yapın
C++:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox2) <> 10 Or Not IsNumeric(TextBox2.Value * 1) Then TextBox2 = "": TextBox2.SetFocus
End Sub
TextBox5 Change olayındaki kodu Exit olayına yazın. Change kullanmayın.
Ömer Faruk Bey, yazdıklarınızı yeni kontrol edebildim.

Tarih ile ilgili yazdığınız kodlar hoş olmuş. Bunu kullanabilirim ve dahil ettim.
textbox4 ün change ve exit olaylarını ayrı ayrı özellikle kullanmaktayım. Bunun iki sebebi var. textbox4 de her karakter girişinde uzunluk kontrolü yapılmakta,( e fatura numarası 16 hane olduğu için burada önemli ) , kullanıcı hücreden çıkmadan karakter sayısını doğru girdimi girmedimi anlasın diye, diğer sebebi küçük harflerin anlık olarak büyük harfe dönüşünün gözle görülebilmesi. capslock açıkmıydı değilmiydi diye kullanıcı düşünmesin diye.

Asıl konumuza geleceksem buna henüz bir çözüm bulamadım ve sizin belirttikleriniz çerçevesinde tekrardan bakıyorum. Ancak bu sanırım biraz çetrefilli bir durum. İlk mesajımda belirttiğim gibi daha önce bu duruma benzer sorunu olanlar olmuş ancak uygun bir cevap göremedim ben, hem bu sitede hemde farklı sitelerde. Açıkcası çok zaruri bir durum değil ancak, hem biraz merak hemde daha kullanışlı hale getirmek bir çözüm aramaktayım.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,314
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Nesnelerin hem Exit hem de Change olayları kullanıldığında bu tarz sorunları yaşamanız normaldir.

Çünkü TextBox4 = "" komutu bile ilgili nesnenin Change olayını tetiklediği için sürekli döngüler oluşmaktadır.

Ben bu tarz sorunları aşmak için formun kod bölümünde en tepeye bir Boolean değer tanımlıyorum. (Örnek Dim Kontrol As Boolean)

Sonra her ilişkili nesnenin kod bloğunun ilk satırına bunu if sorgusu ile ekliyorum.

Rich (BB code):
Private Sub TextBox4_Change()
    If Kontrol = True Then Exit Sub
    TextBox4 = UCase(Replace(Replace(TextBox4.Text, "ı", "I"), "i", "İ"))
        If TextBox4 <> "" Then
        TextBox7 = Len(TextBox4.Value)
    Else
        TextBox7 = ""
    End If
End Sub
İşin bu aşaması biraz zahmetli olacaktır. Ama programcılığın özünde bu vardır. Önce emek harcanması gerekiyor.

Aşağıdaki kod ise sizin kullandığınız kodun yerine tasarladığım yeni kodlamadır. Döngü yerine excelin yeni sürümlerinde kullanıma sunduğu ÇOKEĞERSAY fonksiyonunu kullandım.

Dikkat ederseniz bold olan satır nesneleri temizlemeden hemen önce devreye giriyor. Bu diğer nesnelerin varsa Change olaylarını engellemek için kullanılıyor. Tabi ki olumlu sonuç almanız için bahsi geçen nesnelerin Change olaylarını üstte paylaştığım kod bloğu gibi düzenlemelisiniz. Yani bold kontrol satırını eklemelisiniz.

Rich (BB code):
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox2 <> "" And TextBox4 <> "" Then
        If WorksheetFunction.CountIfs(Sheets("Alış").Range("D:D"), TextBox2, Sheets("Alış").Range("F:F"), TextBox4) > 0 Then
            MsgBox "Bu fatura " & TextBox1.Value & " adlı firmaya daha önce kaydedilmiştir!", vbExclamation
            Cancel = True
            Kontrol = True
            TextBox4 = ""
            TextBox1 = ""
            TextBox2 = ""
            TextBox3 = ""
            SendKeys "+{TAB 3}", True
            Kontrol = False
            Exit Sub
        End If
    End If
End Sub
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Nesnelerin hem Exit hem de Change olayları kullanıldığında bu tarz sorunları yaşamanız normaldir.

Çünkü TextBox4 = "" komutu bile ilgili nesnenin Change olayını tetiklediği için sürekli döngüler oluşmaktadır.

Ben bu tarz sorunları aşmak için formun kod bölümünde en tepeye bir Boolean değer tanımlıyorum. (Örnek Dim Kontrol As Boolean)

Sonra her ilişkili nesnenin kod bloğunun ilk satırına bunu if sorgusu ile ekliyorum.



İşin bu aşaması biraz zahmetli olacaktır. Ama programcılığın özünde bu vardır. Önce emek harcanması gerekiyor.

Aşağıdaki kod ise sizin kullandığınız kodun yerine tasarladığım yeni kodlamadır. Döngü yerine excelin yeni sürümlerinde kullanıma sunduğu ÇOKEĞERSAY fonksiyonunu kullandım.

Dikkat ederseniz bold olan satır nesneleri temizlemeden hemen önce devreye giriyor. Bu diğer nesnelerin varsa Change olaylarını engellemek için kullanılıyor. Tabi ki olumlu sonuç almanız için bahsi geçen nesnelerin Change olaylarını üstte paylaştığım kod bloğu gibi düzenlemelisiniz. Yani bold kontrol satırını eklemelisiniz.

Korhan Bey , yine çok çok teşekkürler. İstediğim sonucu veriyor. Problemin döngü ile alakalı olduğunu tahmin ediyordum ancak fonksiyon kullanmak hiç aklıma gelmedi. Gelse bile şahsen çözemezdim. Yeni bir yaklaşım görmüş oldum kendimce.
SendKeys "+{TAB 3}", True satırında rakam ile oynayarak istediğimiz nesneden başlatmamızı sağlıyor, yanlış anlamadıysam.

Ellerinize sağlık
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,314
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Size mesaj yazarken kodların en başında zaten Dim Kontrol As Boolean satırının olduğunu farkettim. Sanırım bir başka başlıkta zaten size bu öneriyi yapmışım.

SendKeys "+{TAB 3}", True bu komut SHIFT+TAB komutudur. Bir nevi SetFocus görevi görmektedir. Yanındaki sayısal veri de kaç kez bu tuşlara basılacağını ifade etmektedir.
 

walabi

Altın Üye
Katılım
22 Eylül 2012
Mesajlar
671
Excel Vers. ve Dili
excel 2010

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Size mesaj yazarken kodların en başında zaten Dim Kontrol As Boolean satırının olduğunu farkettim. Sanırım bir başka başlıkta zaten size bu öneriyi yapmışım.

SendKeys "+{TAB 3}", True bu komut SHIFT+TAB komutudur. Bir nevi SetFocus görevi görmektedir. Yanındaki sayısal veri de kaç kez bu tuşlara basılacağını ifade etmektedir.
Haklısınız, konuyu açarken yüklediğim örnek dosyanın bir çok yerinde Dim Kontrol As Boolean satırını kullanmaktayım. Tekrardan teşekkürler.
 
Üst