ADO / Çoklu Filtreleme / Sorgu

walabi

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

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Merhaba iyi akşamlar.

Ekte bir örnek dosya mevcut. İlgili dosyada Veri adlı sayfadan Listview e filtre / sorgu ile yükleme yapmaya çalışıyorum. Buna göre dosyamda İşlem Tipi, Lokasyon, Departman, Para Birimi gibi sütunlar var. Listbox ın çok seçimli özelliğini kullanarak listboxtaki verileri textbox lara aktarıyor ve bu textboxları değişken olarak kullanmaya çalışıyorum. Ancak userform üzerinde çok sayıda textbox kullanmak zorunda kalıyorum.

İstediğim ise şu. Listbox üzerinde yaptığım seçimleri textbox kullanmadan değişkene atayabilir miyim.


Yukardaki linkteki konuya benzer sanırım ancak biraz daha karmaşık kanımca istediğim şey.
 

Ekli dosyalar

walabi

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

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Dosyamda kullandığım kod bütünü aşağıdaki gibidir.

Kod:
With ListView1
      .ColumnHeaders.Clear
      .ListItems.Clear
End With

Call Userform_Baslik

    Dim My_Connection As Object, My_Recordset As Object, Liste As Object
    Dim My_Query As String, First_Date As Date, Last_Date As Date, Secilen_Date As Date
    


 
    If TextBox1 = "" Or TextBox2 = "" Then Exit Sub
    
    Set My_Connection = CreateObject("AdoDB.Connection")
    First_Date = TextBox1
    Last_Date = TextBox2

    

    My_Connection.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
    
    

    
    
      My_Query = "Select [İşlem Tipi],[Lokasyon],[Departman],[Ticari Unvan],[Fatura No],[Tarih],[PARA BİRİMİ],[Adet],[Fiyat],[Tutar] From [Veri$A:K] Where [Tarih] >=  " & CLng(First_Date) & " And [Tarih] <= " & CLng(Last_Date) & "" & _
      " And [İşlem Tipi] In ('" & TextBox10 & "' , '" & TextBox11 & "' , '" & TextBox12 & "' , '" & TextBox13 & "' , '" & TextBox14 & "' , '" & TextBox15 & "' , '" & TextBox16 & "' , '" & TextBox17 & "' , '" & TextBox18 & "' , '" & TextBox19 & "' ) " & _
      " And [Lokasyon] In ('" & TextBox30 & "' , '" & TextBox31 & "' , '" & TextBox32 & "' , '" & TextBox33 & "' , '" & TextBox34 & "' , '" & TextBox35 & "' , '" & TextBox36 & "' , '" & TextBox37 & "' , '" & TextBox38 & "' , '" & TextBox39 & "' , '" & TextBox40 & "' , '" & TextBox41 & "' ) " & _
      " And [Departman] In ('" & TextBox50 & "' , '" & TextBox51 & "', '" & TextBox52 & "', '" & TextBox53 & "', '" & TextBox54 & "', '" & TextBox55 & "', '" & TextBox56 & "', '" & TextBox57 & "', '" & TextBox58 & "', '" & TextBox59 & "'  ) " & _
      " And [Para Birimi] In ('" & TextBox60 & "' , '" & TextBox61 & "' , '" & TextBox62 & "', '" & TextBox63 & "', '" & TextBox64 & "', '" & TextBox65 & "', '" & TextBox66 & "', '" & TextBox67 & "', '" & TextBox68 & "', '" & TextBox69 & "' ) "

      
    Set My_Recordset = My_Connection.Execute(My_Query)
    
    On Error Resume Next
    
    With ListView1
        .ListItems.Clear
        Do While Not My_Recordset.EOF
            Set Liste = ListView1.ListItems.Add(, , My_Recordset.Fields(0).Value)
            Liste.SubItems(1) = My_Recordset.Fields(0).Value
            Liste.SubItems(2) = My_Recordset.Fields(1).Value
            Liste.SubItems(3) = My_Recordset.Fields(2).Value
            Liste.SubItems(4) = My_Recordset.Fields(3).Value
            Liste.SubItems(5) = My_Recordset.Fields(4).Value
            Liste.SubItems(6) = My_Recordset.Fields(5).Value
            Liste.SubItems(7) = My_Recordset.Fields(6).Value
            Liste.SubItems(8) = My_Recordset.Fields(7).Value
            Liste.SubItems(9) = My_Recordset.Fields(8).Value
            Liste.SubItems(10) = My_Recordset.Fields(9).Value
            
            Liste.SubItems(11) = My_Recordset.Fields(10).Value
            Liste.SubItems(12) = My_Recordset.Fields(11).Value
            Liste.SubItems(13) = My_Recordset.Fields(12).Value
            Liste.SubItems(14) = My_Recordset.Fields(13).Value
            Liste.SubItems(15) = My_Recordset.Fields(14).Value
            Liste.SubItems(16) = My_Recordset.Fields(15).Value
            Liste.SubItems(17) = My_Recordset.Fields(16).Value
            Liste.SubItems(18) = My_Recordset.Fields(17).Value
            Liste.SubItems(19) = My_Recordset.Fields(18).Value
            Liste.SubItems(20) = My_Recordset.Fields(19).Value


            My_Recordset.MoveNext
        Loop
    End With
    
    On Error GoTo 0
    
    My_Recordset.Close
    My_Connection.Close

    Set Liste = Nothing
    Set My_Recordset = Nothing
    Set My_Connection = Nothing
    
    
    TextBox4 = ListView1.ListItems.Count
