Özellik ikonu

RowSource

İndirme izni yok

Genel Bakış

RowSource (RowSource property), UserForm üzerindeki ListBox ve ComboBox denetimlerinin liste öğelerini çalışma sayfasındaki bir hücre aralığından okumasını sağlayan özelliktir. Aralığın adresi metin olarak verilir; böylece liste, kod yazarak tek tek öğe eklemeye gerek kalmadan sayfadaki verilerle dolar ve sayfadaki değişiklikleri yansıtır. Çok sütunlu listeler, başlık satırı gösterme ve adlandırılmış aralık kullanma gibi senaryoların temelidir.

Söz dizimi​

RowSource özelliği yalnızca UserForm içindeki ListBox ve ComboBox denetimlerinde bulunur. Değer olarak, kaynak aralığın adresini içeren bir metin alır ve okunduğunda yine metin (String) döndürür:
VBA 2 satır
nesne.RowSource = "SayfaAdı!A2:C10"
kaynak = nesne.RowSource
  • nesne: Bir ListBox ya da ComboBox denetimi (ör. Me.ListBox1).
  • Değer: Sayfa adı, ünlem işareti ve aralık adresinden oluşan metin (ör. Ürünler!A2:D7) ya da adlandırılmış aralığın adı. Özellik isteğe bağlıdır; varsayılanı boş metindir, yani liste herhangi bir aralığa bağlı değildir.
  • Dönüş değeri: Atanmış adres metni; bağlantı yoksa boş metin.
  • Sayfa adı: Yazılmazsa o anda etkin olan sayfa kullanılır. Form başka bir sayfa etkinken açılabileceği için sayfa adını her zaman yazın. Sayfa adında boşluk ya da özel karakter varsa adı tek tırnak içine alın: 'Ürün Listesi'!A2:D7.
Özelliği tasarım zamanında UserForm'u seçip Özellikler penceresinden de ayarlayabilirsiniz; ancak veri sayısı değişiyorsa adresi kodla hesaplamak daha güvenlidir.

Bağlantının işleyişi​

RowSource atandığında liste, sayfadaki aralığa bağlanır. Aralıktaki bir hücrenin değeri değişirse liste de güncellenir. Kullanıcı listedeki öğeleri değiştiremez; liste yalnızca kaynağı gösterir.
  • Seçilen değer: Value özelliği BoundColumn ile belirtilen sütunun değerini verir (varsayılan 1. sütun). Text görünen metni, ListIndex seçilen satırın sıfırdan başlayan sırasını döndürür.
  • Başka sütunlara erişim: Çok sütunlu listede seçilen satırın diğer sütunlarını Column özelliği ile okursunuz; sütun numarası sıfırdan başlar (ör. ListBox1.Column(2) üçüncü sütundur).
  • Adres sabittir: Kaynak aralığın sonuna sayfada yeni satır eklerseniz liste otomatik genişlemez. Adresi son dolu satıra göre kodla yeniden hesaplayıp atayın.
  • Bağlantıyı kaldırma: RowSource = "" atamasıyla bağlantı kesilir ve liste boşalır.
Tipik kullanım, formun UserForm_Initialize olayında adresi hesaplayıp denetime atamaktır:
VBA 13 satır
Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim son As Long

    Set ws = ThisWorkbook.Worksheets("Ürünler")
    son = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    With Me.ListBox1
        .ColumnCount = 4
        .ColumnHeads = True
        .RowSource = ws.Name & "!A2:D" & son
    End With
End Sub

Çok sütunlu liste ve başlık satırı​

