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.
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.
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.
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.
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.
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.
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.
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.
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Kategori | Fiyat | Stok | RowSource Adresi |
| 2 | Dizüstü Bilgisayar | Elektronik | 28.500,00 | 14 | Ürünler!A2:D7 |
| 3 | Kablosuz Fare | Aksesuar | 450,00 | 120 | |
| 4 | Mekanik Klavye | Aksesuar | 1.850,00 | 65 | |
| 5 | 27 inç Monitör | Elektronik | 7.900,00 | 32 | |
| 6 | Yazıcı | Elektronik | 4.300,00 | 18 | |
| 7 | Ofis Sandalyesi | Mobilya | 3.650,00 | 25 |
ÜrünlerExcelDepo v1.0.0
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.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Personel | Departman | Şehir | Satır Sayısı | Sütun Sayısı | Ad Başvurusu |
| 2 | Ayşe Yılmaz | Muhasebe | Ankara | 7 | 3 | $A$2:$C$8 |
| 3 | Mehmet Demir | Satış | İstanbul | |||
| 4 | Fatma Kaya | İnsan Kaynakları | İzmir | |||
| 5 | Ali Çelik | Satış | Bursa | |||
| 6 | Zeynep Arslan | Bilgi İşlem | İstanbul | |||
| 7 | Mustafa Şahin | Muhasebe | Konya | |||
| 8 | Elif Aydın | Satış | Antalya |
PersonelExcelDepo v1.0.0
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.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Şehir | Bölge | Ciro | Sütun Sayısı | Başlık Satırı | RowSource Adresi |
| 2 | İstanbul | Marmara | 485.000,00 | 3 | A1:C1 | Satışlar!A2:C7 |
| 3 | Ankara | İç Anadolu | 312.500,00 | |||
| 4 | İzmir | Ege | 276.800,00 | |||
| 5 | Bursa | Marmara | 198.400,00 | |||
| 6 | Antalya | Akdeniz | 254.300,00 | |||
| 7 | Trabzon | Karadeniz | 143.900,00 |
SatışlarExcelDepo v1.0.0
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.