Kodda düzenleme yapmak

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,168
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
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()
    Application.ScreenUpdating = False

    Set kaynak = ThisWorkbook.Worksheets("data")
    Set hedef = ThisWorkbook.Worksheets("tc_sicil")
    hedef.Range("B3:F" & Rows.Count).ClearContents
    myArray = kaynak.Range("A2:F" & 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
    Application.ScreenUpdating = True

    MsgBox "İşleminiz " & Timer - timer0 & " saniyede tamamlanmıştır."
End Sub
Bu kod ile 100000 Bin satırlarda bule 0,68 sn. gibi çok kısa bir zamanda data sayfasından arama yaptığım tc_sicil sayfasındaki A sutununda aradığım TC karşılıklarının data sayfasındaki B sutununda bulunan sicil karşılıklarını alabiliyorum.

Benim istediğim C,D,E,F vs. sutunlarınıda almak istersem kodda nasıl bir revize yapmalıyım, çok denemeler yaptım ancak başarılı olamadım. Yardımcı olabilecek hocalarıma şimdiden teşekkür ederim.
Saygılar
 

Ekli dosyalar

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,276
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Diğer başlıkta sorduğunuz sorunuzun benzeri gibi görünüyor. Aynı kodu kullanabilirsiniz.
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,168
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
@Korhan Ayhan hocam doğrudur, ben bu konuyu araştırırken bulduğum kodları anlamaya çalıştığımdan bu konuyu açtım, tek sutun değilde birden fazla sutun getirmek istersek bu kodda nasıl bir değişiklik yapılmalı onu öğrenmeye çalışıyorum. Teşekkürler
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,276
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Diğer başlıkta ilk döngü içinde ARRAY olarak yazılan bölümde aktarılmaktadır istenen sütunlara ait veriler hafızaya alınmaktadır. O bölümle oynayarak geliştirebilirsiniz.

Sonrasında ikinci döngü içinde bunları parçalayarak ayrıştırmalısınız.
 

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Kodları aşağıdaki şekilde deneyebilirsiniz.
Kod:
Sub Listele2()
    Dim S1 As Worksheet, S2 As Worksheet, Zaman As Double
    Dim Veri As Variant, X As Long, Son As Long
    Dim Dizi As Object, Aranan As Range, Say As Long
   
    Zaman = Timer

    Set S1 = Sheets("data")
    Set S2 = Sheets("tc_sicil")
    Set Dizi = VBA.CreateObject("Scripting.Dictionary")
  
    Son = S1.Cells(S1.Rows.Count, 1).End(3).Row
  
    Veri = S1.Range("A3:F" & Son).Value
  
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        If Not Dizi.Exists(Veri(X, 1)) Then
            Dizi.Add Veri(X, 1), Array(Veri(X, 2), Veri(X, 3), Veri(X, 4), Veri(X, 5), Veri(X, 6))
        End If
    Next

    Son = S2.Cells(S2.Rows.Count, 1).End(3).Row

    Veri = S2.Range("A3:A" & Son).Value
  
    ReDim Liste(1 To Son - 1, 1 To 6)
      
    For X = LBound(Veri, 1) To UBound(Veri, 1)
        Say = Say + 1
        If Dizi.Exists(Veri(X, 1)) Then
            Liste(Say, 1) = Veri(X, 1)
            Liste(Say, 2) = Dizi.Item(Veri(X, 1))(0)
            Liste(Say, 3) = Dizi.Item(Veri(X, 1))(1)
            Liste(Say, 4) = Dizi.Item(Veri(X, 1))(2)
            Liste(Say, 5) = Dizi.Item(Veri(X, 1))(3)
            Liste(Say, 6) = Dizi.Item(Veri(X, 1))(4)
        Else
            Liste(Say, 1) = Veri(X, 1)
        End If
    Next
  
    S2.Range("A3:f" & S2.Rows.Count).ClearContents
  
    If Say > 0 Then S2.Range("A3").Resize(Say, 6) = Liste

    Set S1 = Nothing
    Set S2 = Nothing
    Set Dizi = Nothing

    MsgBox "Veri aktarımı tamamlanmıştır." & Chr(10) & Chr(10) & _
           "İşlem süresi ; " & Format(Timer - Zaman, "0.00") & " Saniye", vbInformation
End Sub
 

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
Aşağıdaki şekilde deneyin.
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()
    Application.ScreenUpdating = False

    Set kaynak = ThisWorkbook.Worksheets("data")
    Set hedef = ThisWorkbook.Worksheets("tc_sicil")
    hedef.Range("B3:F" & Rows.Count).ClearContents
    myArray = kaynak.Range("A2:F" & 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, 1) & "#" & myArray(i, 2) & "#" & myArray(i, 3) & "#" & myArray(i, 4) & "#" & myArray(i, 5) & "#" & myArray(i, 6)
    Next
    
    Dim cell As Range
    hedef.Select
    Range("A3:A" & hedef.Cells(hedef.Rows.Count, "A").End(xlUp).Row).Select
    For Each cell In Selection
        Data = dict(cell.Value)
        For y = 0 To 5
            cell.Offset(0, y) = Split(Data, "#")(y)
        Next y
    Next cell
    Set dict = Nothing
    Range("B2").Select
    Application.ScreenUpdating = True

    MsgBox "İşleminiz " & Timer - timer0 & " saniyede tamamlanmıştır."
End Sub
 

askm

Destek Ekibi
Destek Ekibi
Katılım
4 Haziran 2005
Mesajlar
2,745
Excel Vers. ve Dili
2010-2016
İlk yöntem 0,56 sn.
İkinci yöntem ile de 0,88 sn sürdü işlem.
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,168
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
Sn. @askm İlginiz için çok teşekkür ediyorum, 170000 satırda denedim 50 sn. sürdü, aynı datata 5.mesajınızdaki kod 18 sn. sürüyor, sanırım önceki kodu kullanmak daha iyi olacak. Teşekkürler.
 

Ziynettin

Destek Ekibi
Destek Ekibi
Katılım
18 Nisan 2008
Mesajlar
1,105
Excel Vers. ve Dili
office2010
Aynı veriye göre deneyiniz.

Kod:
Sub test()
    Dim dc As Object
    Dim i As Long
    sure = TimeValue(Now)
    Application.ScreenUpdating = False

    Set S1 = ThisWorkbook.Worksheets("data")
    Set S2 = ThisWorkbook.Worksheets("tc_sicil")
    S2.Range("B3:F" & Rows.Count).ClearContents
    a = S1.Range("A2:F" & S1.Cells(Rows.Count, "A").End(xlUp).Row).Value
    Set dc = CreateObject("Scripting.Dictionary")
    
    For i = 1 To UBound(a)
        dc(CStr(a(i, 1))) = i
    Next
    
    b = S2.Range("A2:A" & S2.Cells(Rows.Count, "A").End(xlUp).Row).Value
    ReDim c(1 To UBound(b), 1 To 5)
    For i = 1 To UBound(b)
        krt = CStr(b(i, 1))
        If dc.Exists(krt) Then
            For j = 2 To 6
                c(i, j - 1) = a(dc(krt), j)
            Next j
        End If
    Next i
    Set dc = Nothing
    Range("B2").Select
    [B2].Resize(UBound(b), 5) = c
    Application.ScreenUpdating = True

    MsgBox "İşleminiz " & CDate(TimeValue(Now) - sure) & " saniyede tamamlanmıştır."
End Sub
 

tahsinanarat

Altın Üye
Katılım
14 Mart 2005
Mesajlar
2,168
Excel Vers. ve Dili
Ofis 2019 Türkçe
Altın Üyelik Bitiş Tarihi
27-05-2028
Sn. @Ziynettin Bey, 170000 satırda denedim 00:00:03 sn. sürdü, 1000000 satırda denetim 00:00:15 sn. Müthiş hızlı elinize sağlık. Çok teşekkür ediyorum.
 
Üst