Çözüldü ComboBox ile ListView Nesnesini Filtreleme

ssavas

Site Üyesi

Excel Versiyonu
Excel 2016
Excel Sürümü
64 Bit
Excel Dili
Türkçe
Merhaba arkadaşlar.
Combobox ile listview1'de bulunan verilerden filtre etmek istiyorum. Düz mantık ile istediğim şu: ComboBox listesinde bulunan "Ayrılışı Gelmeyenler" seçilince listview1'de Ayrılış Barkodu sütununda veri bulunmayan satırlar listelenecek, "Başlayışı Gelmeyenler" seçilince listview1'de Başlayış Barkodu sütununda veri bulunmayan satırlar listelenecek. Çok bakındım ancak amacıma uygun bir çalışma bulamadım.
Örnek çalışmam ektedir, yardımcı olacak arkadaşlara teşekkür ederim. Açılışta şifre ve parola:11 Vt Yol Göster tıklanıp veritabanı yolu gösterilmelidir.
Ekran görüntüsü 2023-03-16 160434.webp
 

Ekli dosyalar

  • izin_kontrol.rar
    291.3 KB · Görüntüleme: 10
Çözüm
Bana göre GENÇmişsiniz.

Ben olsam TEK USERFORM üzerinden şöyle düşünürdüm;
-- Başlangıçta veri tabanındaki tüm bilgileri bir DİZİye alırdım,
-- Askerlik/doğum gibi seçenekler için birer optionbutton eklerdim,
-- yukarıdaki her bir seçenek için (If...Elseif...Then yapısında)
alan=Array(1, 2, 5,8,27,36) şeklinde ilgili seçenek için veri alınacak sütun numaralarını gösteren bir DİZİ tanımlama yapardım,
-- Yukarıdaki seçime bağlı olarak bulunacak ALAN dizisine göre veri tabanı DİZİsi döngüye sokulup
koşullara uyan ilgili sütun verileri de listview nesnesine aktarırdım.
Kabaca işleyişin böyle olması bana daha doğru geliyor.
@ssavas

FrmAskerlik isimli UserForma ait kod bölümüne;
-- aşağıdaki birinci kodu ekleyip,
-- aynı yerdeki listeye_al makro kodundaki Do While ......... Loop arasını ise aşağıdaki gibi değiştirip
deneyin.

VBA:
Görüntülemek için giriş yapmalısınız.
(3 satır)

VBA:
Görüntülemek için giriş yapmalısınız.
(18 satır)
 
@ssavas

FrmAskerlik isimli UserForma ait kod bölümüne;
-- aşağıdaki birinci kodu ekleyip,
-- aynı yerdeki listeye_al makro kodundaki Do While ......... Loop arasını ise aşağıdaki gibi değiştirip
deneyin.

VBA:
Görüntülemek için giriş yapmalısınız.
(3 satır)

VBA:
Görüntülemek için giriş yapmalısınız.
(18 satır)
Teşekkür ederim Ömer hocam, sorunsuz işlev gördü.
 
Merhaba arkadaşlar.
Çalışmamda bir çok modülde combobox ile listview nesnesinde filtre yapmak istiyorum. Bunun için daha önce açmış olduğum (Çözüldü - Combobox Ile Listview Nesnesini Filtreleme) konusunda sn ömer baran'ın çözüm yöntemi talebi karşılamıştı. Şimdi aynı yöntemi çalışmadaki diğer modüllerde de uyguluyorum ancak istenen sonuca bir türlü ulaşamadım. Nerede hata yapıyorum, sorunu bulamadım.
Ekli örnekte Doğum izni modülünde (diğer modüllerde de aynı kural geçerli) 4 başlıkta filtre yaptırmak istiyorum.
CPP:
Görüntülemek için giriş yapmalısınız.
(8 satır)
Örnek 4.başlıktaki Bakanlığa Bildirilmeyen şartını sağlayan 9 adet kayıt olmasına rağmen sıfır kayıt filtre ediyor.
Bakanlığa Bildirilmeyenler (ayr_bild_tarihi): Personel 01,03,07,10,11,15,23,24,26 (9 kayıt)
Yardımcı olacak arkadaşlara teşekkür ederim.
Combobox Ile Listview Nesnesini Filtreleme Sorunum-1.webp
 

Ekli dosyalar

  • izin_kontrol.rar
    438.1 KB · Görüntüleme: 2
Fikrim o ki; tüm kodlarınızı tarayıp, mevcut ON ERROR RESUME NEXT şeklindeki kod satırlarından kurtulmanız gerekiyor.
Bu kod satırının, hatanın nedeninin ne olduğunun/olacağının bilindiği, BEKLENEN durumlar için kullanılmalıdır.

