• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

listboxu 2 tarih arası süz , kalanı rapor sayfasına at

  • Konbuyu başlatan Konbuyu başlatan cems
  • Başlangıç tarihi Başlangıç tarihi

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,581
Excel Vers. ve Dili
office 2010 tr 32bit
Asıl dosya ile birebir örneklediğim şekilde ;

listboxa getirilmiş olan verilerin iki tarih arasında süzülmesi ve süzülen hali ile rapor sayfasına baskı alınması için atılması gerekmektedir.

Denenen bütün kodlar silindi ve problem yalın bırakıldı. 9 Sütundan fazla verinin satırda kalması gerektiğinden , AddItem yöntemi kullanışsız , mümkünse çözümü dizi kodu ile yapmak daha doğru olacak
 

Ekli dosyalar

Merhaba.

Öncelikle iki hususu belirteyim;
1) TABLO isimli sayfada D sütunundaki değerler TARİH değil.
Veri yığınınız büyükse uygun boş hücreye 0 yazıp, bu hücreyi kopyalayın ve
D sütunundaki dolu hücreleri seçip ÖZEL YAPIŞTIR -> TOPLA -> DEĞERLER -> TAMAM
şeklinde işlem yaparak değerlerin TARİH'e dönüşmesini sağlayın.

2) Userform kodlarında da;
-- TextBox'ların dolu/boş olma durumu,
-- tarih dışı veri olup olmadığı,
-- ilk TextBox'a yazılan tarih'in diğerine yazılan tarihten küçük veya eşit olmasına yönelik
kontroller eklemenizi hatırlatmama gerek yok sanırım.

Tarih'e dönüştürme işlemini yaptıktan sonra aşağıdaki gibi bir kod işinizi görecektir.
Benim düşüncem;
-- SÜZ-AKTAR düğmesi kullanıldığında aktarma işlemini takiben, verileri ListBox'a rapor sayfasından (yine RowSource yöntemiyle) almanız,
-- TextBox seçildiğinde/içeriği boş olduğunda gibi durumlar da tekrar TABLO adı sayfadan almanız yönünde olacak.
.
Kod:
Set t = Sheets("TABLO"): Set r = Sheets("rapor")
If r.Cells(Rows.Count, "A").End(3).Row > 1 Then _
    r.Range("A2:N" & r.Cells(Rows.Count, "A").End(3).Row).ClearContents
t.Range("A1:N" & Rows.Count).AutoFilter Field:=4, Criteria1:= _
    ">=" & CLng(CDate(TextBox1)), Operator:=xlAnd, Criteria2:="<=" & CLng(CDate(TextBox2))
t.Range("A2:M" & t.Cells(Rows.Count, 1).End(3).Row).SpecialCells(xlCellTypeVisible).Copy r.[A2]
 
Sayın BARAN ,

Önerdiğiniz gibi; N2 dekki boş hücreye 0 yazıp, bu hücreyi kopyaladım ve
D sütunundaki dolu hücreleri seçip ÖZEL YAPIŞTIR -> TOPLA -> DEĞERLER -> TAMAM
şeklinde işlem yaparak değerlerin TARİH'e dönüşmesini sağladım.

İlk defa gördüğüm şekilde ; veri olan satırlar ( sütunda sağ tıklayıp tarıh formatı seçince ) tarih olarak geldi , ancak veri olmayan satırlarda

00.01.1900 şeklinde 1 milyon 48 bin hücre daha yazdı. Bunları koşullu biçimlendirme ile beyaz seçtim , ancak tabloda görünmez olması başka sorun yaratır mı emin olamadım. Baskısı alınacak sayfa rapor sayfası olacağından pek sorun beklemiyorum. Ancak dosya 14 satır veri olsa da ağırlığı 5 MB oldu. Sıkıştırılmış halini bu mesaja ekliyorum.

Textbox kontrollerini yerleştirdim, uyarsız tarih girildiğinde uyarı veriyor.

Sorun şu ki ; rapor sayfası doğru süzülmekle birlikte , sonucun kullanıcıya da gösterilmesi için listbox2 ye tekrar süzülmüş tablo adındaki sayfadaki veriyi çektiğimde istenen tarih aralığından ya fazla ya az satır gösteriyor. Bu arada işlem bir milyon satır gezdiğinden bekleme süresi de uzunlaşıyor.

Bir yerlerde göremediğim bir hatanın işaret edilmesine ihtiyacım var .

Not : verdiğiniz kodlarda 3cü satır ( endxlup.row(3) ) leri , birinci satırda sütun adları ve hemen 2ci satırda veri olması nedeni ile ; 2ci satırı da görmesi için 2 yaptım. Bu bir hata ise belirtirseniz sevinirim.
 

Ekli dosyalar

Bir inceleme gerekli gibi
 
Belki de tek iki tarih arasında süzme ve bunu da diğerleri gibi rapor sayfasına atma kısımları kalmış olan çalışmanın asıl dosyası üzerinde çözmek daha tümleyici olur.
 

Ekli dosyalar

Merhaba, bugün pek fırsat bulamadığım için cevap gecikti.

