C

Çözüldü Listbox Nesnesinde Sütunlara İsim Yazmak

cengizyener

Normal Üye
Excel Versiyonu
Excel 2016
Excel Sürümü
64 Bit
Excel Dili
Türkçe
Arkadaşlar merhaba,

Aşağıdaki gibi bir kodum buradaki hocalarım sayesinde formülü sağolsunlar verdiler. Şimdi ise bu kolonlara 2. kolona tarih, 3.kolona cari kod gibi sütun adı vermek istiyorum ama yapamadım. Tb3ListDetay.ColumnHeads = True yapınca ilk kolon sabitleniyor ama içi boş geliyor. Yardımlarınızı rica ederim

Private Sub Tb3ListBox2_Click()
Dim x As Long
Dim s As Worksheet
Set s = ThisWorkbook.Sheets("Satışlar")

Tb3TxbLogicalref = Tb3ListBox2.List(Tb3ListBox2.ListIndex, 2)

Tb3ListDetay.Clear

If s.AutoFilterMode Then s.AutoFilterMode = False
x = s.Cells(Rows.Count, 2).End(3).Row
On Error Resume Next
If Tb3BaslangicTarihi <> "" Then
bas = CLng(CDate(Tb3BaslangicTarihi.Text))
Else: bas = CLng(WorksheetFunction.Min(s.[A:A]))
End If
If Tb3BitisTarihi <> "" Then
bit = CLng(CDate(Tb3BitisTarihi.Text))
Else: bit = CLng(WorksheetFunction.Max(s.[A:A]))
End If

For Each isim In s.Range("Satışlar!b3:b" & x - 1)
If isim Like Tb3TxbLogicalref _
And s.Cells(isim.Row, 1) >= bas _
And s.Cells(isim.Row, 1) <= bit _
And isim.Offset(0, 3).Value = ThisWorkbook.Sheets("Tanım").[C4].Value Then
' bu alana ne yaptıysam başlangıç ve bitiş tarihli filtreleyemedim
liste = Tb3ListDetay.ListCount
Tb3ListDetay.AddItem -1
Tb3ListDetay.List(liste, 1) = isim.Offset(0, -1).Text
Tb3ListDetay.List(liste, 2) = isim.Offset(0, 0)
Tb3ListDetay.List(liste, 3) = isim.Offset(0, 1)
Tb3ListDetay.List(liste, 4) = isim.Offset(0, 2)
Tb3ListDetay.List(liste, 5) = isim.Offset(0, 3)
End If
Next

Tb3ListDetay.ColumnCount = 5
Tb3ListDetay.ColumnHeads = False
Tb3ListDetay.ColumnWidths = "20;50;50;50;50;80"
If Tb3ListDetay.ListCount > 0 Then Tb3ListDetay.Selected(Tb3ListDetay.ListCount - 1) = True

End Sub
 

Ekli dosyalar

@cengizyene
Listbox'ta sütun başlıklarını dahil edebilmek için;
-- mevcut AddItem döngüsüne girmeden önce ( yani For each isim.... satırından önce) ilk veri satırı olarak yine AddItem yöntemiyle başlık satırı yüklenebilir. (buradaki sakınca ise başlık satırı da listenin bir elemanı olduğundan seçilebilir bir veri satırı muamelesi görmesi. bu sakıncanın sıkıntı yaratmaması için alttaki listboxa ait _Click kodunun başına bir koşul satırı eklenerek ilk satırın seçimemesi, daha doğrusu seçimin 1 alta kaydırılması sağlanabilir)
-- bir seçenek de belgeye, alttaki listboxa kaynaklık teşkil edecek ve başlıkların da yer aldığı yeni bir sayfa eklenip (ya da aynı sayfada, sağda uygun sütunlar da kullanılabilir), üstteki Listboxtaki seçime göre bu yeni sayfa/alan doldurulup, alttaki Listbox'a AddItem yerine RowSource yöntemiyle (eklenen yeni sayfayı kaynak göstererek) Listbox doldurulabilir.

Son seçenek ise (ben olsam bunu kullanırım); başlıkları listboxa dahil etmeyip(ColumnsHead = False şeklinde kullanmaya devam edip), listboxun üstüne her sütun için birer adet LABEL nesnesi ekleyerek, başlıkları bu LABELlara yazmak, listboxa başlık satırını eklemekle vs uğraşmamak.

.
 
@Ömer BARAN Hocam geri dönüşünüz için çok teşekkür ederim 1. seçeneği kullanabilirim ve ona ait kod düzenlemesi yapayım. 2. seçeneği kullanamama seçeneğim bu aslında sadece kodları öğrenme amacıyla yaptığım excel dosyası. Asıl excel dosyası çok karmaşık. Additem i alma sebebim Rowsource u kullanamam çünkü bazen kolon sıralaması A:B:C yerine C:B:A şeklinde olabiliyor. Ama ilk yöntemi deneyeceğim. Emeğinize sağlık çok yardımcı oldunuz :) :) :) :)
 
