Scripting.Dictionary nesnesi ile 3 sütunda benzersiz ve değerler toplamı

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe

Arkadaşlar merhaba,
Şu aralar Scripting.Dictionary nesnesini kavramaya çalışıyorum.
Sorumu formül veya diğer makrolarla çözebiliyorum.
Amacım sorumu Scripting.Dictionary ile çözmek hem de kod mantığını kavramaya çalışmak.
Scripting.Dictionary oldukça örnek mevcut ama tam kavrayamadığım için kendi sorunuma uyarlayamıyorum.
Kodun yapacağı işlem
A sütunundanki yılları F sütununa benzersiz listeleyecek.
G sütununa F sütunundaki yıl değerine göre B sütunundaki benzersiz turnuva adetlerini yazacak.
H sütununa da değerlerin toplamını bulacak.


 
 

Ekli dosyalar

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Murat Osma'nın sitesindeki dosyayı ve Korhan Bey'in yazmış olduğu kodu harmanlayarak sonuca ulaştım. Baya uğraştırdı ama. İşin güzel yanı
Scripting.Dictionary nesnesinin çalışma mantığını baya çözdüm sayılır.


Sub Emre()
Range("F:H") = ""
Dim dic As Object, liste(), dizi()
son = Cells(Rows.Count, "B").End(3).Row

liste = Range("A3:C" & son).Value
ReDim dizi(1 To son, 1 To 3)
Set dic1 = CreateObject("scripting.dictionary")
Set dic2 = CreateObject("scripting.dictionary")
For x = 1 To UBound(liste, 1)
aranan1 = liste(x, 1)
aranan2 = liste(x, 1) & liste(x, 2)

If Not dic1.exists(aranan1) Then

n = n + 1
m = m + 1
dic1.Add aranan1, n
dic2.Add aranan2, m
ReDim Preserve dizi(1 To son, 1 To 3)
dizi(n, 1) = liste(x, 1)
dizi(n, 2) = 1
dizi(n, 3) = liste(x, 3)

Else

If Not dic2.exists(aranan2) Then
m = m + 1
dic2.Add aranan2, m
ReDim Preserve dizi(1 To son, 1 To 3)

dizi(dic1.Item(aranan1), 2) = dizi(dic1.Item(aranan1), 2) + 1
dizi(dic1.Item(aranan1), 3) = dizi(dic1.Item(aranan1), 3) + 1
End If
End If


Next x

Range("F3").Resize(dic1.Count, 3) = dizi
Range("F3:H100").Sort Range("F3")

End Sub
https://www.excelarsivi.com/ adresinde kendinizi geliştirmek adına bir çok dosya bulunmakta. Tavsiye ederim.
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Adetler yakın 2005 benim kodun bulduğu sonuç doğru gibi. Sizde 10 bulmuş, bende 11. Sayı toplamları sizinki doğru. 2005 ve 2011 farklı
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Sub Emre()
Zaman = Timer
Range("F:H") = ""
Dim dic As Object, liste(), dizi()
Son = Cells(Rows.Count, "B").End(3).Row

liste = Range("A3:C" & Son).Value
ReDim dizi(1 To Son, 1 To 3)
Set dic1 = CreateObject("scripting.dictionary")
Set dic2 = CreateObject("scripting.dictionary")
For X = 1 To UBound(liste, 1)
aranan1 = liste(X, 1)
aranan2 = liste(X, 1) & liste(X, 2)

If Not dic1.exists(aranan1) Then

n = n + 1
m = m + 1
dic1.Add aranan1, n
dic2.Add aranan2, m
ReDim Preserve dizi(1 To Son, 1 To 3)
dizi(n, 1) = liste(X, 1)
dizi(n, 2) = 1


Else

If Not dic2.exists(aranan2) Then
m = m + 1
dic2.Add aranan2, m
ReDim Preserve dizi(1 To Son, 1 To 3)

dizi(dic1.Item(aranan1), 2) = dizi(dic1.Item(aranan1), 2) + 1