Varsayılan olarak denetim tek sütunlu çalışır; aralık birden çok sütun içerse bile yalnızca ilk sütun görünür. Bu nedenle RowSource ile birlikte şu özellikleri de ayarlayın:
  • ColumnCount: Listede gösterilecek sütun sayısı. Genellikle kaynak aralığın sütun sayısına eşitlenir.
  • ColumnHeads: True yapılırsa kaynak aralığın hemen üstündeki satır sütun başlığı olarak gösterilir. Bu nedenle RowSource başlık satırını değil, ilk veri satırından başlayan aralığı göstermelidir. Başlıklar ListBox üzerinde görünür.
  • ColumnWidths: Sütun genişliklerini noktalı virgülle ayrılmış biçimde verir (ör. "120;80;60;40"). Genişliği 0 olan sütun gizlenir ama BoundColumn ya da Column ile okunabilir.
  • BoundColumn: Value özelliğinin hangi sütunu döndüreceğini belirler.
Örneğin başlıklar A1:D1 aralığında, veriler A2:D7 aralığındaysa RowSource için Ürünler!A2:D7 yazılır, ColumnCount 4 olur ve ColumnHeads True ayarlanır.

RowSource ile List ve AddItem farkı​

Bir listeyi doldurmanın üç yolu vardır ve bunlar birbirinden farklı çalışır:
  • RowSource: Sayfadaki aralığa canlı bağlantı kurar; kod kısadır, başlık satırı desteklenir.
  • AddItem: Öğeleri tek tek ekler; sayfadan bağımsızdır ve sonradan RemoveItem ile öğe silebilirsiniz.
  • List: Bir diziyi ya da aralığın değerlerini listeye kopyalar; bağlantı kurmaz.
RowSource atanmışken AddItem, RemoveItem ya da Clear kullanamazsınız; hata alırsınız. Bu yöntemlere geçmeden önce RowSource = "" ile bağlantıyı kaldırın. Listenin sayfadan bağımsız, düzenlenebilir olmasını istiyorsanız List ya da AddItem tercih edilir.

1. Son satıra göre RowSource adresi hazırlama​

Ürün listesi A1:D7 aralığındadır; veriler 2. satırdan başlar. Liste uzayıp kısaldığında formdaki ListBox için doğru adresi üretmek gerekir. Alt+F11 ile Visual Basic Düzenleyicisi'ni açın, Ekle > Modül (Insert > Module) ile standart modül ekleyip kodu yapıştırın. Makro adresi E2 hücresine yazar; formda aynı metin RowSource özelliğine atanır.
VBA 20 satır
Option Explicit

' Dinamik RowSource adresini hazırlar ve E2 hücresine yazar
Sub AdresHazirla()
    Dim ws As Worksheet
    Dim son As Long
    Dim adres As String

    Set ws = ThisWorkbook.Worksheets("Ürünler")

    ' A sütunundaki son dolu satırı bul
    son = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' Sayfa adı + aralık: ListBox için hazır RowSource metni
    adres = ws.Name & "!A2:D" & son
    ws.Range("E2").Value = adres

    ' UserForm_Initialize içinde şu satır kullanılır:
    ' Me.ListBox1.RowSource = adres
End Sub
RowSource
Formülünü incelemek için bir hücre seçin.
ABCDE
1ÜrünKategoriFiyatStokRowSource Adresi
2Dizüstü BilgisayarElektronik28.500,0014Ürünler!A2:D7
3Kablosuz FareAksesuar450,00120
4Mekanik KlavyeAksesuar1.850,0065
527 inç MonitörElektronik7.900,0032
6YazıcıElektronik4.300,0018
7Ofis SandalyesiMobilya3.650,0025
ÜrünlerExcelDepo v1.0.0
Makro, A sütunundaki son dolu satırı bulup sayfa adıyla birleştirir ve E2 hücresine Ürünler!A2:D7 metnini yazar. Formda bu metin ListBox1.RowSource özelliğine atanır; ColumnCount 4 yapılırsa tüm sütunlar görünür. Listeye yeni ürün eklediğinizde adres kendiliğinden güncellenmez; son satır yalnızca kod çalıştığında hesaplandığı için makroyu yeniden çalıştırmanız ve formda adresi yeniden hesaplayıp atamanız gerekir.

2. Adlandırılmış aralığı RowSource olarak kullanma​

