• DİKKAT

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

süzme ile rapor almak

Katılım
21 Eylül 2005
Mesajlar
184
Excel Vers. ve Dili
ofis 365 İngilizce
Merhaba sevgili arkadaşlar
uzun süre vb den uzak kaldığım için bazı konuları hatırlamakta zorluk çekiyorum.
sorunum ile ilgili ekte bir dosyam var.Bu dosyada bir kaç kritere göre rapor aldırmak için kod yazmaya çalıştım ama başarılı olamadım.ilgilenirseniz müteşekkir olacağım.saygılarımla
 
Merhabalar

Sorunuzdan pek birşey anlamadım açıkçası ... Verdiğiniz örneğe göre, 21.Satırda olan, Lot No:1, Teklifler :105 ve Bayrak No :4 olan veri en büyük teklif midir?

Lot numaraları birden fazla mıdır? Eğer öyleyse, verilerinizi tam olarak temsil edecek geniş bir örnek koyun ve olmasını istediğiniz sonuçları el ile hesaplayıp, belirttiğiniz alana yazın.

Daha sonra VBA veya fonksiyonlarla çözüm yoluna gidelim.
 
teşekkür ederim ilginize..dosyayı daha açıklamalı gönderiyorum..
 
Aşağıdakileri, standart bir modül sayfasına kopyalayıp çalışırınız veya örnek dosyayı inceleyiniz.

Kod:
Sub BuyukleriSec()
Dim sh As Worksheet
Dim Teklifler() As Variant
Dim Secilen() As Variant
Dim EnBuyukIndis&, Enbuyuk&, son&, i&, j&, m&, x&
Dim hcr As Range
Set sh = Sheets("Sayfa1")
son = sh.Cells(65536, 1).End(xlUp).Row
ReDim Teklifler(1 To son - 1, 1 To 3)
For i = 2 To sh.Cells(65536, 1).End(xlUp).Row
    For j = 1 To 3
        Teklifler(i - 1, j) = sh.Cells(i, j)
    Next j
Next i
sh.Range("G16:I18").ClearContents
ReDim Secilen(1 To 3, 1 To 3)
For m = 1 To 3
    Enbuyuk = sh.Cells(2, 2)
    For i = 1 To UBound(Teklifler)
        If Teklifler(i, 2) > Enbuyuk Then
           Enbuyuk = Teklifler(i, 2)
           EnBuyukIndis = i
        End If
    Next i
    For j = 16 To 18
        If sh.Cells(j, "I") = Teklifler(EnBuyukIndis, 3) Then
           x = x + 1
        End If
    Next j
    If x = 0 Then
       For Each hcr In Range("G16:G18").Cells
           If IsEmpty(hcr) = True Then
              sh.Cells(hcr.Row, "G") = Teklifler(EnBuyukIndis, 1)
              sh.Cells(hcr.Row, "H") = Teklifler(EnBuyukIndis, 2)
              sh.Cells(hcr.Row, "I") = Teklifler(EnBuyukIndis, 3)
              Teklifler(EnBuyukIndis, 2) = 0
              Exit For
           End If
       Next
    Else
       Teklifler(EnBuyukIndis, 2) = 0
       m = m - 1
    End If
    x = 0
Next m
Set sh = Nothing
End Sub
 
Sayın FPC olağanüstü yardımınız için çok teşekkür ederim.sorunun çözülmesinden öte, bana çok önemli bir ders verdiniz..
saygılarımla
 
Sayın hocam kodların açıklmasını istesem çok şey istemiş olurmuyum ....
Redim nedemektir... sonucu başka bir sayfaya almak istersek ne yapmalıyız vs...
lot/tutar/bayrak sütunlarının yanı sıra başka sütun olursa ne olmalı
vs
 
Sevgili FPC küçük bir şey daha soracaktım, lotlar A kolonondan başlıyor örnekte, ama B kolonundan başlarsa yani A,B,C kolonları yerine, B,C,D kolonlarında olursa tablo kod nasıl olmalı.Defalarca uygulama yaptım ama hep Out of range verdi, ekte görebilirsiniz.
saygılarımla..
 