İkinci seçenekte belirttiğim RowSource yöntemi zaten sütun sıralaması konusunda esneklik de kazandırır.
İlgili yardımcı alana/sayfaya verileri istediğiniz sütun sıralaması neyse ona göre aktarırsınız,
tek satırlık RowSource koduyla da Listbox'ta gösterirsiniz.

Tekrarlayayım; ben olsam son seçeneği (ColumnHeads=False şeklinde kullanıp, başlıkları LABEL nesnelerine almak) düşünürüm.
Gereksiz kodlamalardan da kurtulmuş olursunuz.

Tercih sizin elbette.

.
 
İkinci seçenekte belirttiğim RowSource yöntemi zaten sütun sıralaması konusunda esneklik de kazandırır.
İlgili yardımcı alana/sayfaya verileri istediğiniz sütun sıralaması neyse ona göre aktarırsınız,
tek satırlık RowSource koduyla da Listbox'ta gösterirsiniz.

Tekrarlayayım; ben olsam son seçeneği (ColumnHeads=False şeklinde kullanıp, başlıkları LABEL nesnelerine almak) düşünürüm.
Gereksiz kodlamalardan da kurtulmuş olursunuz.

Tercih sizin elbette.

.
@Ömer BARAN Hocam
O zaman dediğiniz gibi label ile çözeyim ama RowSource de bu özelliğin olduğunu bilmiyordum. öğrenmek için soruyorum örnek olarak ekteki dosyada I kolonu 1 de, M kolonu 2 de C kolonu 3 de yer alacak olsa kod nasıl olmalı yardımcı olabilir misiniz? Sadece şablonunu verseniz yeter ben kodu şöyle kullanıyorum.

LstGeçmişAramalar.ColumnCount = 21
LstGeçmişAramalar.RowSource = "sorgu!a2:u" & KS
veya
LstAranacaklar.ColumnCount = 12
LstAranacaklar.RowSource = "a2" & ":" & "L" & st
 
@cengizyene
Önce şunu belirteyim mevcut kodda -1'lerden ibaret bir sütun oluşturma nedeninizi bilemiyorum, anlam veremedim.
Bunun yerine veri kaynağı sayfada bir sıra numarası sütunu olsa ve ilk sütun olarak bu sıra numarası Listbox'a eklense daha iyi olur.

Her neyse; mevcut kodda;
For Each isim In s.Range("Satışlar!b3:b" & x - 1)
.......
Tb3ListDetay.List(liste, 1) = isim.Offset(0, -1).Text
Tb3ListDetay.List(liste, 2) = isim.Offset(0, 0)
Tb3ListDetay.List(liste, 3) = isim.Offset(0, 1)
Tb3ListDetay.List(liste, 4) = isim.Offset(0, 2)
Tb3ListDetay.List(liste, 5) = isim.Offset(0, 3)


Koşula uyan B sütunu hücresi bulunduğunda (diyelim hücre B10 hücresi) Listbox'taki sütun sırasına göre;
-- en başta -1 'lerden oluşan sütunun sütun no SIFIR oluyor (AddItem ile eklenen SATIR)
-- 1 solundaki değer (A10) >> ...etay.List(liste, 1) = isim.Offset(0, -1).Text (tarih biçimlendirmesi yapmamak için .Value yerine .Text dedik)
-- kendi değeri (B10) >> ...etay.List(liste, 2) = isim.Offset(0, 0)
-- 1 sağındaki değer (C10) >> ...etay.List(liste, 3) = isim.Offset(0, 1)
-- 2 sağındaki değer (D10) >> ...etay.List(liste, 4) = isim.Offset(0, 2)
-- 3 sağındaki değer (D10 >> ...etay.List(liste, 5) = isim.Offset(0, 3)
Listbox'a alınıyor.

Offset(0, x) buradaki POZİTİF veya NEGATİF x değerini değiştirerek, ilgili (koşula uyan) satırda,
hangi sütundaki veriyi hangi sırayla almak istiyorsanız bunu belirleyebilirsiniz.
Burada x değeri NEGATİF ise sola doğru kaç sütun gidileceğini, POZİTİF ise sağa doğru kaç sütun gidileceğini belirtmiş oluyorsunuz.
-- Kırmızı renklendirdiğim sayıları Listbox'un sütun numarası gibi düşünün (en başta -1 'lerden oluşan sütunun sütun no SIFIR)
-- Yeşil sayılar ise B sütunundan kaç sütun sola/sağa gidileceğini belirtiyor.

Bu açıklamalara göre gerekli düzenlemeleri kendiniz yapabilirsiniz diye düşünüyorum.

.
 
@Ömer BARAN Hocam Merhabalar,

