KOD AÇIKLAMADA - DİCTİONARY İLE İKİ LİSTEYİ KARŞILAŞTIRMA - EN HIZLI YÖNTEM
HTML-код
- Опубликовано: 5 фев 2025
- DİCTİONARY KULLANARAK İKİ LİSTEYİ BİRBİRLERİ İÇERİSİNDE KARŞILAŞTIRABİLİRSİNİZ. BU KOD SAYESİNDE İSE BUNU WİNDOWS NATİVE OBJESİ OLAN DİCTİONARY İLE EN HIZLI ŞEKİLDE YAPABİLİRSİNİZ.
Option Explicit
Public Enum KarsilastirmaTuru
SadeceListe1 = 1
SadeceListe2 = 2
HerIkiside = 3
End Enum
Public Sub ListeKarsilastirmasi()
'Tanimlamalar
'----------------------------------
Dim ws As Worksheet
Set ws = Sheet1
Dim rngListe1 As Range
Dim rngListe2 As Range
Dim rngSonuc As Range
Set rngListe1 = ws.Range("A1").CurrentRegion
Set rngListe2 = ws.Range("C1").CurrentRegion
Set rngSonuc = ws.Range("E1").CurrentRegion
Dim karsilastirma As KarsilastirmaTuru
karsilastirma = HerIkiside
'----------------------------------
Dim dictListe1 As New Dictionary
Dim dictSonuc As New Dictionary
Set dictListe1 = ListeyiOku(rngListe1.Value2)
Set dictSonuc = ListeleriKarsilastir(dictListe1, _
rngListe2.Value2, karsilastirma)
SonuclariYaz rngSonuc, dictSonuc
MsgBox "Listeler Karsilastirilmistir", _
vbInformation, "Sayin " & Environ("UserName")
End Sub
Private Sub SonuclariYaz(ByVal inpRng As Range, ByVal inpDict As Dictionary)
With inpRng
.CurrentRegion.ClearContents
.Value2 = "Sonuclar"
.Offset(1, 0).Resize(inpDict.Count, 1).Value2 = _
Application.Transpose(inpDict.Keys)
End With
End Sub
Private Function ListeleriKarsilastir(ByVal inpDict As Dictionary, _
ByVal inpArr As Variant, _
ByVal karsilastirma As KarsilastirmaTuru) As Dictionary
Dim i As Long
Dim item As Variant
Dim dictKarsilastirmaSonuc As New Dictionary
Dim dictSadeceListe2 As New Dictionary
For i = LBound(inpArr, 1) To UBound(inpArr, 1)
item = inpArr(i, 1)
If inpDict.Exists(item) = True Then
dictKarsilastirmaSonuc(item) = 0
inpDict.Remove item
Else
dictSadeceListe2(item) = 0
End If
Next i
If karsilastirma = HerIkiside Then
Set ListeleriKarsilastir = dictKarsilastirmaSonuc
ElseIf karsilastirma = SadeceListe1 Then
Set ListeleriKarsilastir = inpDict
ElseIf karsilastirma = SadeceListe2 Then
Set ListeleriKarsilastir = dictSadeceListe2
End If
End Function
Private Function ListeyiOku(ByVal inpArr As Variant) As Dictionary
Dim i As Long
Dim dict As New Dictionary
For i = LBound(inpArr, 1) To UBound(inpArr, 1)
dict(inpArr(i, 1)) = 0
Next i
Set ListeyiOku = dict
End Function
Hocam yemeğe gitmeden yazdıkların buysa dur bi proje yazayım dediğinde yaptıklarını düşünmek bile istemiyorum 😂 Bu videodan çıkan sonuç yolumuz epey uzun ☺️
Estağfurullah Sefa Bey :)
Hocam çok güzel bir anlatım tarzınız var. Ağzına ve elinize sağlık
Çok teşekkür ederim. Çok naziksiniz
Yine harikasınız. :)
Kod yazarken sizi seyretmek bile çok zevkli. Teşekkürler.. Kolaylıklar diliyorum. Arayı fazla açmayalım lütfen, özlüyoruz. :)
Liste1 ve Liste2, çok sütunlu olduğunda, eşleşen değerin 1.2.3... sütunlarını Array a atarak sonuca yazdırabilir miyiz? ( çalışan1/tckn/şehir/mahalle ) gibi.
Çok teşekkür ederim. Çok naziksiniz. İnşallah vaktim oldukça burdayım
Concat yaparak dicte atarsak olabilir
Yine çok verimli bir çalışma olmuş, elinize sağlık Mehmet Bey
Çok teşekkür ederim Emrah Bey. Çok naziksiniz
Tesekkürler Mehmet Hocam, Web alandada basarilar dilerim. Bizleri ihmal etmeyin. ❤
Burasi ve sizlerin yeri ayrı bende Adnan Bey
Hocam çok özlemişiz sizi. Hocam udemy kursunuz kıvamında bir web eğitimi bekliyoruz o zaman. 😊
İnşallah. Zor gibi zamandan dolayı ama neden olmasin :)
emeğinize sağlık güzel bir çalışma
Çok teşekkür ederim. Çok naziksiniz
@@UzmanExcel rica ederim
Teşekkürler hocam.
Rica ederim Sedat Bey. Çok naziksiniz
Ellerine nefesine sağlık olsun Mehmet hocam. [ karsilastirma = HerIkiside ] Burayı Enum dan değil de Sayfa1 de bir ComboBox1 tan alsak olabilir miydi hocam. ben biraz uğraştım becermedim.😇
Tabiki. O zaman hiç enum kullanmadan yapabilirsiniz ya da if sayfadaki deger bu ise enum yapabilirsiniz
@@UzmanExcel Teşekkürler hocam, Tmm. bir de öyle deneyeyimi
Hocam Teşekkürler sayenizde bunu da hallettim. Şu kod ile
If Sheets("Sayfa1").ComboBox1.ListIndex = 0 Then
karsilastirma = "1"
ElseIf Sheets("Sayfa1").ComboBox1.ListIndex = 1 Then
karsilastirma = "2"
ElseIf Sheets("Sayfa1").ComboBox1.ListIndex = 2 Then
karsilastirma = "3"
Else
MsgBox "Listeden Bir Seçim Yapmalısınız.": Exit Sub
'karsilastirma = "2" ' HerIkiside ' SadeceListe2 ' SadeceListe1 '
End If
Çok teşekkürler Ömrün uzun olsun.Selamlar.
Çok teşekkür ederim. Çok naziksiniz. Saygılarımla
Hocam elinize sağlık bir mail göndermiştim size vaktiniz olursa bakıp bşr video da çekermisiniz
Merhabalar Mustafa Bey. Çok teşekkür ederim. İnşallah en yakın zamanda bakacağım
Hocam bir sorum olacak. Yapmış olduğum bir excel programda user for açılmadan bazen (automation error vba) hatası veriyor. Sizden ricam mümkünse Tahminen neden kaynaklanıyor olabilir.
En garip hatadir automation hatasi. Detayli incelemek gerekli
Eline sağlık
Çok teşekkür ederim Sezgin Bey. Çok naziksiniz
Dictionary methodunda tekrarsiz key olmak zorunda değil mi?
Aynen öyle. Bu tarz bir durum için önce exist ile kontrol edip add metodunu kullanmak daha güvenli
@@UzmanExcel hata yapa yapa hatasız yazmayı öğreneceğiz sayenizde:)
Keşke on error resume next olayını da anlatsaniz detaylı olarak.
İnşallah ama çok tehlikeli resume next olayı. Ben baya az kullanmaya çalışıyorum hatta