Sevgili FPC küçük bir şey daha soracaktım, lotlar A kolonondan başlıyor örnekte, ama B kolonundan başlarsa yani A,B,C kolonları yerine, B,C,D kolonlarında olursa tablo kod nasıl olmalı.Defalarca uygulama yaptım ama hep Out of range verdi, ekte görebilirsiniz.
saygılarımla..

Bahsettiğiniz durum için aşağıdaki yeni kodları kullanabilirsiniz.

Aldığınız hata mesajının nedenine gelince ... Eski kodlarda Veritabanının boyutunu hesaplarken A sütunu kullanılıyordu. Yani A sütununun en son dolu hücresi bulunuyordu. Oysa ki siz A'daki tüm bilgileri silerek B'ye yerleştirirseniz, Teklifler() adlı dizi değişkeni boyutlandırılamaz ve doldurulamaz.. Sonuç olarak böyle bir hataya sebep olur.

Aşağıdaki kodları incelerseniz farkı görebilirsiniz. Değişiklikler kırmızı ile gösterilmiştir.

Kod:
Option Explicit
Sub BuyukleriSec()
Dim sh As Worksheet
Dim Teklifler() As Variant
Dim Secilen() As Variant
Dim EnBuyukIndis&, Enbuyuk&, son&, i&, j&, m&, x&
Dim hcr As Range
Set sh = Sheets("Sayfa1")
[COLOR=red]son = sh.Cells(65536, 2).End(xlUp).Row[/COLOR]
ReDim Teklifler(1 To son - 1, 1 To 3)
[COLOR=red]For i = 2 To sh.Cells(65536, 2).End(xlUp).Row[/COLOR]
    For j = 1 To 3
[COLOR=red]        Teklifler(i - 1, j) = sh.Cells(i, j + 1)[/COLOR]
    Next j
Next i
sh.Range("G16:I18").ClearContents
ReDim Secilen(1 To 3, 1 To 3)
For m = 1 To 3
    Enbuyuk = sh.Cells(2, 2)
    For i = 1 To UBound(Teklifler)
        If Teklifler(i, 2) > Enbuyuk Then
           Enbuyuk = Teklifler(i, 2)
           EnBuyukIndis = i
        End If
    Next i
    For j = 16 To 18
        If sh.Cells(j, "I") = Teklifler(EnBuyukIndis, 3) Then
           x = x + 1
        End If
    Next j
    If x = 0 Then
       For Each hcr In Range("G16:G18").Cells
           If IsEmpty(hcr) = True Then
              sh.Cells(hcr.Row, "G") = Teklifler(EnBuyukIndis, 1)
              sh.Cells(hcr.Row, "H") = Teklifler(EnBuyukIndis, 2)
              sh.Cells(hcr.Row, "I") = Teklifler(EnBuyukIndis, 3)
              Teklifler(EnBuyukIndis, 2) = 0
              Exit For
           End If
       Next
    Else
       Teklifler(EnBuyukIndis, 2) = 0
       m = m - 1
    End If
    x = 0
Next m
Set sh = Nothing
End Sub
 
Sayın hocam kodların açıklmasını istesem çok şey istemiş olurmuyum ....
Redim nedemektir... sonucu başka bir sayfaya almak istersek ne yapmalıyız vs...
lot/tutar/bayrak sütunlarının yanı sıra başka sütun olursa ne olmalı
vs

Merhabalar,

Ana mantık birinci listenin değerlendirilmesi ve İkinci Liste ile karşılaştırılıp, koşul sağlanmışsa ikinci listeye değer atanması ...

Hayali bir Excel Tablosu oluşturmak için, Dim Teklifler() adında bir değişken tanımladık. Teklifler yazan yerin yanındaki parantezler bunun bir dizi değişkeni olduğunu gösteriyor. Dizi değişkenleri, birden fazla sonucu veya veriyi; içlerinde depolama kapasitesine sahiptir.

Redim ifadesi ise, diziyi boyutlandırmak için tekrar tanımlamak demektir.

Şöyle bir örnek vermek gerekirse, bir manava gidip Elma istediğinizi söylediğinizde bunun VBA'daki karşılığı Dim Teklifler() demektir. Manav size, "Ne kadar vereyim abi ?" diye sorduğunda "3 kilo olsun, çoluk çocuk yeriz" diye cevap verdiğinizde, VBA'da diziyi boyutlandırmış olursunuz. Bunun karşılığı da; Redim Teklifler(1 to ....) şeklinde verilen satırdır.