End Sub
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,271
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Merhaba;

Yanlış anlamadıysam Listbox üzerindeki çoklu seçimleri sql cümlesindeki seçilenleri IN sözcüğü içinde kullanmaya çalışyorsunuz.

Modul düzeyinde dizi veya Collection tanımlarsanız gerektiğinde çağırıp birleştirirsiniz. Şahsi fikrim; sql için kullanılabilecek özel bir Class koleksiyon nesnesi daha uygun olur.

.
 

walabi

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

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

Yanlış anlamadıysam Listbox üzerindeki çoklu seçimleri sql cümlesindeki seçilenleri IN sözcüğü içinde kullanmaya çalışyorsunuz.

Modul düzeyinde dizi veya Collection tanımlarsanız gerektiğinde çağırıp birleştirirsiniz. Şahsi fikrim; sql için kullanılabilecek özel bir Class koleksiyon nesnesi daha uygun olur.

.
Zeki bey açıkcası bu konulara hakim değilim. Mantığını oturmadığım için ve bilgim yetersiz olduğu için konu açtım ve örnek dosya ekledim.
 

walabi

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

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Zeki bey açıkcası bu konulara hakim değilim. Mantığını oturmadığım için ve bilgim yetersiz olduğu için konu açtım ve örnek dosya ekledim.

Merhaba. Açtığım konu ile ilgili destek almam mümkün mü?. Konuyu kendi bilgime göre şöyle yapabilirim diye düşündüm. Medot yanlışmıdır ya da gereksiz midir bilmiyorum. Textbox yerine excel sayfası kullanabilirim diye düşündüm. Listbox1 de çoklu seçim yapıp bunları excel sayfasında ilgili sütuna aktarıyorum. İkinci aşama olarak bunları dizi ya da collection şeklinde gruplandırmaya çalışacaktım. Diziden gitmeye çalıştım ancak biryerlerde hata yapıyorum. çözemedim. Üçüncü aşama olarak da diziye alınan veriyi IN içinde kullanabilirim diye düşünmüştüm.

Kod:
Sub Koleksiyon1()
Dim evn As Collection
Set evn = New Collection

Dim s1 As Worksheet
Dim sonsat As Long
Dim i As Long
Dim x As Long
Dim a As Long
Dim y As Long
Dim n As Long
Dim Dizi()



Set s1 = Sheets("Koleksiyon")
sonsat = s1.[A65536].End(3).Row
s1.Range("A:A").Clear
s1.Range("H:H").Clear


x = 1
For i = 0 To UserForm1.ListBox1.ListCount - 1

   If UserForm1.ListBox1.Selected(i) = True Then
    s1.Cells(x, "A") = UserForm1.ListBox1.List(i)
    'MsgBox s1.Cells(x, "H")
    x = x + 1
  
   End If
Next i



ReDim Dizi(1 To 1, 1 To sonsat)

For y = 1 To sonsat
    a = a + 1
    Dizi(1, a) = s1.Cells(y, "A")
    
    MsgBox Dizi(1, a)
Next



End Sub
 

DoğanD

Altın Üye
Katılım
22 Eylül 2023
Mesajlar
392
Excel Vers. ve Dili
Office 365 TR
Altın Üyelik Bitiş Tarihi
05-10-2028
Merhaba,

Çok sıkı test edemedim fakat şöyle bir yol olabilir,

OptionButton'ların içinde bulunan UserForm1.Controls("TextBox" & 10 + a).Text = UserForm1.ListBox1.List(a) kodu yerine 1. Kriteri ifade edecek olan k1 = "'" & ListBox1.List(a) & "'," & k1 ekledim. Bunları da sıralı olarak K2,K3,K4 olarak diğer OptionButton'lara uyguladım. Bu değişkenleri de Public olarak modülün başında (Tüm Sub'ların dışında, en üste) Dim k1, k2, k3, k4 As Variant tanımladım. Sorguyu da aşağıdaki gibi değiştirdim. Bende birkaç denemede hata vermedi ve delmece kontrol ettiğim kadarıyla sağlıklı çalışıyor. Yine de çok sıkı test etmenizi öneririm SQL'de ben de yeniyim :)

Kod:
      My_Query = "Select [İşlem Tipi],[Lokasyon],[Departman],[Ticari Unvan],[Fatura No],[Tarih],[PARA BİRİMİ],[Adet],[Fiyat],[Tutar] From [Veri$A:K] Where [Tarih] >=  " & CLng(First_Date) & " And [Tarih] <= " & CLng(Last_Date) & "" & _
      " And [İşlem Tipi] In (" & k1 & " ) " & _
      " And [Lokasyon] In (" & k2 & ") " & _
      " And [Departman] In (" & k3 & ") " & _
      " And [Para Birimi] In (" & k4 & ") "
Ekleme: İlk sorguyu tamamladıktan sonra verileri üst üste yazmaması için Uygula butonlarının altında, döngüye başlamadan önce değişkenleri K1="" olarak temizledim.
 

walabi

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

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

Çok sıkı test edemedim fakat şöyle bir yol olabilir,

OptionButton'ların içinde bulunan UserForm1.Controls("TextBox" & 10 + a).Text = UserForm1.ListBox1.List(a) kodu yerine 1. Kriteri ifade edecek olan k1 = "'" & ListBox1.List(a) & "'," & k1 ekledim. Bunları da sıralı olarak K2,K3,K4 olarak diğer OptionButton'lara uyguladım. Bu değişkenleri de Public olarak modülün başında (Tüm Sub'ların dışında, en üste) Dim k1, k2, k3, k4 As Variant tanımladım. Sorguyu da aşağıdaki gibi değiştirdim. Bende birkaç denemede hata vermedi ve delmece kontrol ettiğim kadarıyla sağlıklı çalışıyor. Yine de çok sıkı test etmenizi öneririm SQL'de ben de yeniyim :)

Kod:
      My_Query = "Select [İşlem Tipi],[Lokasyon],[Departman],[Ticari Unvan],[Fatura No],[Tarih],[PARA BİRİMİ],[Adet],[Fiyat],[Tutar] From [Veri$A:K] Where [Tarih] >=  " & CLng(First_Date) & " And [Tarih] <= " & CLng(Last_Date) & "" & _
      " And [İşlem Tipi] In (" & k1 & " ) " & _
      " And [Lokasyon] In (" & k2 & ") " & _
      " And [Departman] In (" & k3 & ") " & _
      " And [Para Birimi] In (" & k4 & ") "
Ekleme: İlk sorguyu tamamladıktan sonra verileri üst üste yazmaması için Uygula butonlarının altında, döngüye başlamadan önce değişkenleri K1="" olarak temizledim.

Merhaba . Dosyanın kendinizde denediğiniz halini ekleyebilir misiniz.
 

walabi

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

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

Çok sıkı test edemedim fakat şöyle bir yol olabilir,

OptionButton'ların içinde bulunan UserForm1.Controls("TextBox" & 10 + a).Text = UserForm1.ListBox1.List(a) kodu yerine 1. Kriteri ifade edecek olan k1 = "'" & ListBox1.List(a) & "'," & k1 ekledim. Bunları da sıralı olarak K2,K3,K4 olarak diğer OptionButton'lara uyguladım. Bu değişkenleri de Public olarak modülün başında (Tüm Sub'ların dışında, en üste) Dim k1, k2, k3, k4 As Variant tanımladım. Sorguyu da aşağıdaki gibi değiştirdim. Bende birkaç denemede hata vermedi ve delmece kontrol ettiğim kadarıyla sağlıklı çalışıyor. Yine de çok sıkı test etmenizi öneririm SQL'de ben de yeniyim :)

Kod:
      My_Query = "Select [İşlem Tipi],[Lokasyon],[Departman],[Ticari Unvan],[Fatura No],[Tarih],[PARA BİRİMİ],[Adet],[Fiyat],[Tutar] From [Veri$A:K] Where [Tarih] >=  " & CLng(First_Date) & " And [Tarih] <= " & CLng(Last_Date) & "" & _
      " And [İşlem Tipi] In (" & k1 & " ) " & _
      " And [Lokasyon] In (" & k2 & ") " & _
      " And [Departman] In (" & k3 & ") " & _
      " And [Para Birimi] In (" & k4 & ") "
Ekleme: İlk sorguyu tamamladıktan sonra verileri üst üste yazmaması için Uygula butonlarının altında, döngüye başlamadan önce değişkenleri K1="" olarak temizledim.

Sayın DoğanD teşekkürler. ilk izlenimim sağlıklı çalıştığı yönünde. Bu kadar pratik olmasını beklemiyordum açıkcası.
 

walabi

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

excel 2013
Altın Üyelik Bitiş Tarihi
06-08-2025
Konu ile ilgili olarak örnek dosyanın son halini ekliyorum. Herkeze teşekkürler.
 

Ekli dosyalar

Üst