Soru Düşeyara Komutunu Makro Olarak Kullanma

Erdem Akdemir

Destek Ekibi
Destek Ekibi
Katılım
4 Mayıs 2007
Mesajlar
3,598
Excel Vers. ve Dili
2016 PRO TÜRKÇE-İNG. 64 BİT
Merhaba,

Tüm liste sayfasını sözleşme numarasına göre sıralarsanız aşağıdaki formül hızlı çalışacaktır.

Kod:
=EĞER(DÜŞEYARA(A2;'Tüm Liste'!$A$2:$A$20;1;1)=A2;DÜŞEYARA(A2;'Tüm Liste'!$A$2:$B$20;2;1))
 

muratboz06

Destek Ekibi
Destek Ekibi
Katılım
23 Mart 2017
Mesajlar
552
Excel Vers. ve Dili
Office365 TR
Deneyiniz.

Kod:
Sub ArraytoDict()
    Dim timer0 As Single
    Dim kaynak As Worksheet
    Dim hedef As Worksheet
    Dim myArray() As Variant
    Dim dict As Object
    Dim i As Long
    timer0 = Timer()
    
    Set kaynak = ThisWorkbook.Worksheets("Tüm Liste")
    Set hedef = ThisWorkbook.Worksheets("İletişim Eksik Liste")
    
    myArray = kaynak.Range("A1:B" & kaynak.Cells(kaynak.Rows.Count, "A").End(xlUp).Row).Value
    Set dict = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(myArray, 1)
        dict(myArray(i, 1)) = myArray(i, 2)
    Next
    
    Dim cell As Range
    hedef.Select
    Range("A2:A" & hedef.Cells(hedef.Rows.Count, "A").End(xlUp).Row).Select
    For Each cell In Selection
        cell.Offset(0, 1) = dict(cell.Value)
    Next cell
    Set dict = Nothing
    Range("B2").Select
    MsgBox "İşleminiz " & Timer - timer0 & " saniyede tamamlanmıştır."
End Sub
 

Korhan Ayhan

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

Bahsettiğiniz satır sayısında daha hızlı sonuç verecektir.

1 milyon satırda işlem 50 saniye civarında sürdü.

C++:
Option Explicit

Sub Fast_Vlookup_Dictionary()
    Dim S1 As Worksheet, S2 As Worksheet, Veri As Variant, X As Long, Zaman As Double
   
    Zaman = Timer
   
    Set S1 = Sheets("Tüm Liste")
    Set S2 = Sheets("İletişim Eksik Liste")
   
    With CreateObject("Scripting.Dictionary")
        Veri = S1.Range("A1").CurrentRegion.Value
       
        For X = LBound(Veri, 1) To UBound(Veri, 1)
            .Item(Veri(X, 1)) = Veri(X, 2)
        Next
       
       
        Veri = S2.Range("A1").CurrentRegion.Value
       
        For X = LBound(Veri, 1) To UBound(Veri, 1)
            If .Exists(Veri(X, 1)) Then
                Veri(X, 2) = .Item(Veri(X, 1))
            End If
        Next
   
        S2.Range("A1").Resize(UBound(Veri, 1), UBound(Veri, 2)) = Veri
    End With
       
    Set S1 = Nothing
    Set S2 = Nothing
       
    MsgBox "İşleminiz tamamlanmıştır." & vbLf & vbLf & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,489
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bu da ADO ile çözüm;

1 milyon satırda işlem 195 saniye civarında sürdü.

C++:
Sub Fast_Vlookup_Ado()
    Dim Baglanti As Object, Kayit_Seti As Object
    Dim Sorgu As String, S1 As Worksheet, Zaman As Double
    
    Zaman = Timer
    
    Set Baglanti = CreateObject("AdoDb.Connection")
    Set Kayit_Seti = CreateObject("AdoDb.Recordset")
    Set S1 = Sheets("İletişim Eksik Liste")
      
    S1.Range("B2:B" & S1.Rows.Count).ClearContents
    
    Baglanti.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
          
    Sorgu = "Select Tablo2.[İletişim Bilgisi] From [İletişim Eksik Liste$] As Tablo1 Left Join [Tüm Liste$] As Tablo2 " & _
            "On Tablo1.[Sözleşme No] = Tablo2.[Sözleşme No]"
    
    Kayit_Seti.Open Sorgu, Baglanti, 1, 1
    
    S1.Range("B2").CopyFromRecordset Kayit_Seti
            
    If Kayit_Seti.State <> 0 Then Kayit_Seti.Close
    If Baglanti.State <> 0 Then Baglanti.Close
            
    Set S1 = Nothing
    Set Baglanti = Nothing
    Set Kayit_Seti = Nothing
        
    MsgBox "İşleminiz tamamlanmıştır." & vbLf & vbLf & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
 
Katılım
1 Aralık 2008
Mesajlar
233
Excel Vers. ve Dili
Microsoft Excel 2016 TR 32 Bit
Altın Üyelik Bitiş Tarihi
23/07/2020
Hocalarım çok teşekkür ederim. Emeğinize sağlık
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,158
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
Sn. Korhan Hocam
Option Explicit

Sub Fast_Vlookup_Dictionary()
Dim S1 As Worksheet, S2 As Worksheet, Veri As Variant, X As Long, Zaman As Double

Zaman = Timer

Set S1 = Sheets("Tüm Liste")
Set S2 = Sheets("İletişim Eksik Liste")

With CreateObject("Scripting.Dictionary")
Veri = S1.Range("A1").CurrentRegion.Value

For X = LBound(Veri, 1) To UBound(Veri, 1)
.Item(Veri(X, 1)) = Veri(X, 2)
Next


Veri = S2.Range("A1").CurrentRegion.Value

For X = LBound(Veri, 1) To UBound(Veri, 1)
If .Exists(Veri(X, 1)) Then
Veri(X, 2) = .Item(Veri(X, 1))
End If
Next

S2.Range("A1").Resize(UBound(Veri, 1), UBound(Veri, 2)) = Veri
End With

Set S1 = Nothing
Set S2 = Nothing

MsgBox "İşleminiz tamamlanmıştır." & vbLf & vbLf & _
"İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye"
End Sub
Yukarıdaki kod ile çok hızlı bir şekilde sonuç alabiliyoruz öncelikle elinize sağlık, bu kod ile eğer birden fazla sutun getirmek istersek nasıl bir değişiklik yapmalıyız, birde A sutununda eğer boş hücre olursa oraya kadar olan karşılıkları getiriyor, sanrakileri getirmiyor, yani kod bura çalışmayı durduruyor. Teşekkürler.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
41,489
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Örnek dosya eklerseniz yöntem önerisinde bulunabilirim.
 
Üst