Listbox ve ListView hız farkı

Katılım
5 Aralık 2007
Mesajlar
635
Excel Vers. ve Dili
Office 2007
Altın Üyelik Bitiş Tarihi
08-05-2021
Merhaba Arkadaşlar,
Her seferinde değişmekle birlikte yaklaşık olarak 30,000 satırdan oluşan bir listeyi 6 sütun halınde listbox a rowsource olayı ile bir saniye gibi bir sürede alırken, aşağıdaki kod ile ListViewde listelenmesi 10 saniye kadar sürüyor.
Listview ile ilgili kod:
For D = 2 To [ARŞİV!a65536].End(3).Row
ListView1.ListItems.Add , , Sheets("ARŞİV").Cells(D, "I").Value
Y = ListView1.ListItems.Count
ListView1.ListItems(Y).ListSubItems.Add , , Sheets("ARŞİV").Cells(D, "J").Value
ListView1.ListItems(Y).ListSubItems.Add , , Sheets("ARŞİV").Cells(D, "K").Value
ListView1.ListItems(Y).ListSubItems.Add , , Sheets("ARŞİV").Cells(D, "L").Value
ListView1.ListItems(Y).ListSubItems.Add , , Sheets("ARŞİV").Cells(D, "M").Value
Sormak istediğim şu; acaba yukarıdaki kod yerine kullanabileceğim daha hızlı çalışacak bir kod mümkün müdür?

İlgilenen arkadaşlara teşekkür ederim.
 

Zeki Gürsoy

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

Listbox kaynağı array olması ve çok fazla özelliği olmamasından daha hızlıdır.

Listeview a veri almada döngüden başka alternatif yoktur. Ancak kaynak veri range aralığında olduğundan teker teker hücre okuma yerine tüm range aralığını bir diziye aldıktan sonra döngüyü çalıştırın.

Boş bir dosyada test etmeniz için size kod yazdım. Bu algoritma kendi bilgisyarımda (i7 işllemci ile) range("a1:j50000") araığını (50.000 satır x 10 sütun) 2,5 sn de almaktadır.

Listview a veri almada bundan daha hızlı yöntem yoktur.

Kod:
Private Sub UserForm_Activate()
    Dim l As ListItem
    
    With Me.ListView1
        .View = lvwReport
        .LabelEdit = lvwManual
        .Gridlines = True
        .FullRowSelect = True
        
        .ColumnHeaders.Add , , "A", 100
        .ColumnHeaders.Add , , "B", 100
        .ColumnHeaders.Add , , "C", 100
        .ColumnHeaders.Add , , "D", 100
        .ColumnHeaders.Add , , "E", 100
        .ColumnHeaders.Add , , "F", 100
        .ColumnHeaders.Add , , "G", 100
        .ColumnHeaders.Add , , "H", 100
        .ColumnHeaders.Add , , "I", 100
        .ColumnHeaders.Add , , "J", 100
        
        t1 = Timer
        
        arr = Range("a1:j50000").Value [COLOR=DarkGreen]' Listeyi RAM e yükle[/COLOR]
        
        For i = 1 To 50000
        
            Set l = .ListItems.Add(, , arr(i, 1))
            
            For j = 1 To 9
                l.SubItems(j) = arr(i, j + 1)
            Next
            
        Next
        
        t2 = Timer
        
        MsgBox "İşlem, " & t2 - t1 & " saniyede bitti. " & .ListItems.Count & _
        " satır ve " & .ColumnHeaders.Count & " sütun"
  
    End With
    
End Sub
 
Katılım
5 Aralık 2007
Mesajlar
635
Excel Vers. ve Dili
Office 2007
Altın Üyelik Bitiş Tarihi
08-05-2021
Merhaba sayın Zeki Gürsoy,
Örnek kod ve açıklamalarınız için çok teşekkür ederim. Kullandığım yönteme göre oldukça hızlı bir çalışma. Ellerinize sağlık. Esenlikler dilerim.
 
Üst