Son belgenizi incelemedim.

Bir önceki mesajınız ve ekindeki belge ile ilgili olarak birşeyler söylemem gerek.
-- Tarihe dönüştürme işlemini yaparken uyguladığınız 0'ı kopyala yapıştır işlemini tüm sütuna değil, sadece veri olan alanı seçerek yapmalıydınız.
Sanırım dikkatten kaçmış, önceki cevabımda bunu net şekilde yazmıştım.
-- Verdiğim kod'da kullanılan aşağıdaki kısım, kod'da belirtilen sütunun SON hücresinden YUKARI DOĞRU ilk dolu satırı bulmaya yarıyor (yani veri alanının satır sayısı bulunmuş oluyor).
Kırmızı renklendirdiğim (3) sayısı CTRL + YUKARI OK tuşuna basıldığında seçilen hücreyi buluyor ve xlUp anlamına geliyor.
Sheets("TABLO").Cells(Rows.Count, "A").End(3).Row
Bu (3) sayısı yerine (2) yazarsanız bu da belirtilen hücreden (A sütununun son hücresi olan A1048576 hücresi) sağa doğru SON HÜCREYE gitmek buluyor.
Yani CTRL+SAĞ OK tuşuna basılması, başka bir deyişle xlToRight anlamına geliyor.

Sonuç olarak 3 yerine xlup, 2 yerine xlToRight de yazılabilir.

Örnek belgenize göre (2) yazmanız doğru işlem olmuyor demektir.

Aslında sayfa üzerinde CTRL ile birlikte, HOME / END / SAĞ OK / SOL OK / AŞAĞI OK / YUKARI OK tuşlarına basarak işlem daha iyi anlaşılır.
Bunu yaparken bulunduğunuz hücreyi değiştirerek denemeler yapın ve hatta bunları yaparken MAKRO KAYDETmek ve sonra oluşan kodları incelemek yerinde olur.

Bu işlem ilgili, Sayın İdris SERDAR veya Sayın Korhan AYHAN'ın örnek belgesi olduğunu hatırlıyorum sanki.

Filtre işlemini listbox'ta göstermek için ben şöyle düşünmüştüm;
-- Her filtre işlemi öncesinde rapor sayfasında başlık hariç verileri silmek,
-- Filtre ve rapor sayfasına aktarma sonrasında da ListBox'un veri kaynağı olarak rapor sayfasını göstermek,
-- Temizle düğmesiyle de ListBox'un veri kaynağını tekrar TABLO sayfası olarak göstermek,

Umarım ifade edebilmişimdir.

Ayrıca belki de yanyana iki Listbox oluşturup,
sütun sayısı sorununu aşmak ve For...Next döngüsüyle ve AddItem yöntemiyle verileri ListBox'lara aktarmak pratik olabilir.
.
 
Uzun ve farklı sanı ile yaptığım hataları çok güzel izah eden yazınız için teşekkür ederim .

Bazen kodların yoldan çıkmasının ve durup dururken 1048binlerin textboxta belirme sebebini sizin yazınızla çok daha iyi anladım.

Diğer önerilerinizle ilgili konuyu daha sağlam bir zihin umudu ile gündüz izlemek daha doğru olacak.Sanırım bir kaç yer daha bu ışık altında kontrolden geçmek durumunda.

Yol göstericiliğiniz içi tekrar teşekkür ederim.
 
Estağfurullah, her zaman buralardayız.

Naçizane önerim; bir'den fazla işlemi tek konu veya tek belgede sormak yerine en temelden başlayarak adım adım ilerlemeniz yönünde olacak.

Çok kapsamlı belge yüklenince destek verecek üyenin gözünü korkutma olasılığı yüksek.

Forumda konulara cevap yazanlar genellikle bir konuyla ilgilenmeye başladığında sonuna kadar desteğe devam ediyor.

Konuyla ilgilenen üye, benim gibi çok soruya cevap yazan biri olduğunda ise diğer üyeler konuya müdahil olmak istemiyor.


Son belgenize göz attığımda ilk fikrim şudur:
-- Userformunuzdaki sayfaların tasarımını birbirine benzer hale getirmekte yarar var sanırım.
-- Doldurulacak alanlar benzer konumda, işlem düğmeleri benzer konumda olsun ki;
belgeyi sizin dışınızda biri kullandığında da eli/gözü aynı yere gitsin,
-- Ayrıca SOLDAN SAĞA ve YUKARIDAN AŞAĞI gibi bir kullanım yöntemi yararlı olur.
-- Gerçek belgenizde her aşamada KAYDET kod'u ekleseniz de, örnek belgenizde bu kod satırlarının başına TEK TIRNAK ekleyerek etkisiz hale getirmek de yerinde olur.
Neticede cevap oluştururken yapılan denemelerden geri dönüş imkanını kısıtlamış oluyorsunuz.
-- Belgenizde yok ama, tam sayfa kodu içeren, excel'i gizleyen, araç çubuklarına yönelik sınırlamalar ekleyen ...gibi kod içeren belgelerle pek kimse uğraşmak istemez.

İyi çalışmalar dilerim.
.
 
Geri
Üst