Tabi Manav'da verdiğim örnek, tek boyutlu bir dizi için geçerlidir.

Eğer birkaç çeşit meyve almak isterseniz, dizi çok boyutlu hale gelir ve örnekteki gibi bir Redim ifadesi gerektirir.

Bu kodlarda; En Büyük değeri seçip, yerine yazdıktan sonra, ana listeden bunu yokedip, listede tekrar en büyüğü aramak zorundaydım. Takdir edersiniz ki, Bravo64 özenle hazırladığı listeden birşey silmeme izin vermeyecekti :) Onun için, Sheet üzerinde olan tabloyu alıp, hayali bir kopya tablo yaratmalıydım. Bu tablo, sheet'ten bağımsız olacağı için istediğim gibi silip, verilerini değiştirebilecektim. İlk For-Next döngüsü bu hayali tabloya veri depolamak için kullanılmaktadır.

Daha sonra en az 3 defa döngüye girerek, seçtiğim verileri, G16:H18 aralığına tek tek yazdırmalıydım. For m ile başlayan döngü de, bu döngü ...

Geri kalanında ise, hayali tabloyu tek tek tarayıp, en büyük değeri ve bunun hangi sırada olduğunu bulma işlemleri yapılıyor. Tabloda en büyük buluduğunda, bunun G16:H18 aralığında olan bir veri ile aynı olup olmadığına bakılıyor falan filan ...

Açıklamak; düşünmekten daha zormuş yahu ... :)

Özel olarak ilgilendiğiniz bir satır veya blok varsa onu cevaplayayım. Çünkü, açıklama için baya yazmak gerekiyor.

Kolay gelsin.
 
Ne söyleyebilirim ki, mükemmelsiniz.
Bundan daha iyisi olamaz herhalde..
Çok teşekkür ederim..Faydalanan ve faydalanacak tüm katılımcılar adına..
 
açıklamalarınız ve ilginiz için teşekkür ederim kısmen anladım....
 
merhaba arkadaşlar
daha önce yaptığımız (sayın FPC nin desteğiyle)kodlarda sorun yoktu ama,sütunlara girilen veri sayısı 3 ten az olduğunda hata oluşuyor.ekte daha iyi anlaşılacaktır sanırım..
ilginize teşekkür ederim.
 
Son düzenleme:
Günaydın arkadaşlar,bu başlık altındaki problemle ilgili yorumu olan var mı?
Teşekkürler
 
Sevgili arkadaşlar problemle ilgili görüş varmı acaba?
 
yeniden merhaba
dosyamla ilgili yardım edebilecek yokmu acaba?
 
süzme ile rapor alma

İyi akşamlar arkadaşlar
test adlı dosyada görüleceği üzere, 2 adet modül eğer veri sayısı 3 ten küçük ve sıralı olursa çalışmıyor.defalarca denedim ama olmadı.
Çözümde yol gösterecek hocalarımıza teşekkür ederim..
 
Tekrar merhaba,

Sizinle daha önce yazdığımız kodlar, belirli sayfa referanslarına dayanmaktaydı. Yani standart bir sayfa, standart bir liste aralığı ve standart bir rapor aralığı ....

Siz bu belirlediğimiz sayfa ayarlarını değiştirirseniz, kodların çuvallaması normaldir. Diziler okunamadığı için yaratılamaz, çalışma kipi hataları oluşur ...

En son gönderdiğiniz dosyaya; daha önce verdiğimiz kodların birebir oturması zaten mümkün değil.

Dosyanızın en son şekli bu mu? Eğer buysa, listenize daha fazla örnek yerleştiriniz?

NOT : Toplamda 2'den daha az sayıda teklif verilmişse; "en büyük 3 teklif" diye bir sorununuzun doğal olarak olmaması gerekir ama bir satır kod ilavesi ile bu da halledilebilir
 
Sayın Üstadım çok teşekkür ederim ilginize.ve ekte sorduğunuz biçimde dosya mevcuttur.
saygılarımla,
 
Geri
Üst