KOD AÇIKLAMADA - DİCTİONARY İLE İKİ LİSTEYİ KARŞILAŞTIRMA - EN HIZLI YÖNTEM

Поділитися
Вставка
  • Опубліковано 15 вер 2024
  • 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

КОМЕНТАРІ • 36

  • @ilyassaritas8537
    @ilyassaritas8537 Рік тому +1

    Teşekkürler hocam elinize ağzınıza dilinize sağlık. Bu VBA'yı bize bu kadar sevdirdiniz. Her izlediğimde ayrı keyif alıyorum.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim Ilyas Bey. Çok naziksiniz

  • @Bilgemen
    @Bilgemen Рік тому +1

    Hocam çok güzel bir anlatım tarzınız var. Ağzına ve elinize sağlık

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim. Çok naziksiniz

  • @emrahruhisen6718
    @emrahruhisen6718 Рік тому +1

    Yine çok verimli bir çalışma olmuş, elinize sağlık Mehmet Bey

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim Emrah Bey. Çok naziksiniz

  • @sedataksakal414
    @sedataksakal414 Рік тому +1

    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. :)

    • @sedataksakal414
      @sedataksakal414 Рік тому +1

      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.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim. Çok naziksiniz. İnşallah vaktim oldukça burdayım

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Concat yaparak dicte atarsak olabilir

  • @gezdikcebilelim
    @gezdikcebilelim Рік тому +1

    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 ☺️

  • @emrullahakcelik552
    @emrullahakcelik552 Рік тому +1

    Hocam çok özlemişiz sizi. Hocam udemy kursunuz kıvamında bir web eğitimi bekliyoruz o zaman. 😊

    • @UzmanExcel
      @UzmanExcel  Рік тому +1

      İnşallah. Zor gibi zamandan dolayı ama neden olmasin :)

  • @sedatkeles362
    @sedatkeles362 Рік тому +1

    Teşekkürler hocam.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Rica ederim Sedat Bey. Çok naziksiniz

  • @adnankarabacak5878
    @adnankarabacak5878 Рік тому +1

    Tesekkürler Mehmet Hocam, Web alandada basarilar dilerim. Bizleri ihmal etmeyin. ❤

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Burasi ve sizlerin yeri ayrı bende Adnan Bey

  • @6ugggg
    @6ugggg Рік тому +1

    emeğinize sağlık güzel bir çalışma

    • @UzmanExcel
      @UzmanExcel  Рік тому +1

      Çok teşekkür ederim. Çok naziksiniz

    • @6ugggg
      @6ugggg Рік тому +1

      @@UzmanExcel rica ederim

  • @sezginbulut44
    @sezginbulut44 Рік тому +1

    Eline sağlık

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim Sezgin Bey. Çok naziksiniz

  • @mustafakoker53
    @mustafakoker53 Рік тому +1

    Hocam elinize sağlık bir mail göndermiştim size vaktiniz olursa bakıp bşr video da çekermisiniz

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Merhabalar Mustafa Bey. Çok teşekkür ederim. İnşallah en yakın zamanda bakacağım

  • @Bilgemen
    @Bilgemen Рік тому +1

    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.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      En garip hatadir automation hatasi. Detayli incelemek gerekli

  • @abdersoy1462
    @abdersoy1462 Рік тому +1

    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.😇

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Tabiki. O zaman hiç enum kullanmadan yapabilirsiniz ya da if sayfadaki deger bu ise enum yapabilirsiniz

    • @abdersoy1462
      @abdersoy1462 Рік тому +1

      @@UzmanExcel Teşekkürler hocam, Tmm. bir de öyle deneyeyimi

    • @abdersoy1462
      @abdersoy1462 Рік тому +1

      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.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      Çok teşekkür ederim. Çok naziksiniz. Saygılarımla

  • @yasaroguzocaktan9005
    @yasaroguzocaktan9005 Рік тому +1

    Dictionary methodunda tekrarsiz key olmak zorunda değil mi?

    • @UzmanExcel
      @UzmanExcel  Рік тому +1

      Aynen öyle. Bu tarz bir durum için önce exist ile kontrol edip add metodunu kullanmak daha güvenli

    • @yasaroguzocaktan9005
      @yasaroguzocaktan9005 Рік тому +1

      @@UzmanExcel hata yapa yapa hatasız yazmayı öğreneceğiz sayenizde:)
      Keşke on error resume next olayını da anlatsaniz detaylı olarak.

    • @UzmanExcel
      @UzmanExcel  Рік тому

      İnşallah ama çok tehlikeli resume next olayı. Ben baya az kullanmaya çalışıyorum hatta