TextBox ile arama konusunda önerileriniz...

Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Merhaba.
TextBox ile kişi arama yapıyorum. Lakin dosyamda 10.000 veri olunca arama işlemi biraz yavaş oluyor. Aşağıdaki kodlar ile yapılan arama için bir öneriniz olabilir mi?
Ayrıca aynı hücrede bulunan ad ve soyad için soyadı araması da eklemek istiyorum.
Şayet olabilirse, aynı texbox ile olmaz ise farklı bir texbox ile soyadı araması nasıl yapabilirim?

Saygılarımla.

Kod:
Private Sub TextBox13_Change() 'KİŞİ ARA
Dim k As Range, adrs As String, j As Byte, A As Long
ReDim myarr(1 To 50, 1 To 65536)
If TextBox13.Text = "" Then
ListBox1.RowSource = "satış!A1:U" & Sheets("satış").[a65536].End(xlUp).Row
Exit Sub
End If

If Left(TextBox13.Text, 1) <> "-" Then
TextBox2000.Text = TextBox13.Text
With Worksheets("satış")
    ListBox1.RowSource = ""
    If .FilterMode Then .ShowAllData
    Set k = .Range("C2:C65536").Find(TextBox2000.Text & "*", , xlValues, xlWhole)
    If Not k Is Nothing Then
        adrs = k.Address
       Do
            A = A + 1
            For j = 1 To 50
               myarr(j, A) = .Cells(k.Row, j).Value
            Next j
            Set k = Range("C2:C65536").FindNext(k)
        Loop While Not k Is Nothing And k.Address <> adrs
        ReDim Preserve myarr(1 To 50, 1 To A)
        ListBox1.Column = myarr
    End If
End With
End If
End Sub
 

Ekli dosyalar

Katılım
23 Eylül 2004
Mesajlar
1,754
Excel Vers. ve Dili
Excel 2010 TR
Set k = .Range("C2:C65536").Find(TextBox2000.Text & "*", , xlValues, xlWhole)

yukarıdaki kodu aşağıdaki ile değiştirirseniz sadece isimde değil içerenlerin hepsini bulur..

Örnk: Emre Kaya
Kaya Demir

iki isim olsun siz kaya yazdığınızda ikisinide bulur.

Set k = .Range("C2:C65536").Find("*" & TextBox2000.Text & "*", , xlValues, xlWhole)
 
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Teşekkürler Hüseyin Bey. Güzel oldu.
Lakin Veriler arttıkça arama biraz yavaş oluyor.
Buna bir çözüm bulamayız sanırım. Değil mi?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

ListBox nesnesine en hızlı veri yükleme şekli RowSource yöntemidir. Siz Find ile verileri arayıp döngü ile yükleme yaptığınız için çok satırlı datalarda yavaş çalışması normaldir.

Hızlandırmak için yardımcı sayfa kullanabilirsiniz. Arama anında yazdığınız kriterlere göre filtre uygulanır. Süzülen değerler hızlıca yardımcı sayfaya kopyalanır ve bu sayfadan direk ListBox üzerine RowSource metodu ile yüklenir. Bu şekilde çok hızlı sonuçlar alabilirsiniz. Formunuzu kapatırkende yardımcı sayfanın içini boşaltarak dosyanızın boyutunun şişmesini engelleyebilirsiniz. Bu şekilde bir örnek forumda daha önce yayınlamıştım. Arama yaparsanız ulaşabilirsiniz.
 
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Teşekkürler Korhan Bey.
Arama kriterleri nelerdir? Linke ulaşamadım.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Sizin kullandığınız arama kodu nesnenin Change (Değişim) olayında çalışıyor. Doğal olarak her harf yazdığınızda kodlar yeniden tetikleniyor.

1. önerim;

Kodu "KeyDown" olayına yazıp ENTER tuşuna basıldığında arama işlemini başlatmak olabilir. Bu şekilde yavaşlama işlemini sadece bir kez yaşarsınız.

2. önerim;

Eğer benim bu yavaşlığa tahammülüm yok derseniz yardımcı sayfa kullanarak verileri filtre ederek RowSource metodu ile ListBox nesnesine yükleyebilirsiniz.
 
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Merhaba,

Sizin kullandığınız arama kodu nesnenin Change (Değişim) olayında çalışıyor. Doğal olarak her harf yazdığınızda kodlar yeniden tetikleniyor.

1. önerim;

Kodu "KeyDown" olayına yazıp ENTER tuşuna basıldığında arama işlemini başlatmak olabilir. Bu şekilde yavaşlama işlemini sadece bir kez yaşarsınız.

2. önerim;

