Text Box ile Filtreleme

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Merhaba,

Örneğin, Userform1 içinde bulunan TextBox içine yazılan metine göre, "FILTRE" isimli Sheet'tedeki C Sütununu Nasıl filtreleyebilirim ? Yani TextBoxa Metin yazacağım ve yanında da çalıştır isimli bir buton olacak ve bu butona tıkladığımda filtreleme yapacak.

Değerli yardımlarınız için şimdiden çok Teşekkür Ederim.
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Me.TextBox1.Value

    ' Filtreleme işlemi
    With ws
        ' Öncelikle mevcut filtreleri kaldır
        If .AutoFilterMode Then .AutoFilterMode = False
        
        ' C sütununu filtrele
        .Range("C1").AutoFilter Field:=3, Criteria1:=filterValue
    End With
End Sub
Bu kod verdiğiniz bilgiye göre ; buton altına yazılarak kaydedildikten sonra normal userformda dugmeye basınca c sutununa gore filtre yapacak şekilde hazırlandı.Dosya eklemediğinizden deneme şansı olmadan verilmiştir,, siz deneyiniz
 

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Sayın @cems , Yanıtınız için çok Teşekkür Ederim,

Soruyu sorarken eksik sordum kusuruma bakmayın lütfen, bu verdiğiniz kod evet gayet güzel çalışıyor, fakat tüm filtreleri de beraberinde kaldırdığı için, E sütununda filtrelenmesini istediğim "GUN" ibaresini de kaldırıyor. Bu verdiğiniz koda , E sütununda "GUN" filtresi nasıl ekleyebilirim acaba ?

Tekrar çok Teşekkür Ederim
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Sayın @cems , Yanıtınız için çok Teşekkür Ederim,

Soruyu sorarken eksik sordum kusuruma bakmayın lütfen, bu verdiğiniz kod evet gayet güzel çalışıyor, fakat tüm filtreleri de beraberinde kaldırdığı için, E sütununda filtrelenmesini istediğim "GUN" ibaresini de kaldırıyor. Bu verdiğiniz koda , E sütununda "GUN" filtresi nasıl ekleyebilirim acaba ?

Tekrar çok Teşekkür Ederim

Onceki kodları silin ve bu kodları ekleyerek deneyin:


Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String
    Dim currentFilters As Variant

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Me.TextBox1.Value

    ' Filtreleme işlemi
    With ws
        ' Mevcut filtreleri kontrol et
        If .AutoFilterMode Then
            ' Mevcut filtreleri sakla
            currentFilters = .AutoFilter.Filters
            ' Önce C sütununu temizle
            .AutoFilterMode = False
        End If
        
        ' C sütununu filtrele
        .Range("C1").AutoFilter Field:=3, Criteria1:=filterValue
        
        ' E sütunundaki mevcut filtreyi geri yükle (varsa)
        If Not IsEmpty(currentFilters) Then
            If currentFilters(5).On Then ' E sütunu 5. alan
                .Range("E1").AutoFilter Field:=5, Criteria1:="GUN"
            End If
        End If
    End With
End Sub
 

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Onceki kodları silin ve bu kodları ekleyerek deneyin:


Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String
    Dim currentFilters As Variant

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Me.TextBox1.Value

    ' Filtreleme işlemi
    With ws
        ' Mevcut filtreleri kontrol et
        If .AutoFilterMode Then
            ' Mevcut filtreleri sakla
            currentFilters = .AutoFilter.Filters
            ' Önce C sütununu temizle
            .AutoFilterMode = False
        End If
       
        ' C sütununu filtrele
        .Range("C1").AutoFilter Field:=3, Criteria1:=filterValue
       
        ' E sütunundaki mevcut filtreyi geri yükle (varsa)
        If Not IsEmpty(currentFilters) Then
            If currentFilters(5).On Then ' E sütunu 5. alan
                .Range("E1").AutoFilter Field:=5, Criteria1:="GUN"
            End If
        End If
    End With
End Sub

currentFilters = .AutoFilter.Filters komutunda Debug hatası aldım Sayın @cems.


Bu arada benim KAA sütununa kadar tüm sütunlarımda veri var. Bu filtreyi uyguladıktan sonra, sütun başlıklarındaki bütün filtreler kalkıyor ( Eski verdiğiniz kodda ), ve sonradan Userform üzerinden çağırdığım başka filtreleri kullanamaz hale getiriyor. Yani aslında sütun başlıklarındaki filtre işaretlerini kaldırmadan bu işi nasıl yapabilirm.
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Sayfanın bir ozel veri olmayan kopyasını olusturarak buraya eklerseniz sebebi anlamak daha kolay olabilir. Mevcut filtreleri koruyan şu kodu deneyin


Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String
    Dim eCriteria As String

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Me.TextBox1.Value
    eCriteria = "GUN" ' E sütunu için filtre kriteri

    ' Filtreleme işlemi
    With ws
        ' Mevcut filtreleri kontrol et
        If .AutoFilterMode Then
            ' C sütununu filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:=filterValue
            
            ' E sütunundaki mevcut filtreyi kontrol et
            If .AutoFilter.Filters(5).On Then ' E sütunu 5. alan
                .Range("E1").AutoFilter Field:=5, Criteria1:=eCriteria
            Else
                ' Eğer E sütununda filtre yoksa, ekle
                .Range("E1").AutoFilter Field:=5, Criteria1:=eCriteria
            End If
        Else
            ' Eğer hiç filtre yoksa, hem C hem de E sütunlarını filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:=filterValue
            .Range("E1").AutoFilter Field:=5, Criteria1:=eCriteria
        End If
    End With