Hatta mümkün olduğunca, beklenen durumlar için de on erro resume next diye bir kod satırı yerine,
hatanın nedenine yönelik hata ayıklama, koşul kontrolü gibi kod düzenlemeleri yapılmalıdır.
 
Fikrim o ki; tüm kodlarınızı tarayıp, mevcut ON ERROR RESUME NEXT şeklindeki kod satırlarından kurtulmanız gerekiyor.
Bu kod satırının, hatanın nedeninin ne olduğunun/olacağının bilindiği, BEKLENEN durumlar için kullanılmalıdır.

Hatta mümkün olduğunca, beklenen durumlar için de on erro resume next diye bir kod satırı yerine,
hatanın nedenine yönelik hata ayıklama, koşul kontrolü gibi kod düzenlemeleri yapılmalıdır.
Teşekkür ederim üstat.
Tavsiyeniz üzerine modülde bulunan tüm on error resume next kod satırlarını pasife aldım. F8 ile kontrol ettiğimde;
UserForm_Initialize ile başlayan kod akışı, listeye_al makrosunda veritabanı bağlantısı sonrası (Call BAGLANTI) Do While Not rs.EOF ile Loop arasında 4 kez tekrarlıyor sonra evn.SubItems(18) veya evn.SubItems(19). satırda type mismatch hatası veriyor.
SQL_SORGU.webp
 
Örnek çalışmada askerlik ve doğum izni modülleri mevcut. Modüllerdeki tüm on error resume next kodlarını pasife aldım. Tüm hata mesajı veren yerleri gözden geçirdim.
listeye_al makrosunda değişken tanımlamalarını yapmış olmama rağmen Listview1 nesnesi 17 adet alanla sınırlı olarak çalışıyor. İlave olarak eklenen 18. ve sonrasındaki tüm alanlarda type mismatch error (veri türü uyuşmazlığı) hatası veriyor.
Çözülebilir bir sorunmudur bilemedim.
Kullanıcı adı - şifre:11
 

Ekli dosyalar

  • Desktop.rar
    341.9 KB · Görüntüleme: 4
Son belgenize bakmadım.
ADO kodlamalarıyla ilgili de yeterli tecrübem yok maalesef.

ADO konusunda bilgisi yeterli olan arkadaşlarımız ilgilenip, çözüm önerisi yapacaktır.
 
Dosyanız çok karışık, bu tür komple dosyaları anlamak zor oluyor.
Lakin, tarif ettiğiniz hataya göre, almaya çalıştığınız alan sayısı kadar sorgu yapmıyor olabilirsiniz.
O kısmı incelemenizde fayda var.
 
Kod:
Görüntülemek için giriş yapmalısınız.
(2 satır)
Bu iki kodu pasif hale getirmişsiniz.
Daha sonra çift tıkladığınızda verileriniz olmadığı için iki subitems öğesi index out of bounds hatası veriyor.
Çünkü o kadar sütun yok listview'de.

Eğer ADO ile gelen veriler null ise, o zaman iif ile "" şeklinde bir kriter ekleyin ki, hata olmasa bile "" döndürsün.

Ayrıca, yineliyorum.
Tüm dosyayı ekliyorsunuz, bir sürü form var.
Hangi formda ne var vs anlamak, neyin nereden geldiğini bulmak etmek...
Bunlar alacağınız olası yardımların "gelmemesi" için çok geçerli nedenlerdir, bilginize.

Bunun yerine, ana dosyanızın örneğinizin sorunlu alanını yüklerseniz, daha anlaşılır olacaktır.

İyi çalışmalar.
 
Kod:
Görüntülemek için giriş yapmalısınız.
(2 satır)
Bu iki kodu pasif hale getirmişsiniz.
Daha sonra çift tıkladığınızda verileriniz olmadığı için iki subitems öğesi index out of bounds hatası veriyor.
Çünkü o kadar sütun yok listview'de.

Eğer ADO ile gelen veriler null ise, o zaman iif ile "" şeklinde bir kriter ekleyin ki, hata olmasa bile "" döndürsün.

Ayrıca, yineliyorum.
Tüm dosyayı ekliyorsunuz, bir sürü form var.
Hangi formda ne var vs anlamak, neyin nereden geldiğini bulmak etmek...
Bunlar alacağınız olası yardımların "gelmemesi" için çok geçerli nedenlerdir, bilginize.

Bunun yerine, ana dosyanızın örneğinizin sorunlu alanını yüklerseniz, daha anlaşılır olacaktır.

İyi çalışmalar.
Teşekkür ederim üstat.
Sadeleştirilmiş hali ile sadece bir modül bulunan bir örnek ekledim.
Yukarıda da izah ettiğim gibi listview1 nesnesinde 17. satırdan itibaren tür uyumsuzluğu hatası veriyor. 17. satıra kadar alanlar ve sorgu satırındaki alan başlıkları pasif yapılınca sorun ortadan kalkıyor. Listview veya vba'da bir sınırlama mı var, yoksa access veritabanında yapılması gereken bir düzenlemeyi mi eksik bırakıyorum bilemedim.
 

