Anasayfa | Akademik Forum | Sizden Gelenler | Sipariş
Menü Açıklamaları
Sorular - Cevaplar
Makaleler
Makrolar
Yerleşik İşlevler
Animasyonlar
Yumurtalar
Fonksiyonlar
MTK Programlar
ExcelCE
Dosya İndir
Neler Yaptık?
İletişim
Makaleler
ListBox nesnesine veri almak ve bunları A-Z düzeninde sıralamak Muhammet Aytaş - 24.07.2006
Bu makalemde ListBox nesnesine veri alma yöntemlerini ve bunları sıralama konusunu anlatmaya çalışacağım. Örneğin çalışma sayfamızda alttaki gibi bir tablomuz olsun:



Şimdi bu listeyi ListBox nesnesine alalım.

1. Bunun için döngü kullanıp verileri tek tek ListBox’a alabiliriz:

Private Sub UserForm_Initialize()
  Dim Satir As Integer, Sutun As Byte

  For Satir = 0 To 8
    For Sutun = 0 To 2
      ListBox1.AddItem
      ListBox1.List(Satir, Sutun) = Cells(Satir + 2, Sutun + 1)
    Next
  Next
  ListBox1.ColumnCount = 3
End Sub

For-Next döngülerini 0’dan (ListBox nesnesinde ilk endeks 0) kayıt(kolon) adedinin bir eksiğine kadar kurduk.

2. Döngü kullanmadan dizi olarak ListBox nesnesine alabiliriz.

Private Sub UserForm_Initialize()
  ListBox1.List = ActiveSheet.Range("A2:C10").Value
  ListBox1.ColumnCount = 3
End Sub

3. ListBox’un RowSource özelliğini kullanarak da alabiliriz.

Private Sub UserForm_Initialize()
  ListBox1.RowSource = "Sayfa1!A2:C10"
  ListBox1.ColumnCount = 3
End Sub

Verilerimizi ListBox nesnesine alınca ortaya alttaki gibi bir görüntü çıktı:



Şimdi sıra geldi verileri A-Z düzeninde sıralamaya. Bunun için bir Kullanıcı Tanımlı Fonksiyon (KTF) hazırladık ve içerisinde iç içe 2 döngü kulandık.

Private Function Sirala(Liste As Variant)
  Dim i As Integer, j As Integer, x As Variant
 
  For i = LBound(Liste) To UBound(Liste) - 1
    For j = i + 1 To UBound(Liste)
      If StrComp(Liste(i, 0), Liste(j, 0), vbTextCompare) = 1 Then
        x = Liste(j, 0)
        Liste(j, 0) = Liste(i, 0)
        Liste(i, 0) = x
      End If
    Next j
  Next i
  Sirala = Liste
End Function

Bu KTF’de StrComp fonksiyonunu kullandık.

M.Temel Korkmaz Hoca’mızın EXCEL ile PROGRAMLAMA-1 kitabının 307.sayfasında StrComp fonsiyonu şu şekilde açıklanmış

StrComp – İki String (metinsel) ifadenin karşılaştırma sonucunu verir.

StrComp ( ifade1, ifade2 , Karşılaştırma )

Karşılaştırma: Bu argümana 0 (sıfır) değeri ( vbBinaryCompare ) verilirse büyük küçük harf ayrımı yapılır. Bu argüman 1 değerini ( vbTextCompare ) alırsa bu ayrım yapılmaz.

DİKKAT: Sadece “i” harfi problem çıkartabilir. “i” karakteri “I” karakterine dönüştürülebilir. Yani burada 2 karakter sırası karşılaştırılıyor ve sonuç bir tamsayı döndürüyor. Döndürülen sonuç “1” ise ifade1 büyüktür, “-1” ise ifade2 büyüktür, “0” ise ifade1=ifade2.