Eğer benim bu yavaşlığa tahammülüm yok derseniz yardımcı sayfa kullanarak verileri filtre ederek RowSource metodu ile ListBox nesnesine yükleyebilirsiniz.
Teşekkür ederim Korhan Bey. Ben ilk önerinizden yola çıkayım.
Çünkü dediğiniz gibi yazmaya çalıştıkça herkeresinde arama yapmaya çalışıyor.
Ancak "Kodu "KeyDown" olayına yazıp ENTER tuşuna basıldığında arama işlemini başlatmak olabilir. Bu şekilde yavaşlama işlemini sadece bir kez yaşarsınız." Bu olayı nasıl yapmam gerek. Kodlarımı eklesem olur mu?


Kod:
Private Sub TextBox13_Change() 'KİŞİ ARA
Dim k As Range, adrs As String, j As Byte, A As Long
ReDim myarr(1 To 50, 1 To 65536)
If TextBox13.Text = "" Then
ListBox1.RowSource = "satış!A1:U" & Sheets("satış").[a65536].End(xlUp).Row
Exit Sub
End If

If Left(TextBox13.Text, 1) <> "-" Then
TextBox2000.Text = TextBox13.Text
With Worksheets("satış")
    ListBox1.RowSource = ""
    If .FilterMode Then .ShowAllData
    Set k = .Range("C2:C65536").Find("*" & TextBox2000.Text & "*", , xlValues, xlWhole)
    If Not k Is Nothing Then
        adrs = k.Address
       Do
            A = A + 1
            For j = 1 To 50
               myarr(j, A) = .Cells(k.Row, j).Value
            Next j
            Set k = Range("C2:C65536").FindNext(k)
        Loop While Not k Is Nothing And k.Address <> adrs
        ReDim Preserve myarr(1 To 50, 1 To A)
        ListBox1.Column = myarr
    End If
End With
End If
End Sub
Private Sub TextBox13_Enter()
    TextBox13 = ""
    TextBox2000 = ""
End Sub


Private Sub TextBox13_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal y As Single)
    TextBox13 = ""
    TextBox2000 = ""
End Sub

Private Sub TextBox13_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox2000.Text = TextBox13.Text
TextBox13.Text = "-KİŞİ ARA-"
End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Bir örnek dosya hazırladım.

3 farklı arama yöntemi var.

1. arama yöntemi CHANGE olayına ait yöntemdir. (10.000 satır veri için işlem süresi yaklaşık 3-5 saniye)
2. arama yöntemi ENTER olayına ait yöntemdir. (10.000 satır veri için işlem süresi yaklaşık 3-5 saniye)
3. arama yöntemi FİLTRE-ROWSOURCE yöntemidir. (10.000 satır veri için işlem süresi yaklaşık 0-1 saniye)

Sanırım örnek dosyadaki olayları kendi dosyanıza uyarlamakta zorluk çekmezsiniz.

Not: Verdiğim süreler bilgisayarın rem ve işlemci gücüne göre değişkenlik gösterebilir.
 

Ekli dosyalar

Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Merhaba,

Sanırım örnek dosyadaki olayları kendi dosyanıza uyarlamakta zorluk çekmezsiniz.

Not: Verdiğim süreler bilgisayarın rem ve işlemci gücüne göre değişkenlik gösterebilir.
Sanırım değil, öyle maalesef. :biggrin:
1. ve 3. seçenekleri kullanmak istemiyorum. Çünkü her harfte arama yapıyor. Ama 2. enter olayında arama yapmak istediğim kelimeyi yazıp "enter" yapıyorum. Daha uygun bir seçenek. 3 ya da 5 saniye beklerim. :)
Burada benim bu kodları uygulamam mümkün değil. Ben kodlara baktım onlar bana baktı, baktı baktı... :(
Şöyle de bir durum var. Arma yaparken TextBox13 ile TextBox2000 arasında bir ilişkilendirme var. Bu ilişkilendirme TextBox13 e tıkladığımda ListBox arama yapmıyordu. Forumdan (adını hatırlayamadım kusura bakmasın :) ) bir arkadaşımız yardımcı olmuştu. Özet olarak, bu konuda yardımınızı rica ediyorum :agla:
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

TextBox13_Change olayındaki kodunuzu tamamen silip aşağıdaki kodu deneyin.

