Genel Bakış
ColumnHeads (ColumnHeads özelliği), bir ListBox ya da ComboBox denetiminde listenin üstünde tek satırlık sütun başlıklarının gösterilip gösterilmeyeceğini belirler. Çok sütunlu listelerde hangi sütunda hangi verinin durduğunu kullanıcıya göstermek için kullanılır. Başlık metinleri elle yazılmaz; liste kaynağı olarak verilen aralığın hemen üstündeki satırdan alınır.
Özellikle şunlara dikkat edin:
Başlıklar Ürünler sayfasının A1:C1 hücrelerinden gelir. Kaynak aralığının hangi sayfaya ait olduğunu açıkça yazmak, formun hangi sayfa etkinken açıldığına bağlı kalmanızı önler. ColumnHeads'i kaynak aralığını atamadan önce ayarlamak güvenli bir sıradır.
Makro çalıştıktan sonra A9 hücresinin hizasında, üstünde Ürün, Birim Fiyat ve Stok başlıkları olan bir ListBox görünür. E2 hücresi ColumnHeads değerini (DOĞRU), E3 hücresi ise listedeki veri satırı sayısını (5) gösterir. Başlık satırı veri sayısına dahil edilmez.
Liste, A12 hücresinin hizasında Departman, Şehir ve Maaş başlıklarıyla görünür. F2 hücresi kullanılan kaynak aralığını (B2:D9), F3 hücresi ise veri satırı sayısını (8) verir. Başlıkların, kaynak aralığının hemen üstündeki satırdan alındığına dikkat edin: aralık B sütunundan başladığı için Ad Soyad başlığı listede yer almaz.
D2 hücresi ListBox ilk oluşturulduğunda ColumnHeads değerini (YANLIŞ), E2 hücresi ise özellik açıldıktan sonraki değeri (DOĞRU) gösterir. Liste A10 hücresinin hizasında, üstünde Ay, Bölge ve Tutar başlıklarıyla durur. Veriler sonradan A sütununda uzarsa kod, son dolu satırı kendisi bulur.
Söz dizimi
Özellik okunabilir ve yazılabilir bir Boolean değerdir:
VBA
2 satır
nesne.ColumnHeads = True ' başlıkları göster
Durum = nesne.ColumnHeads ' geçerli durumu oku
- nesne: ListBox ya da ComboBox denetimi (UserForm üzerindeki ya da çalışma sayfasına eklenmiş ActiveX denetimi). Zorunludur.
- True: Sütun başlıkları listenin üstünde ayrı bir satır olarak gösterilir.
- False: Başlık satırı gösterilmez. Bu varsayılan değerdir.
Başlıklar nereden gelir
Başlık metinleri, liste kaynağı olarak verilen aralığın hemen üstündeki satırdan okunur. UserForm üzerindeki denetimde bu kaynak RowSource özelliğidir. Çalışma sayfasındaki ActiveX denetiminde ise ListFillRange özelliğidir. Örneğin veriler A2:C6 aralığındaysa başlıklar A1:C1 hücrelerinden alınır. Bu nedenle kaynak aralığına başlık satırını dahil etmeyin, yalnızca veri satırlarını verin.Özellikle şunlara dikkat edin:
- AddItem ve List: Liste AddItem yöntemi ya da List özelliğiyle doldurulduysa başlık metni olmadığından başlık satırı boş görünür. Başlık gerekiyorsa listeyi aralıktan doldurun.
- ColumnCount: Başlık yalnızca görüntülenen sütunlar için çıkar. Sütun sayısını ColumnCount ile ayarlamayı unutmayın.
- ColumnWidths: Başlık sütunlarının genişliği veri sütunlarıyla aynıdır; genişlikleri ColumnWidths belirler.
- ListCount: Başlık satırı veri sayılmaz; ListCount yalnızca veri satırlarını verir.
UserForm içinde kullanım
UserForm üzerindeki bir ListBox'ı başlıklı doldurmak için genellikle UserForm_Initialize olayı kullanılır. Bu kodu UserForm'un kod modülüne yazın:
VBA
7 satır
Private Sub UserForm_Initialize()
With Me.lstUrun
.ColumnCount = 3
.ColumnHeads = True
.RowSource = "Ürünler!A2:C6"
End With
End Sub
1. Sayfadaki ListBox'a başlık satırı ekleme
A1:C6 aralığındaki ürün tablosu için çalışma sayfasına bir ActiveX ListBox eklenir ve başlıklar açılır. Veri aralığı A2:C6 olduğundan başlıklar A1:C1 hücrelerinden alınır. Makro, ColumnHeads değerini ve liste satır sayısını E sütununa yazar. Kodu standart bir modüle yapıştırın.
VBA
31 satır
Option Explicit
' Çalışma sayfasına başlıklı, çok sütunlu bir ListBox ekler
Sub BaslikliListeOlustur()
Dim ws As Worksheet
Dim ole As OLEObject
Set ws = ThisWorkbook.Worksheets("Ürünler")
' Önceki çalıştırmadan kalan denetimi sil
On Error Resume Next
ws.OLEObjects("lstUrun").Delete
On Error GoTo 0
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=ws.Range("A9").Left, Top:=ws.Range("A9").Top, _
Width:=240, Height:=110)
ole.Name = "lstUrun"
With ole.Object
.ColumnCount = 3
.ColumnHeads = True
.ColumnWidths = "90;70;50"
End With
' Başlıklar bu aralığın üstündeki satırdan (A1:C1) alınır
ole.ListFillRange = "A2:C6"
ws.Range("E2").Value = ole.Object.ColumnHeads
ws.Range("E3").Value = ole.Object.ListCount
End Sub
ColumnHeads
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün | Birim Fiyat | Stok | Ölçüt | Sonuç |
| 2 | Defter A5 | 18,75 | 120 | ColumnHeads | DOĞRU |
| 3 | Kalem | 4,50 | 340 | ListCount | 5 |
| 4 | Silgi | 3,25 | 210 | ||
| 5 | Dosya | 22,00 | 85 | ||
| 6 | Ataş | 6,90 | 400 |
ÜrünlerExcelDepo v1.0.0
2. Aralığın bir bölümünü başlıklarıyla listeleme
Personel tablosunun yalnızca Departman, Şehir ve Maaş sütunları listelenir. Ad Soyad sütunu liste dışında kalır. ListFillRange B2:D9 olduğundan başlıklar B1:D1 hücrelerinden gelir. Kodu standart bir modüle yapıştırın.
VBA
30 satır
Option Explicit
' Tablonun yalnızca B:D sütunlarını başlıklarıyla listeler
Sub PersonelListesiOlustur()
Dim ws As Worksheet
Dim ole As OLEObject
Set ws = ThisWorkbook.Worksheets("Personel")
On Error Resume Next
ws.OLEObjects("lstPersonel").Delete
On Error GoTo 0
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=ws.Range("A12").Left, Top:=ws.Range("A12").Top, _
Width:=260, Height:=130)
ole.Name = "lstPersonel"
With ole.Object
.ColumnCount = 3
.ColumnHeads = True
.ColumnWidths = "100;70;60"
End With
' Başlıklar B1:D1 hücrelerinden alınır
ole.ListFillRange = "B2:D9"
ws.Range("F2").Value = ole.ListFillRange
ws.Range("F3").Value = ole.Object.ListCount
End Sub
ColumnHeads
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Ad Soyad | Departman | Şehir | Maaş | Ölçüt | Sonuç |
| 2 | Ahmet Yılmaz | Satış | İstanbul | 28.500,00 | Kaynak aralık | B2:D9 |
| 3 | Ayşe Demir | Muhasebe | Ankara | 31.200,00 | Satır sayısı | 8 |
| 4 | Mehmet Kaya | Üretim | Bursa | 24.800,00 | ||
| 5 | Fatma Çelik | İnsan Kaynakları | İzmir | 29.750,00 | ||
| 6 | Ali Şahin | Satış | Adana | 27.300,00 | ||
| 7 | Zeynep Arslan | Muhasebe | Konya | 30.100,00 | ||
| 8 | Mustafa Aydın | Üretim | Gaziantep | 25.600,00 | ||
| 9 | Elif Öztürk | Satış | Antalya | 28.900,00 |
PersonelExcelDepo v1.0.0
3. Başlıkları açıp durumu okuma
Bu örnekte ListBox önce ColumnHeads değeri False iken oluşturulur ve bu durum D2 hücresine yazılır. Ardından özellik True yapılır ve yeni durum E2 hücresine yazılır. Veri aralığının son satırı, A sütunundaki son dolu hücreden bulunur; böylece tablo büyüse bile kod değişmez. Kodu standart bir modüle yapıştırın.
VBA
33 satır
Option Explicit
' ColumnHeads özelliğini önce False, sonra True yaparak durumu sayfaya yazar
Sub BaslikDurumuDegistir()
Dim ws As Worksheet
Dim ole As OLEObject
Dim sonSatir As Long
Set ws = ThisWorkbook.Worksheets("Satışlar")
sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
On Error Resume Next
ws.OLEObjects("lstSatis").Delete
On Error GoTo 0
Set ole = ws.OLEObjects.Add(ClassType:="Forms.ListBox.1", _
Left:=ws.Range("A10").Left, Top:=ws.Range("A10").Top, _
Width:=240, Height:=120)
ole.Name = "lstSatis"
With ole.Object
.ColumnCount = 3
.ColumnHeads = False ' varsayılan değer
End With
ole.ListFillRange = "A2:C" & sonSatir
' Başlıklar kapalıyken durum
ws.Range("D2").Value = ole.Object.ColumnHeads
' Başlıkları aç
ole.Object.ColumnHeads = True
ws.Range("E2").Value = ole.Object.ColumnHeads
End Sub
ColumnHeads
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Bölge | Tutar | İlk Durum | Son Durum |
| 2 | Ocak | Marmara | 45.200,00 | YANLIŞ | DOĞRU |
| 3 | Şubat | Ege | 38.750,00 | ||
| 4 | Mart | İç Anadolu | 41.300,00 | ||
| 5 | Nisan | Akdeniz | 52.600,00 | ||
| 6 | Mayıs | Karadeniz | 36.900,00 | ||
| 7 | Haziran | Marmara | 48.100,00 |
SatışlarExcelDepo v1.0.0
Kullanırken dikkat edin
- Başlık satırı kaynağın hemen üstünde olmalı: Başlıklar her zaman RowSource ya da ListFillRange aralığının bir üst satırından alınır. Aralığa başlık satırını da dahil ederseniz başlıklar veri gibi listelenir ve gerçek başlık yerine bir üstteki hücreler görünür. Veriler çalışma sayfasının ilk satırından başlıyorsa üstte satır olmayacağından başlık göstermek mümkün olmaz; verileri bir satır aşağı alın.
- AddItem ve List ile başlık gelmez: Liste AddItem yöntemi ya da List özelliğine atanan bir dizi ile doldurulmuşsa ColumnHeads True olsa bile başlık metni bulunmaz. Başlık gerekiyorsa listeyi aralıktan doldurun. Aralığı kullanmak istemiyorsanız ListBox'ın üstüne ayrı Label denetimleri koyarak başlık görünümü oluşturabilirsiniz.
- Başlık biçimini ayrıca değiştiremezsiniz: Başlık satırının yazı tipi ve boyutu listenin kendi yazı tipi ayarlarına bağlıdır; veriden bağımsız biçimlendirilemez. Başlık satırı seçilemez ve ListIndex ile gelen satır numaralarına katılmaz.
- ColumnCount ve ColumnWidths: Birden fazla sütunu göstermek için ColumnCount değerini sütun sayısına eşitleyin. Varsayılan değer 1 olduğundan yalnızca ilk sütun ve başlığı görünür. Sütun genişliklerini ColumnWidths ile noktalı virgülle ayırarak verin; sıfır genişlik sütunu gizler, başlığı da gizlenir.
- ComboBox için test edin: Özellik ComboBox için de tanımlıdır ancak asıl kullanım alanı ListBox denetimidir. ComboBox'ta başlıkların nasıl göründüğünü kendi Excel sürümünüzde deneyerek doğrulayın.
- İlgili konular:
- RowSource: UserForm ListBox ve ComboBox denetiminin aralıktan dolmasını sağlayan özellik.
- ListFillRange: Çalışma sayfasındaki ActiveX liste denetimlerinin kaynak aralığı.
- ColumnCount: Listede kaç sütunun görüneceğini belirler.
- ColumnWidths: Sütun genişliklerini belirler.
- BoundColumn: Değer olarak döndürülecek sütunu belirler.
- AddItem ve List: Listeyi aralık kullanmadan doldurma yolları.
- ListBox ve ComboBox: Bu özelliğin ait olduğu denetimler.
- OLEObjects: Çalışma sayfasındaki ActiveX denetimlerini yöneten nesne koleksiyonu.
- UserForm_Initialize: Listeyi form açılırken doldurmak için kullanılan olay.