Özetle fonksiyonumuz bir sırada her üst ve alttaki metinleri karşılaştırıyor ve bunun sonucunda döndürülen değere göre bunların yerlerini değiştiriyor veya olduğu gibi bırakıyor. Üstte vermiş olduğumuz kodlar sadece tek sütun sıraladığı için çok sütunlu listelerde işimize yaramaz. Çok sütunlu sıralama için iç içe bir döngü daha kurmamız gerekiyor.

Private Sub Sirala_Click()
  Dim Liste As Variant 'değşkenimizi tanımladık

  Liste = ListBox1.List   ListBox1.RowSource = "" 'Eğer veriler bu metod ile alınmışsa bağlantıyı koparmamız gerekiyor
  ListBox1.List = Sirala(Liste, ListBox1.ColumnCount)
End Sub


Private Function Sirala1(Liste As Variant, Sutun As Byte)
  Dim i As Integer, j As Integer, say As Byte, x As Variant

  For i = LBound(Liste) To UBound(Liste) - 1
    For j = i + 1 To UBound(Liste)
      If StrComp(Liste(i, 0), Liste(j, 0), vbTextCompare) = 1 Then
        For say = 0 To Sutun - 1
          x = Liste(j, say)
          Liste(j, say) = Liste(i, say)
          Liste(i, say) = x
        Next
      End If
    Next j
  Next i
  Sirala = Liste
End Function

Sırala butonumuza tıklayınca UserForm’umuzda aldığımız görüntü alttaki gibidir:

Gördüğümüz gibi ilk sütunu baz alarak 3 sütunu da sıralamış olduk.

Eğer sıralama sütununuda biz belirlemek istersek o zaman KTF’u biraz da geliştirmemiz gerekiyor. Örneğin:

Dim Liste As Variant

Private Sub Label1_Click()
  Liste = ListBox1.List
  ListBox1.RowSource = ""
  ListBox1.List = Sirala(Liste, ListBox1.ColumnCount, 1)
End Sub

Private Sub Label2_Click()
  Liste = ListBox1.List
  ListBox1.RowSource = ""
  ListBox1.List = Sirala(Liste, ListBox1.ColumnCount, 2)
End Sub

Private Sub Label3_Click()
  Liste = ListBox1.List
  ListBox1.RowSource = ""
  ListBox1.List = Sirala(Liste, ListBox1.ColumnCount, 3)
End Sub

Private Sub UserForm_Initialize()
  ListBox1.RowSource = "Sayfa1!A2:C10"
  ListBox1.ColumnCount = 3
End Sub

Private Function Sirala(Liste As Variant, Sutun_Adedi As Byte, Siralanacak_Sutun_No As Byte)
  Dim i As Integer, j As Integer, say As Byte, x As Variant
 
  For i = LBound(Liste) To UBound(Liste) - 1
    For j = i + 1 To UBound(Liste)
      If StrComp(Liste(i, Siralanacak_Sutun_No - 1), Liste(j, Siralanacak_Sutun_No - 1), vbTextCompare) = 1 Then
        For say = 0 To Sutun_Adedi - 1
          x = Liste(j, say)
          Liste(j, say) = Liste(i, say)
          Liste(i, say) = x
        Next
      End If
    Next j
  Next i
  Sirala = Liste
End Function

Fonksiyondaki Siralanacak_Sutun_No argümanı bize sıralamak istediğimiz sütunu seçme imkanı veriyor. Sütun başlıklarını tıklamak süretiyle istediğimiz sütuna göre sıralam yapabiliriz, yani ListView nesnesinde olan bu özelliği ListBox’a da katmış olduk.

Destek
M.ÖZTÜRK - Y.KARAMAN
Bu siteyi, "Hayatını çocuklarının Ahlâklı ve Dürüst yetişmesi için harcamış olan Cefakar ve Fedakar, Canım ANNEM'e adadım."
Copyright © 1998-2011 M. Temel Korkmaz - Tüm hakları saklıdır.