Kod:
Private Sub TextBox13_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim BUL As Range, ADRES As String, Sutun As Byte, Satir As Long
    
    On Error Resume Next
    ListBox1.RowSource = ""
    ListBox1.Clear
    On Error GoTo 0
    
    If KeyCode = 13 Then
        If TextBox13.Text = "" Then
            ListBox1.RowSource = "Satış!A1:U" & Sheets("Satış").Cells(Rows.Count, "A").End(xlUp).Row
            Exit Sub
        End If
    
        Application.ScreenUpdating = False
        
        ReDim Veri_Dizisi(1 To 21, 1 To 65536)
        
        TextBox2000.Text = TextBox13.Text
        
        With Worksheets("Satış")
            If .FilterMode Then .ShowAllData
            Set BUL = .Range("C:C").Find(TextBox13.Text, , xlValues, xlPart)
            If Not BUL Is Nothing Then
                ADRES = BUL.Address
                Do
                    Satir = Satir + 1
                    For Sutun = 1 To 21
                        Veri_Dizisi(Sutun, Satir) = .Cells(BUL.Row, Sutun).Value
                    Next
                    
                    Set BUL = Range("C:C").FindNext(BUL)
                Loop While Not BUL Is Nothing And BUL.Address <> ADRES
                
                ReDim Preserve Veri_Dizisi(1 To 21, 1 To Satir)
                
                ListBox1.Column = Veri_Dizisi
            End If
        End With
    
        Application.ScreenUpdating = True
    End If
End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Üstteki mesajımdaki koda küçük bir ekleme yaptım. Şimdi arama yapıyor. Fakat sorun sizin uyguladığınız diğer kodlardan kaynaklanıyor. Enter tuşuna bastığınızda cursor nesneyi terkettiği için diğer kodlarınız tetikleniyor. Bu sebeple sorun yaşıyorsunuz.
 
Katılım
23 Eylül 2004
Mesajlar
1,754
Excel Vers. ve Dili
Excel 2010 TR
Sanırım değil, öyle maalesef. :biggrin:
1. ve 3. seçenekleri kullanmak istemiyorum. Çünkü her harfte arama yapıyor. Ama 2. enter olayında arama yapmak istediğim kelimeyi yazıp "enter" yapıyorum. Daha uygun bir seçenek. 3 ya da 5 saniye beklerim. :)
Burada benim bu kodları uygulamam mümkün değil. Ben kodlara baktım onlar bana baktı, baktı baktı... :(
Şöyle de bir durum var. Arma yaparken TextBox13 ile TextBox2000 arasında bir ilişkilendirme var. Bu ilişkilendirme TextBox13 e tıkladığımda ListBox arama yapmıyordu. Forumdan (adını hatırlayamadım kusura bakmasın :) ) bir arkadaşımız yardımcı olmuştu. Özet olarak, bu konuda yardımınızı rica ediyorum :agla:
sayın korhan beyin verdiği kodlarla textbox2000 ne ihtiyaç kalmıyor çıkışta texbox13 değeri "-KİŞİ ARA-" işlemini yapınca Enter tuşuna basmadığı için kodlar tekrardan tetiklenmiyor.

Korhan beyin verdiği kodları uyguladığınızda Textbox13 veriyi girip Enter Tusuna bastığınızda Tab işlemi Textbox14 gittiği için Textbox14 listboxı temizliyor.. Cozum olarak korhan beyin kodlarının en altına screen updateden once setfocus işlemini koyarsanız Enter tusuna bastığınızda Listbox1 seçer ve Textbox14 tetiklenmemiş olur.

ListBox1.SetFocus
Application.ScreenUpdating = True
End If
 
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Merhaba,

Üstteki mesajımdaki koda küçük bir ekleme yaptım. Şimdi arama yapıyor. Fakat sorun sizin uyguladığınız diğer kodlardan kaynaklanıyor. Enter tuşuna bastığınızda cursor nesneyi terkettiği için diğer kodlarınız tetikleniyor. Bu sebeple sorun yaşıyorsunuz.
Merhaba Korhan Bey.
Emeğiniz ve alakanız için çok çok teşekkür ederim. Hemen hemen sorunum çözülüyor gibi ancak...
Bazı tespitlerim ve bunların çözümüne yönelik çabalarım sonuçsuz kaldı. Aşağıda bir kaç madde sıraladım.

sayın korhan beyin verdiği kodlarla textbox2000 ne ihtiyaç kalmıyor çıkışta texbox13 değeri "-KİŞİ ARA-" işlemini yapınca Enter tuşuna basmadığı için kodlar tekrardan tetiklenmiyor.

Korhan beyin verdiği kodları uyguladığınızda Textbox13 veriyi girip Enter Tusuna bastığınızda Tab işlemi Textbox14 gittiği için Textbox14 listboxı temizliyor.. Cozum olarak korhan beyin kodlarının en altına screen updateden once setfocus işlemini koyarsanız Enter tusuna bastığınızda Listbox1 seçer ve Textbox14 tetiklenmemiş olur.

ListBox1.SetFocus
Application.ScreenUpdating = True
End If
Merhaba Hüseyin Bey.
Tam isabet buyurmuşsunuz. Korhan Bey'in kodlarına ek olarak sunduğunuz çözüm yararlı oldu.
Enter yaptığımda TextBox13 ten 14 e 15 e doğru gidiyordu. Ancak bir kaç sorunum var.
Aklımın erdiğince bir şeyler yapmaya çalıştım ama beceremedim...

