Komplike süzme nasıl yapılır

Katılım
28 Aralık 2005
Mesajlar
92
Merhaba, iyi geceler arkadaşlar...
65bin kayıttan oluşan bir tablom var. 3 başlığım var.
Müşteri No
Şube Kodu
Bakiye

Bir müşteri bazen 1 kere bazen 5-6 kere tabloda alt alta olabiliyor. Aynı müşteri hem a şubeden hem b şubeden alışveriş yapmış olabiliyor. Bazı şubede borcu bitmişken bazı şubede hala borcu olabiliyor. Bu kısa açıklamadan sonra sorum şu.

Birden fazla şubede borcu olan müşterilerin süzülmesi yada ayrı bir sayfaya kayıt edilmesini nasıl yaparım. Sonuç çıktısı olarak bana şöyle birşey lazım.
A müşteri 2 tane şubede toplam 1000 TL borcu vardır.
B müşteri 4 tane şubede toplam 300 TL borcu vardır.
Tabi bu tablo şeklinde olacak...
Örnek dosyada sağ tarafta bulunan sonuç tablosudur. Olmasını istediğim tablodur.
Bunu nasıl yapabilirim...
Bir fikri olan varmı?
 

Ekli dosyalar

Son düzenleme:
Katılım
28 Aralık 2005
Mesajlar
92
Merhaba Ergun Bey,
Ellerinize sağlık. Yalnız bir pürüz var. Mesela Farklı şube sayısında toplanacak şube şöyle olmalı. Borç bakiyesi bulunan farklı şubeler sayılmalı.
Örneğimizde 345 nolu müşteri sadece 22 şubede borcu kaldığı için sonuç 1 olmalı.
400 nolu müşteridede 1 olmalı.
600 nolu müşteride 2 olmalı.
655 nolu müşteridede 2 olmalı.
.
Yani bakiyesi sıfır olan farklı şubeler sayılmamalı.
Bu mümkünmü?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,729
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Selamlar,

Benzersiz "Müşteri No" için E2 hücresine aşağıdaki formülü uygulayın. Hücreye formül girişini CTRL+SHIFT+ENTER tuşlarına basarak tamamlayın.

Kod:
=EĞER(SATIRSAY($A$2:A2)<=TOPLA(EĞER(SIKLIK(EĞER($A$2:$A$1000<>"";KAÇINCI("~"&$A$2:$A$1000;$A$2:$A$1000&"";0));SATIR($A$2:$A$1000)-SATIR(A2)+1);1));İNDİS($A$2:$A$1000;KÜÇÜK(EĞER(SIKLIK(EĞER($A$2:$A$1000<>"";KAÇINCI("~"&$A$2:$A$1000;$A$2:$A$1000&"";0));SATIR($A$2:$A$1000)-SATIR($A$2)+1);SATIR($A$2:$A$1000)-SATIR($A$2)+1);SATIRSAY($A$2:A2)));"")

Borcu olan "Farklı Şube" sayısı için F2 hücresine aşağıdaki formülü uygulayın. Hücreye formül girişini CTRL+SHIFT+ENTER tuşlarına basarak tamamlayın.

Kod:
=EĞER(E2="";"";TOPLA(EĞER(SIKLIK(EĞER($A$2:$A$1000<>"";EĞER(($A$2:$A$1000=$E2)*($C$2:$C$1000<>0);KAÇINCI("~"&$B$2:$B$1000;$B$2:$B$1000&"";0)));SATIR($A$2:$A$1000)-SATIR($A$2)+1);1)))

"Toplam Bakiye" tutarı için G2 hücresine aşağıdaki formülü uygulayın.

Kod:
=EĞER(E2="";"";ETOPLA(A:A;E2;C:C))
Bu formülleri alt hücrelerede sürükleyerek uygulayın.
 

Ekli dosyalar