Koşula uyan B sütunu hücresi bulunduğunda (diyelim hücre B10 hücresi) Listbox'taki sütun sırasına göre;
-- en başta -1 'lerden oluşan sütunun sütun no SIFIR oluyor (AddItem ile eklenen SATIR)
-- 1 solundaki değer (A10) >> ...etay.List(liste, 1) = isim.Offset(0, -1).Text (tarih biçimlendirmesi yapmamak için .Value yerine .Text dedik)
-- kendi değeri (B10) >> ...etay.List(liste, 2) = isim.Offset(0, 0)
-- 1 sağındaki değer (C10) >> ...etay.List(liste, 3) = isim.Offset(0, 1)
-- 2 sağındaki değer (D10) >> ...etay.List(liste, 4) = isim.Offset(0, 2)
-- 3 sağındaki değer (D10 >> ...etay.List(liste, 5) = isim.Offset(0, 3)
Listbox'a alınıyor.

hocam bu kodları revize ettiğimde benim ilk mesajımdaki kodlarla aynıdır,
sizden ricam yukarda bahsettiğiniz "İkinci seçenekte belirttiğim RowSource yöntemi zaten sütun sıralaması konusunda esneklik de kazandırır." rica etsem rowsource ile önce C:A:B:E şeklinde sıralama yapabileceğim kodu paylaşabilir misiniz? Şimdiden teşekkür ederim Hocam.
 
Kriter sütunu B sütunuysa ve Listboxa, sırasıyla C, A, B, E sütunları alınacaksa;
(tabi burada Listbox'a sütun numarası SIFIR olan -1 değerlerinin aynen alınacağını varsayıyorum)
...etay.List(liste, a) = isim.Offset(0, b) satırı üzerinden belirtirsem böyle satırın aynısından
4 satır yazıp, her satırda;
-- a kısmını 1'den başlayıp 1'er artmalı,
-- b kısmına ise sırayla 1, -2, 0, 3 değerleri yazılmalı
diye düşünüyorum.

.
 
Bundan önce bir cevap daha yazdım, bu cevap art arda ikinci cevabım oluyor.
Açtığınız önceki konu sayfasındaki (tarih koşulu ekleme) örnek belge üzerinden hareket ediyorum.

Bu belgedeki kod farklılıklarına bakın isterseniz. Tb3ListDetay için hem AddItem yöntemi uygulandı, hem de başlık var.
Hem başlık satırı eklendi, hem de SIRA NO anlamına gelen sütun ilavesiyle, listedeki sütun sıralamasını değiştirdim.
Şayet Tb3ListDetay isimli Listboxtaki seçim üzerinden işlem/işlemler yapacaksınız,
bu işlem kodlarının en başına If Tb3ListDetay.LisIndex=0 Then Exit Sub diye bir satır eklemelisiniz.
 

Ekli dosyalar

@Ömer BARAN Hocam,
Farkimdayim hocam aynı cevabı 2 defa verdiginizin ben demek istediğimi size anlatamadim sizi konuyu uzatıp sizi yormamak için revize edeceğim dedim :) bu örnek dosya için vermiş olduğunuz kodlardan faydalanarak asıl dosyamda istediğim kadar ve şekilde raporlar elde ettim emeğinize sağlık çok teşekkür ederim 😊😊
 
@cengizyene

Yanlış anlamadınız umarım, bir miktar öğrenmeye zorlama iyidir.
Hazır kod edinmek yerine, öneriler doğrultusunda çabalayarak kendinizin konuyu çözmesi daha faydalıdır.
Bu şekilde öğrenilen bilgi ve edinilen tecrübe çok işe yarar ve kalıcı olur.

Sizi de; en kısa sürede, başka forumdaşların sorduğu sorulara cevaplar verirken görmek isteriz.
Bunu yaparken yanlış mı/doğru mu veya konu zaten çözülmüş gibi düşünmeyin.
İlginizi çeken tüm konulara cevap(lar) yazmak için çekinmeyin derim.

İyi çalışmalar dilerim.

.
 
@Ömer BARAN hocam,
Yok hocam yanlış anlamadım. Ozellikle bu formdan ve kısmen diğer sayfalardan kodlarin mantığını öğrenip raporlama ve işlemler yapıyorum. Makro konusunu 1 aydır öğreniyorum ve sizlerin sayesinde biraz ilerledim. Bazen konulara cevap vermek istiyorum fakat siz hocalarımız var diye acaba benden daha iyisini mi onerirler diye cevap yazmiyordum. Bundan sonra sizin izninizle diğer arkadaşlara da yardımcı olurum. Arkadaşlara yardım edebileceğimi söylemeniz beni sevindirdi. Size ve bu formda emeği geçen herkese çok teşekkür ederim 😊😊😊
 
@cengizyene

Kodlar/formüller için "daha iyisi" gibi bir sıfat kullanılması bence doğru değil.
Bunun yerine "tercih edilen", "daha hızlı sonuç veren" gibi sıfatlar kullanmak lazım.

Önemli olan, hedeflenen sonucun alınmasıdır.
Çözüme ulaşmış eski konular dahil her konuya alternatif çözüm önerilerinin iletilmesi bizleri memnun edeceği gibi
herkes için ufuk açıcı ve tecrübe artışına vesile olacaktır.

Katkılarınızı bekleriz.

.
 
Üst