End Sub
 

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Sayın @cems , Son verdiğiniz kod ile sorun çözüme kavuştu.Sizi de uğraştırmış olsum. Hakınızı helal edin.
Çok Teşekkür ederim.
Saygılarımla
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Helal olsun kolay gelsin
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Sorununuz cozuldu ancak buyuk veri kumeleri ile çalıştıgınızı varssayımladığımda merak ettiğim için aynı sorunun scripting.dictionary yontemi ile cozulup cozulmeyeceği konusunu araştırmak için bir kopya dosyanızda musait oldugunuzda denemenizi istesem ve sonucu da paylaşırsanız memnun olurum.

Aynı tuşun altına şu kodları ekleyin


Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String
    Dim eCriteria As String
    Dim dict As Object

    ' Scripting.Dictionary nesnesini oluştur
    Set dict = CreateObject("Scripting.Dictionary")

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Me.TextBox1.Value
    eCriteria = "GUN" ' E sütunu için filtre kriteri

    ' Filtre değerlerini sözlükte tut
    dict.Add "C", filterValue
    dict.Add "E", eCriteria

    ' Filtreleme işlemi
    With ws
        ' Mevcut filtreleri kontrol et
        If .AutoFilterMode Then
            ' C sütununu filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:=dict("C")
           
            ' E sütunundaki mevcut filtreyi kontrol et
            If .AutoFilter.Filters(5).On Then ' E sütunu 5. alan
                .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
            Else
                ' Eğer E sütununda filtre yoksa, ekle
                .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
            End If
        Else
            ' Eğer hiç filtre yoksa, hem C hem de E sütunlarını filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:=dict("C")
            .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
        End If
    End With
End Sub
 

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Mesajınızı geç gördüm SAyın @cems Kusuruma bakmayın lütfen. En kısa sürede deneyip sonucunu buraya yazacağım

Saygılarımla
 

petsiye

Altın Üye
Katılım
28 Eylül 2009
Mesajlar
165
Excel Vers. ve Dili
Office 2019 TR 32 Bit
Altın Üyelik Bitiş Tarihi
10-05-2029
Denedim Sayın @cems ,

Evet filtreleme yapıyor fakat, filtreler boş geliyor her nedense. Metin filtresi vs doğru görünüyor ama filtre sonucu boş çıkıyor

Bilgilerinize
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
boş bir sutuna bakıyordur yarın duzeltme gonderirim elden geldigince dosyasız olarak
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,494
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Aşağıdaki kodu, filtreleme kriterlerini daha esnek bir şekilde kontrol etmek ve doğru sonuçları almak için yeniden düzenledim. Bu şekilde, hem C hem de E sütunlarındaki filtreleme işlemi doğru şekilde yapabilir umuyorum. Bu kod yine scripting.dictionary temelli , size zahmet kopya uzerinde deneyiniz ve verimi gozlemleyiniz. Yine sorun verirse de kopyayı siliniz ve calısan dosyada devam ediniz. Buradaki ogrenmek istediğim ; buyuk veri kumesinde bu dictionary türü işlemin size hız kazandırıp kazandırmadığı, daha fazla ustunde durmaya çalışmadıgı durumda gerek yok. Çalışırsa da size alternatif olur.


Kod:
Private Sub btnCalistir_Click()
    Dim ws As Worksheet
    Dim filterValue As String
    Dim eCriteria As String
    Dim dict As Object

    ' Scripting.Dictionary nesnesini oluştur
    Set dict = CreateObject("Scripting.Dictionary")

    ' "FILTRE" sayfasını tanımla
    Set ws = ThisWorkbook.Sheets("FILTRE")

    ' TextBox içindeki değeri al
    filterValue = Trim(Me.TextBox1.Value) ' TextBox'tan alınan değeri temizle (ön ve son boşlukları kaldır)
    eCriteria = "GUN" ' E sütunu için filtre kriteri

    ' Eğer TextBox boşsa, kullanıcıya mesaj ver ve çık
    If filterValue = "" Then
        MsgBox "Lütfen filtrelemek için bir metin giriniz.", vbExclamation
        Exit Sub
    End If

    ' Filtre değerlerini sözlükte tut
    dict.Add "C", filterValue
    dict.Add "E", eCriteria

    ' Filtreleme işlemi
    With ws
        ' Mevcut filtreleri kontrol et
        If .AutoFilterMode Then
            ' C sütununu filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:="*" & dict("C") & "*"
            
            ' E sütunundaki mevcut filtreyi kontrol et
            If .AutoFilter.Filters(5).On Then ' E sütunu 5. alan
                .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
            Else
                ' Eğer E sütununda filtre yoksa, ekle
                .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
            End If
        Else
            ' Eğer hiç filtre yoksa, hem C hem de E sütunlarını filtrele
            .Range("C1").AutoFilter Field:=3, Criteria1:="*" & dict("C") & "*"
            .Range("E1").AutoFilter Field:=5, Criteria1:=dict("E")
        End If
    End With

    ' Kullanıcıya işlem tamamlandığında bilgi mesajı ver
    MsgBox "Filtreleme işlemi tamamlandı!", vbInformation
End Sub

Test Edilmesi Gereken Durumlar:
  • TextBox'a tam eşleşme ile bir metin girildiğinde, filtre doğru şekilde çalışmalı.
  • TextBox'a parça metin girildiğinde (örneğin, "Mavi" ve C sütununda "Mavi araba" gibi veriler varsa), yine filtreleme doğru şekilde yapılmalı.
  • E sütununda "GUN" filtresi düzgün bir şekilde uygulanmalı.
 
Üst