Personel listesi A1:C8 aralığındadır. RowSource özelliğine adres yerine bir ad verilebilir; böylece form kodunda sayfa adı ve adres yazmanız gerekmez. Aşağıdaki makro, standart modüle yapıştırıldığında PersonelListe adını son dolu satıra göre tanımlar ve aralığın boyutunu sayfaya yazar. Formda ListBox1.RowSource = "PersonelListe" yazmanız yeterlidir.
VBA 24 satır
Option Explicit

' PersonelListe adını veri aralığına göre (yeniden) tanımlar
Sub AdTanimla()
    Dim ws As Worksheet
    Dim son As Long
    Dim liste As Range

    Set ws = ThisWorkbook.Worksheets("Personel")
    son = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' Başlık satırı hariç, A2:C son aralığına ad ver
    ThisWorkbook.Names.Add Name:="PersonelListe", _
        RefersTo:="=" & ws.Name & "!$A$2:$C$" & son

    Set liste = ThisWorkbook.Names("PersonelListe").RefersToRange

    ws.Range("D2").Value = liste.Rows.Count
    ws.Range("E2").Value = liste.Columns.Count
    ws.Range("F2").Value = liste.Address

    ' Formda: Me.ListBox1.RowSource = "PersonelListe"
    '         Me.ListBox1.ColumnCount = liste.Columns.Count
End Sub
RowSource
Formülünü incelemek için bir hücre seçin.
ABCDEF
1PersonelDepartmanŞehirSatır SayısıSütun SayısıAd Başvurusu
2Ayşe YılmazMuhasebeAnkara73$A$2:$C$8
3Mehmet DemirSatışİstanbul
4Fatma Kayaİnsan Kaynaklarıİzmir
5Ali ÇelikSatışBursa
6Zeynep ArslanBilgi İşlemİstanbul
7Mustafa ŞahinMuhasebeKonya
8Elif AydınSatışAntalya
PersonelExcelDepo v1.0.0
Makro, PersonelListe adını tanımlar ve aralığın boyutunu sayfaya yazar: satır sayısı 7, sütun sayısı 3, adres $A$2:$C$8. Ad Yöneticisi'nde de aynı adı görebilirsiniz. RowSource özelliğine yalnızca ad yazıldığında sayfa adı kodda geçmediği için, sayfanın adı değişse bile form kodunu düzenlemeniz gerekmez. Ad, makro her çalıştığında son satıra göre yenilenir.

3. ColumnCount ve başlık satırı için gerekli değerler​

Şehir bazlı ciro listesi A1:C7 aralığındadır. ListBox'ta başlıkların görünmesi için RowSource başlık satırının altından başlamalı, ColumnCount ise sütun sayısına eşit olmalıdır. Bu makro, standart modüle yapıştırıldığında gerekli üç değeri hesaplayıp sayfaya yazar. Formun kodu, Bağlantının işleyişi bölümündeki UserForm_Initialize örneğine benzer biçimde bu değerleri kullanır.
VBA 30 satır
Option Explicit

' ListBox ayarları için gereken değerleri hesaplar
Sub FormAyarlari()
    Dim ws As Worksheet
    Dim veri As Range
    Dim son As Long

    Set ws = ThisWorkbook.Worksheets("Satışlar")
    son = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' Başlık hariç veri aralığı
    Set veri = ws.Range("A2:C" & son)

    ' ColumnCount için sütun sayısı
    ws.Range("D2").Value = veri.Columns.Count

    ' ColumnHeads = True iken başlık olarak kullanılacak satır
    ws.Range("E2").Value = veri.Offset(-1).Resize(1).Address(False, False)

    ' RowSource için tam adres
    ws.Range("F2").Value = ws.Name & "!" & veri.Address(False, False)

    ' Formda:
    ' With Me.ListBox1
    '     .ColumnCount = 3
    '     .ColumnHeads = True
    '     .RowSource = ws.Name & "!" & veri.Address(False, False)
    ' End With