End If
End If


dizi(dic1.Item(aranan1), 3) = dizi(dic1.Item(aranan1), 3) + liste(X, 3)


Next X

Range("F3").Resize(dic1.Count, 3) = dizi
Range("F3:H100").Sort Range("F3")
MsgBox "İşleminiz tamamlanmıştır." & Chr(10) & Chr(10) & _
"İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation

End Sub

Sub BENZERSİZ_ÇİFT_SÜTUN()
Dim s As Object, liste(), dizi()

Son = Cells(Rows.Count, "A").End(3).Row
liste = Range("A3:C" & Son).Value

ReDim dizi(1 To Son, 1 To 3)

Set s = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(liste, 1)
Aranan = liste(i, 1) & liste(i, 2)
If Not s.exists(Aranan) Then
Say = Say + 1
s.Add Aranan, Say

ReDim Preserve dizi(1 To Son, 1 To 3)
dizi(Say, 1) = liste(i, 1)
'dizi(say, 2) = dizi(say, 2) + liste(i, 2)
'dizi(say, 3) = dizi(say, 3) + liste(i, 2)
End If
Next i

Range("F3").Resize(s.Count, 3) = dizi
End Sub
Değer hesaplayan satırı koşul dışına çıkarınca hesaplamayı doğru yapıyor. Benim kodlar 0,05 sizinki 0,16 sn sürüyor.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,767
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Büyük ihtimalle öyledir...
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Aşağıdaki örnek, konu hakkında size ışık tutabilir.
Cevabınız için teşekkür ederim. Kodları biraz inceledim. Geniş bir zamanda daha dikkatli inceleyeceğim. Yaklaşık 13 yıldır Excel ile sürekli uğraşıyorum ve her geçen gün kendime bir şeyler katıyorum.

Özellikle çok hızlı çalışan diziler ile ilgili çok geri kaldığımı söyleyebilirim. Bazen dolambaçlı yollarda da gitsem genel olarak kendi kendime yetiyorum.
Daha alacak çok yolum var.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,767
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Ekteki dosyada döngüyü teke düşürdüm. Bunun performansı biraz daha iyi gibi görünüyor.

Ben aslında tek Dictionary nesnesi kullanmanın daha hızlı olacağını düşünmüştüm. Ya kurduğum kurgu yavaş kaldı. Ya da birden fazla Dictionary kullanmak avantaj sağlıyor.
 

Ekli dosyalar

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Cevabınız için teşekkür ederim. Bir sorum olacaktı Scripting.Dictionary yönteminde minumum ve maksimum değerleri alabilir miyiz?
 

Korhan Ayhan

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

Öğrenmek istiyorsanız bolca araştırma yapmanızı tavsiye ediyorum.


Ayrıca görsel bir anlatımı da ekte bulabilirsiniz.

 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Korhan Bey yazdığınız kodda

If Say > 0 Then
S1.Range("F3").Resize(Say, 3) = liste
S1.Range("F2").CurrentRegion.Sort S1.Range("F3"), xlAscending, , , , , , xlYes
End If
E sütununda da sıralama yapıyor. Sebebi ne acaba?
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Bir de yazdığım kodda
ReDim Preserve dizi(1 To son, 1 To 3) kısımını sildim ama sonuç aynı çıktı. Bu kısım gereksiz mi?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,767
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
"E" sütunu boş değil mi?
 

Muhammet Okumuş

Destek Ekibi
Destek Ekibi
Katılım
28 Eylül 2007
Mesajlar
4,025
Excel Vers. ve Dili
2013 Türkçe
Boş ama E sütununda veri olsa ne yapacaktık? E sütunu sırlamaya neden dahil oluyor?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,767
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Kullandığım CurrentRegion komutu buna sebep oluyor.

Dilerseniz bunun yerine aşağıdaki satırı kullanabilirsiniz.

Kod:
S1.Range("F3").Resize(Say, 3).Sort S1.Range("F3"), xlAscending, , , , , , xlNo
 
Üst