1) Verdiğiniz kodları -il ara- ve -tel ara- için uyarlamaya çalıştım olmadı.
2) TextBox'a arama için tıkladığımda sorun yok ama herhangi bir harf girdiğimde
yahut klavyeden herhangi bir tuşa bastığımda listbox siliniyor. Enter yaptığımda arama sonuçlarıyla beraber listeleniyor.
Belki bir sorun değil ama kullanışlı olmuyor...
3) Eğer arama yaparda bu veriyi düzelt dersem, ilkbaşta bulunan (A1 satırı) satırı değitiriyor.
4) İlk başta bulunan başlık satırını nasıl sabitlerim. Yani listboxta arama yaptığımda bile bir değermiş gibi işlem görüyor.
5) Arama kutularından çıksamda listedeki veriler (arama işlemi) sonlanmıyor. Liste olduğu gibi kalıyor...

6) Biliyorum hocam çok oldum ama, bir çözüm bulamazmıyız?
7) Dosyamı ekliyorum. :)
 

Ekli dosyalar

Katılım
23 Eylül 2004
Mesajlar
1,754
Excel Vers. ve Dili
Excel 2010 TR
1) Verdiğiniz kodları -il ara- ve -tel ara- için uyarlamaya çalıştım olmadı.
2) TextBox'a arama için tıkladığımda sorun yok ama herhangi bir harf girdiğimde
yahut klavyeden herhangi bir tuşa bastığımda listbox siliniyor. Enter yaptığımda arama sonuçlarıyla beraber listeleniyor.
Belki bir sorun değil ama kullanışlı olmuyor...
3) Eğer arama yaparda bu veriyi düzelt dersem, ilkbaşta bulunan (A1 satırı) satırı değitiriyor.
4) İlk başta bulunan başlık satırını nasıl sabitlerim. Yani listboxta arama yaptığımda bile bir değermiş gibi işlem görüyor.
5) Arama kutularından çıksamda listedeki veriler (arama işlemi) sonlanmıyor. Liste olduğu gibi kalıyor...

6) Biliyorum hocam çok oldum ama, bir çözüm bulamazmıyız?
7) Dosyamı ekliyorum. :)

İşlemlerle ilgili birkaç duzeltme yaptım fakat daha eksikler var devam ediyorum.

Değiştirme tuşu arama yaptıktan sonra lisbox indeks numrasına gore yaptığı için orada yanlış var onun satır numarasını getirmek lazım.

dosyayı şimdilik yukluyorum tekrar duzeltmeleri bitirince yeni versiyonunu eklerim.
 
Son düzenleme:
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Ben buna bir bakayım Hüseyin Bey.
Bekliyorum inşallah. Amma zor bir olaymış. Kafam çalışmaz oldu artık. :)
 
Katılım
23 Eylül 2004
Mesajlar
1,754
Excel Vers. ve Dili
Excel 2010 TR
Ben buna bir bakayım Hüseyin Bey.
Bekliyorum inşallah. Amma zor bir olaymış. Kafam çalışmaz oldu artık. :)

Uzun makrolarda sıralamalar önemli :) ufak bir işlem diğerini tetiklemesiyle ortalık birbirine girebiliyor.. dosyada listbox başlıkları hariç görebildiğim işlemleri düzelttim tekrardan sisteme yukleyip eskisini siliyorum

iyi çalışmalar,
 
Son düzenleme:
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Merhaba Hüseyin Bey.
Dosyayı ilk açtığımda aşağıdaki "takvim" hatasını alıyorum. Ne yapmam gerek?

 
Katılım
23 Eylül 2004
Mesajlar
1,754
Excel Vers. ve Dili
Excel 2010 TR
Merhaba Hüseyin Bey.
Dosyayı ilk açtığımda aşağıdaki "takvim" hatasını alıyorum. Ne yapmam gerek?

Ben Excel 2010 Win7 X64 bit işletim sistemi kullandığım için "Ptrsafe" eklemiştim siz PtrSafe yazsını silin dosyayı az once tekrar guncelledim yenisini indirip test edermisiniz.
 
Katılım
19 Haziran 2007
Mesajlar
418
Excel Vers. ve Dili
excel 2007
Yok olmadı. Güncellediğiniz dosyada da aynı sorun vardı.
Ben arama ile ilgili bütün kodları diğer dosyama aktardım.
Değişiklik başka yerlerde yoksa, doğru mu yaptım? Şu an çalışıyor. İnceleyip neticeyi aktaracağım inşallah.
 
Üst