Katılım
28 Aralık 2005
Mesajlar
92
ebet tam anlamıyla formül işe yaradı. ellerinize sağlık.
Ama maalsef AMA'sı var.
Tablomda 65533 satır veri var. Ben formüllerinizdeki satır sayısını buna göre düzelttim. Ama işlemcinin gücü yeterli gelmedi. Bende dosyamı farklı kaydedip, bakiyesi sıfır olanları zor bela süzüp sildim. Geriye 8100 kayıt kaldı. Bir hücreye formülünüzü girdiğimde 8binyüz satırlık alanı yaklaşık 15-20 saniyede hesaplayabiliyor. Bende laptoptan evdeki bilgisayarıma aktardım. 4 çekirdekli Q9300'de bile 30 satırlık alan yani 60 adet hücre demek yaklaşık 4-5 dakikada hesaplıyor. yaklaşık 3000 satır hesaplattırmam gerekirse 40 ile 50 saat alacak gibi. :(
 
Katılım
28 Aralık 2005
Mesajlar
92
Şöyle bir fikir geldi aklıma, biliyorumki bir müşteri 10'dan fazla farklı şubede borcu yoktur. Dolayısıyla A hücresini A2'den A8100'e kadar taramaya gerek yok. Listem müşteri numarasına göre dizildiğine göre 10'dan fazla yerde yer almıyordur. mesela A56'cı hücrede A56'dan A66'ya kadar kontrol etse tamamdır. Bu fikirden yola çıkarak formül çok hızlanabilir, ama formülü bu fikre göre değiştiremedim. Formül benim için çok komplike. :)
 

1Al2Ver

Altın Üye
Katılım
5 Kasım 2007
Mesajlar
4,717
Excel Vers. ve Dili
64 Bit TR - Microsoft Office 365 - Win11 Home
Altın Üyelik Bitiş Tarihi
04-01-2026
Merhaba,

E2 ve F2'deki formüllerdeki 1000 olan yerleri 66 olarak,

G2'yi ; =EĞER(E2="";"";ETOPLA(A2:A66;E2;C2:C66)) olarak değiştirip dener misiniz ?
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,248
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
Alternatif dosyayı dneyiniz.VBA kod ile yapıldı.:cool:
Kod:
Sub sube_59()
Dim a, z As Object, myarr1(), myarr2(), n As Long
Dim sat As Long, i As Long, deg As String, ilk As Date
Sheets("Sayfa1").Select
Range("E2:G65536").Clear
sat = Cells(65536, "A").End(xlUp).Row
If sat < 2 Then Exit Sub
ilk = Now
Set z = CreateObject("Scripting.Dictionary")
a = Range("A2:C" & sat).Value
ReDim myarr1(1 To 3, 1 To UBound(a, 1))
For i = 1 To UBound(a, 1)
    deg = a(i, 1) & "-" & a(i, 2)
    If Not z.exists(deg) Then
        n = n + 1
        z.Add deg, n
        myarr1(1, n) = a(i, 1)
        myarr1(2, n) = a(i, 2)
    End If
    myarr1(3, z.Item(deg)) = myarr1(3, z.Item(deg)) + a(i, 3)
Next i
ReDim Preserve myarr1(1 To 3, 1 To n)
Erase a
Set z = Nothing
Set z = CreateObject("scripting.Dictionary")
n = 0
ReDim myarr2(1 To 3, 1 To UBound(myarr1, 2))
For i = 1 To UBound(myarr1, 2)
    If Not z.exists(myarr1(1, i)) Then
        n = n + 1
        z.Add myarr1(1, i), n
        myarr2(1, n) = myarr1(1, i)
    End If
    myarr2(2, z.Item(myarr1(1, i))) = myarr2(2, z.Item(myarr1(1, i))) + 1
    myarr2(3, z.Item(myarr1(1, i))) = myarr2(3, z.Item(myarr1(1, i))) + _
    myarr1(3, i)
Next i
Erase myarr1
Set z = Nothing
ReDim Preserve myarr2(1 To 3, 1 To n)
Application.ScreenUpdating = False
Range("E2").Resize(n, 3) = Application.Transpose(myarr2)
Application.ScreenUpdating = True
Erase myarr2
Set z = Nothing
MsgBox "İşlem tamamlandı" & vbLf & "Süre : " & Format(Now - ilk, "hh:mm:ss") & vbLf & _
"evrengizlen@hotmail.com", vbOKOnly + vbInformation, "E V R E N"
End Sub
 

Ekli dosyalar

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,248
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
herkese çok çok teşekkür ederim. makro en iyisi ve en hızlısıymış demek... :)
Süre ne kadar sürdü? Belirtirseniz memnun olurum.
Bende bu konuda bir fikir edineyim.Merak ettim.:cool:
 
Üst