End Sub
RowSource
Formülünü incelemek için bir hücre seçin.
ABCDEF
1ŞehirBölgeCiroSütun SayısıBaşlık SatırıRowSource Adresi
2İstanbulMarmara485.000,003A1:C1Satışlar!A2:C7
3Ankaraİç Anadolu312.500,00
4İzmirEge276.800,00
5BursaMarmara198.400,00
6AntalyaAkdeniz254.300,00
7TrabzonKaradeniz143.900,00
SatışlarExcelDepo v1.0.0
Makro D2 hücresine ColumnCount için sütun sayısını (3), E2 hücresine ColumnHeads = True iken başlık olarak kullanılacak satırın adresini (A1:C1) ve F2 hücresine RowSource özelliğine atanacak metni (Satışlar!A2:C7) yazar. Başlık satırı, RowSource aralığının hemen üstündeki satırdır; bu yüzden RowSource A1 değil A2'den başlar.

Kullanırken dikkat edin​

  • Sayfa adını mutlaka yazın: Sayfa adı verilmezse etkin sayfa kullanılır. Form açıldığında başka bir sayfa etkinse liste yanlış veriyle dolar ya da boş kalır. Sayfa adında boşluk veya özel karakter varsa adı tek tırnak içine alın, örneğin 'Ürün Listesi'!A2:D7. Kodla adres kurarken adı ws.Name ile okuyun.
  • AddItem ve Clear ile birlikte kullanılamaz: RowSource atanmış bir listeye AddItem, RemoveItem ya da Clear uygulayamazsınız; hata alırsınız. Önce RowSource = "" ile bağlantıyı kaldırın, sonra listeyi yöntemlerle doldurun.
  • Aralığı fazla geniş tutmayın: Adres, son dolu satırdan sonraki boş satırları da kapsıyorsa listede boş öğeler görünür. Adresi her zaman End(xlUp) ile bulduğunuz son dolu satıra göre hesaplayın. Başlık satırını aralığa dahil etmeyin; başlıklar için ColumnHeads kullanın.
  • ColumnCount'ı unutmayın: ColumnCount varsayılan olarak 1'dir. Aralık birden çok sütun içerse bile yalnızca ilk sütun görünür. Sütun sayısını kaynak aralığın sütun sayısına eşitleyin; sütun genişliklerini ColumnWidths ile ayarlayın.
  • Excel tablosu kullanıyorsanız: Veriler bir Excel tablosundaysa (ListObject) adresi tablonun veri gövdesinden üretmek güvenlidir: sayfa adını ve tablonun DataBodyRange adresini birleştirip RowSource özelliğine metin olarak atayın. Tabloya satır eklendiğinde adresi yeniden hesaplamayı unutmayın.
  • Canlı bağlantı: Liste, sayfadaki hücrelere bağlıdır; kaynak hücreler silinir ya da sayfa yeniden düzenlenirse liste de etkilenir. Sayfadan bağımsız bir kopya gerekiyorsa aralığı List özelliğine atayın ya da öğeleri AddItem ile ekleyin.
  • İlgili konular:
    • ListBox ve ComboBox: RowSource özelliğine sahip denetimler.
    • ColumnCount, ColumnHeads, ColumnWidths, BoundColumn: Çok sütunlu listeyi biçimlendiren özellikler.
    • List, AddItem, RemoveItem, Clear: Listeyi sayfadan bağımsız doldurma ve boşaltma.
    • ControlSource: Seçilen değeri bir hücreye bağlayan özellik.
    • UserForm_Initialize: Listeyi form açılırken doldurmak için kullanılan olay.
    • Names.Add: Adlandırılmış aralık tanımlama yöntemi; Formüller > Tanımlı Adlar > Ad Yöneticisi (Formulas > Defined Names > Name Manager).
    • End(xlUp): Son dolu satırı bulma.
    • KAYDIR ve DOLAYLI: Dinamik aralık adları oluşturmakta kullanılan işlevler.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
13
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst