• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

ADO sorgusuna Userform Listbox da başlık eklemek

Katılım
24 Nisan 2005
Mesajlar
3,683
Excel Vers. ve Dili
Office 2016 EN 64 Bit
Merhaba,

Çok aramama rağmen, sorgu yaptığım tablonun başlıklarını Userform listbox listesinde RS.GetRows komutu ile beraber kullanamadım.
Farklı cevaplar olmasına rağmen, testlerimde RS.GetRows un daha hızlı sonuç aktardığını gördüğüm için bun uygun çözüm bulmak istedim.

Biraz uğraştırıcı oldu ama benim için çözüm olan bir yöntem yaptım bu işin RS.GetRows kullanımı ile beraber daha kolay yolu var ise önerilere açığım :)

* İki listbox kullanıldı. ListboxHeader aşağıdaki özellikler belirlendi. Ayrıca TabStop false yapıldı.

217329

Sorgu öncesinde, listbox1 de kolon genişlikleri tanımlandı. UserForm1.ListBox1.ColumnWidths = "0;120;250;160;160"
ListBoxHeader da TANIMLAR sayfasından O1:S1 de başlıklar yazıldı.
ListBoxHeader rowsource içinde O2:S2 tanımlandı. Bu hücreler boş içinde veri yok. UserForm1.ListBoxHeader.RowSource = "'TANIMLAR'!O2:S2"

ListBoxHeader ın kolon sayısı sorguya göre belirlendi. UserForm1.ListBoxHeader.ColumnCount = RS.Fields.Count
ListBoxHeader ın kolon genişlikleri Listbox1 e göre belirlendi. UserForm1.ListBoxHeader.ColumnWidths = UserForm1.ListBox1.ColumnWidths
TANIMLAR sayfasında tablo başlıklarından bağımsı istenilen başlıklar verilebilir.

Kod:
Sub listboxdoldur() 
    UserForm1.ListBox1.Clear
    UserForm1.ListBoxHeader.Clear
    UserForm1.ListBoxHeader.RowSource = ""
    
    Sql = ""
    Sql = Sql + " SELECT LOGICALREF,CODE, NAME,NAME3,NAME4 FROM [" & LOGODATASI & "].[dbo].[" & LOGOTABLOSU & "] "
    Sql = Sql + " WHERE CARDTYPE IN (10,11,12) AND ACTIVE=0 ORDER BY CODE"

    UserForm1.ListBox1.ColumnWidths = "0;120;250;160;160"
    UserForm1.ListBoxHeader.RowSource = "'TANIMLAR'!O2:S2"

    RS.Open Sql, conn, 1, 1

    On Error Resume Next
    If Not RS.EOF Then
    UserForm1.ListBoxHeader.ColumnCount = RS.Fields.Count
    UserForm1.ListBoxHeader.ColumnWidths = UserForm1.ListBox1.ColumnWidths
    UserForm1.ListBox1.ColumnCount = RS.Fields.Count
    UserForm1.ListBox1.Column = RS.GetRows
    End If
    On Error GoTo 0
End sub

217330
 
Sorgudan dönen sonuçları "CopyFromRecordSet" metoduyla bir sayfaya döküp, ListBox'a "RowSource" ile aktardığınızda "ColumnHeader"ları da alabilirsiniz.... ama ben olsam, sizin yaptığınıza benzer şekilde ama 1 adet ListBox'ı "RS" için kullanıp, "Header" olarak da yeteri kadar "Label" kullanırdım. Label'ların "Caption" özelliklerini RS'in "FieldNames" özelliğinden dinamik olarak çekerdim.

.
 
Sorgudan dönen sonuçları "CopyFromRecordSet" metoduyla bir sayfaya döküp, ListBox'a "RowSource" ile aktardığınızda "ColumnHeader"ları da alabilirsiniz.... ama ben olsam, sizin yaptığınıza benzer şekilde ama 1 adet ListBox'ı "RS" için kullanıp, "Header" olarak da yeteri kadar "Label" kullanırdım. Label'ların "Caption" özelliklerini RS'in "FieldNames" özelliğinden dinamik olarak çekerdim.

Öneri için teşekkür ederim. Sorgu sonuçlarını excel sayfasına aktarmak istedim.
Tek form da 5 ayrı sorgu sonucu listeleyip işlem yaptırıyorum her birinin kolon genişlikleri farklı. Bu şekilde daha pratik gibi geldi.
Label olarak da deneyebilirim.

Tablo başlıklarını listbox da 1. satıra kalanları da diğer satırlar RS.GetRows metodu ile yazabilseydim güzel olacaktır.
 
ListBox veri yüklemesinde satır bazına girdiğinizde döngü kullanmak gerekir. Bu da daha yavaş yüklemeye sebep olacaktır.

Sayfaya yükleyip ListBox'a RowSource yöntemi alma süresi ile sizin yaptığınız şekilde alma süresini kıyaslamak gerekir.
 
ListBox veri yüklemesinde satır bazına girdiğinizde döngü kullanmak gerekir. Bu da daha yavaş yüklemeye sebep olacaktır.

Sayfaya yükleyip ListBox'a RowSource yöntemi alma süresi ile sizin yaptığınız şekilde alma süresini kıyaslamak gerekir.

Lisbox a sayfaya yüklemeden satır satır aktarmayı 13000 satırlık veri için test ettiğimde
Satır satır 12 sn de aktarıyor.
RS.GetRows ise 3 sn de aktarıyor.

RowSource denemedim. Userform da arama kutusu var sürekli sorgu güncelleniyor.
Uygun bir zamanda 13000 kaydı denerim
 
Tablo başlıklarını listbox da 1. satıra kalanları da diğer satırlar RS.GetRows metodu ile yazabilseydim güzel olacaktır.

GetRows işlemi bittiğinde ilk satır öncesine satır ekleyerek kolon başlıkları eklenebilir gibi...

PHP:
Me.ListBox1.AddItem , 0

For i = 0 To ListBox1.ColumnCount - 1
    ListBox1.List(0, i) = rs(i).Name
Next

.
 
Üstad,

Bu durumda başlık satırı sanırım sabit kalamıyor. Veri satırı gibi davranıyor.
 
GetRows işlemi bittiğinde ilk satır öncesine satır ekleyerek kolon başlıkları eklenebilir gibi...

PHP:
Me.ListBox1.AddItem , 0

For i = 0 To ListBox1.ColumnCount - 1
    ListBox1.List(0, i) = rs(i).Name
Next

.

Zeki bey, denedim. ilk satıra kolon başlıkları geliyor. Ancak Korhan bey in belirttiği gibi veri satırı gibi ekleniyor.
Aşağı kaydırınca yeri sabit kalmıyor.
 
Bu durumda, farklı control kullanmak zorunlu. Kontrol yerine GDI api ile kolon başlığı çizilebilir. Ama genel olarak VBA kullanıcıları Win32 API pek sevmez.

.
 
Bu durumda, farklı control kullanmak zorunlu. Kontrol yerine GDI api ile kolon başlığı çizilebilir. Ama genel olarak VBA kullanıcıları Win32 API pek sevmez.

Evet, programın her kullanıcıda direkt çalışması lazım. Ne kadar fazla eklenti ve kullanıcıya özel ayarlar o kadar çok sorun :)
 
Geri
Üst