Ekli dosyalar

  • Desktop.rar
    111.9 KB · Görüntüleme: 0
Gün içinde dosyanıza bakma imkanım yok ne yazık ki.
Lakin, yapmanız gereken SELECT kısmındaki boş gelen Rs.Field alanları için bir kontrol koymak.
Field Null olarak geldiği için, ListView nesnesinin SubItems'inde herhangi bir değer olmuyor ve hata döndürüyor.
Denemedim amaIİf(isnull(rs.field(5))=true,"",rs.field(5)) şeklinde bir şeyler yazmanız faydalı olacaktır.
Kodu da ezbere yazdım, 5 kısmını kendinize uyarlarsınız.
 
Gün içinde dosyanıza bakma imkanım yok ne yazık ki.
Lakin, yapmanız gereken SELECT kısmındaki boş gelen Rs.Field alanları için bir kontrol koymak.
Field Null olarak geldiği için, ListView nesnesinin SubItems'inde herhangi bir değer olmuyor ve hata döndürüyor.
Denemedim amaIİf(isnull(rs.field(5))=true,"",rs.field(5)) şeklinde bir şeyler yazmanız faydalı olacaktır.
Kodu da ezbere yazdım, 5 kısmını kendinize uyarlarsınız.
Aşağıdaki hatayı döndürdü.
Ekran görüntüsü 2023-04-25 093846.webp
 
Direk anlayamadım ne yazık ki..
Akşam fırsatım olursa dosyanıza bakmam gerekecek.
Sadece size bu aşamada şunu tavsiye edebilirim.
Kodların başına bir break point koyun.
Daha sonra ComboBox filtrelendiğinde kodlar o satırsa sarı renkte olacaktır.
F8 ile adımlayın ve her satırdaki oluşan değerleri incelemeye çalışın.

Örneğin, SELECT ile aldığınız bağlantıda veri var mı? kontrol edin.
ComboBox için eklediğiniz if şartlarını kontrol edin...

Bu şekilde sorunun nerede olduğunu kendiniz de bulabilirsiniz.

Daha önce Ömer ağabeyin de ikaz ettiği gibi, çok küçük bir kaç gereklilik dışında asla "On Error Resume Next" kullanmayın.
 
Birbirinin aynı olan 1'den fazla userform kullandığınızı anlıyorum.
Madem kodlamalarınız baştan ele alınacak;
bunun yerine 1 adet userform üzerinde konumlandırılacak birkaç OptionButton (askerlik,doğum gibi) ile kapsam belirlemesi yapılıp,
bu seçime göre (basit If...Elseif...End If yapısı) veri tabanından bilgi alınacak sütunlar belirlenebilir.

Kodlamalara, önce veri tabanındaki tüm bilgileri alarak başlayın,
ardından koşullar/sınırlandırmalar vs işlemlerine adım adım geçin derim.
 
Birbirinin aynı olan 1'den fazla userform kullandığınızı anlıyorum.
Madem kodlamalarınız baştan ele alınacak;
bunun yerine 1 adet userform üzerinde konumlandırılacak birkaç OptionButton (askerlik,doğum gibi) ile kapsam belirlemesi yapılıp,
bu seçime göre (basit If...Elseif...End If yapısı) veri tabanından bilgi alınacak sütunlar belirlenebilir.

Kodlamalara, önce veri tabanındaki tüm bilgileri alarak başlayın,
ardından koşullar/sınırlandırmalar vs işlemlerine adım adım geçin derim.
Teşekkür ederim üstat.
Öncesinde çok çeşitli kombinasyonlar yaptım. Evet bazı modüller bir birinin aynısı. Aralarında farklılık gösterenler de var. Misal askerlikte sevk tarihi- terhis tarihi varken doğum izninde analık izni, bir başkasında sadece ayrılış-başlayış tarihi gibi farklı başlıklar var. Dolayısıyla hepsini kapsayacak bir userform, çok kalabalık ve daha komplex bir yapıya dönüşüyordu. Bu nedenle her bir modül için ayrı ayrı basit bir form ile takip etmek mantıklı geldi.
Bu arada yaş 50'yi geçti. Yavaş yavaş alzeimer belirtileri var. Sırf kafayı bir şeylerle meşgul edip alzeimerin ilerlemesini yavaşlatmak, aynı zaman da da kurumda manuel takip edilen iş ve işlemlere bir otokontrol sağlamak istedim.
 
Konuyu başlatan
Site Üyesi
Katılım
Konu Bilgi
Durum
Çözüldü 
Forum
Excel Makro Soruları
Başlangıç tarihi
Son yanıt tarihi
Cevaplar
20
Geri
Üst