• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Çözüldü Redim ve Dictionary hata.(65536 satır sonrası)

  • Konbuyu başlatan Konbuyu başlatan FERAZ
  • Başlangıç tarihi Başlangıç tarihi
Merhaba;

Bir alternatif de ben vereyim ..... (ADO RecordSet yöntemi)

Kod:
Sub Test()
    ' Haluk 17/10/2018
    Dim myArray(1 To 1048570)
    Dim RS As Object
    Set RS = CreateObject("ADODB.Recordset")
    RS.Fields.Append "Sayi", 5
    RS.Open
    
    For i = LBound(myArray) To UBound(myArray)
        RS.AddNew
        RS.Fields("Sayi").Value = i
    Next
    
    RS.Update
    RS.MoveFirst
    Range("A1").CopyFromRecordset RS
    RS.Close
    Set RS = Nothing
End Sub

Not: Kodda ufak bir iyileştirme yapıldı.

.
 
Son düzenleme:
RS.Fields.Append "Sayi", 5
bunun manasını açıklayabilir misiniz Haluk Hocam?
Telefondan bakıp anladığım kadarıyla Sayi adında sanal Ado sütun eklenmiş ve değerler bunun içine atılmış.5 i çıkaramadım.
İlk defa Ado ile böyle bir örneğe denk geldim.
Dosyayı yarın deneyebilirim.
Teşekkürler.
 
Merhaba;

Bir alternatif de ben vereyim ..... (ADO RecordSet yöntemi)

Kod:
Sub Test()
    ' Haluk 17/10/2018
    Dim myArray(1 To 100000)
    Dim RS As Object
    Set RS = CreateObject("ADODB.Recordset")
    Set RS = New ADODB.Recordset
    RS.Fields.Append "Sayi", 5
    RS.Open
   
    For i = LBound(myArray) To UBound(myArray)
        RS.AddNew
        RS.Fields("Sayi").Value = i
    Next
   
    RS.Update
    RS.MoveFirst
    Range("A1").CopyFromRecordset RS
    RS.Close
    Set RS = Nothing
End Sub

Not: Kodda ufak bir iyileştirme yapıldı.

.
Haluk hocam teşekkür mederim.
Kod:
RS.Fields.Append "Sayi", 5
Yukarıdaki kodda 5 neyi ifade etmektedir.
 
Koddaki "5" değeri, RecordSet içinde açtığımız "Sayi" alanının tipini Double olarak belirler.

.
 
Evren Bey,

Sizin paylaştığınız çözümde Dictionary ile ilgili satırları kod bloğundan silsek sorun olur mu?
 
Koddaki "5" değeri, RecordSet içinde açtığımız "Sayi" alanının tipini Double olarak belirler.

.
Teşekkür ederim,hocam.
Peki rakamsal olarak değilde double gibi bir şey yazabilirmiyiz.
Ben denedim hata verdi.
 
Evren Bey,

Sizin paylaştığınız çözümde Dictionary ile ilgili satırları kod bloğundan silsek sorun olur mu?
Merhaba.Olmaz tabii.
Ama soruyu soran kişi dictionary ile benzersiz verileri çekmek istiyor diye tahmin ediyorum.
Benzersiz çekmek için dictionary kullanmak için dizi ile birlikte kullanılırsa olur.
Tabii burada if sorgusunun altına bir sayaç koymak gerekiyor.
Sorgulanan değer yoksa , sayacacı 1 arttırmak gerekiyor.
Dizidede o sayacı kullanmak gerekiyor.
 
Teşekkür ederim,hocam.
Peki rakamsal olarak değilde double gibi bir şey yazabilirmiyiz.
Ben denedim hata verdi.

Evren Bey;

Projeye Microsoft ActiveX Data Objects 6.1 Library referansını ekledikten sonra, daha önceki kodda Late Binding yerine bu kez Early Binding yapmak üzere RS değişkenini Object yerine bu kez ADODB.Recordset olarak deklare edersek, istediğiniz olur.

Bu şekilde, tanımlanabilecek diğer alan tiplerini de görebilirsiniz.

Bu durumda, revize kod şöyle olur;

Kod:
Sub Test2()
    ' Haluk 17/10/2018
    ' Microsoft ActiveX Data Objects 6.1 Library referansı eklenmelidir.
    Dim myArray(1 To 1048570)
    Dim RS As ADODB.Recordset
    
    Set RS = New ADODB.Recordset
    RS.Fields.Append "Sayi", adDouble
    RS.Open
    
    For i = LBound(myArray) To UBound(myArray)
        RS.AddNew
        RS.Fields("Sayi").Value = i
    Next
    
    RS("Sayi").Properties("Optimize") = True 'Index liyoruz...
    
    RS.Update
    RS.MoveFirst
    
    Range("A1").CopyFromRecordset RS
    
    RS.Close
    Set RS = Nothing
End Sub

.
 
Son düzenleme:
Merhaba.Olmaz tabii.
Ama soruyu soran kişi dictionary ile benzersiz verileri çekmek istiyor diye tahmin ediyorum.
Benzersiz çekmek için dictionary kullanmak için dizi ile birlikte kullanılırsa olur.
Tabii burada if sorgusunun altına bir sayaç koymak gerekiyor.
Sorgulanan değer yoksa , sayacacı 1 arttırmak gerekiyor.
Dizidede o sayacı kullanmak gerekiyor.

Dictionaryi bayağı biliyorum.Sadece 65536 dan sonrasını yapamamıştım.Yani benzersizlikle alakalı değil.Yinede kodun içinde geçtiği için güzel olmuş.Tabiiki benzersiz veri için güzel uygulanır.Yoksa redim ilede hızlı sonuç olurdu.Dictionary nin en güzel yanı benzersizlik olayı bence.
 
Evren Bey mevcut kodda benzer hiç veri yok onun için Korhan Beyin söylediğine katılıyorum.
aşağıdaki kodda ben çıkarttım kırmızı yeri ekledim.

Rich (BB code):
Sub myscripting59()
    Dim i As Long, myarr()

    ReDim myarr(1 To 70000, 1 To 2)
    Columns(2).Clear
    Columns(3).Clear
    For i = 1 To 70000

        myarr(i, 1) = i
        myarr(i, 2) = i * 10
    Next
    Range("B1").Resize(70000, 2) = myarr

    Erase myarr

End Sub
 
Evren Bey;

Projeye Microsoft ActiveX Data Objects 6.1 Library referansını ekledikten sonra, daha önceki kodda Late Binding yerine bu kez Early Binding yapmak üzere RS değişkenini Object yerine bu kez ADODB.Recordset olarak deklare edersek, istediğiniz olur.

Bu şekilde, tanımlanabilecek diğer alan tiplerini de görebilirsiniz.

Bu durumda, revize kod şöyle olur;

Kod:
Sub Test2()
    ' Haluk 17/10/2018
    Dim myArray(1 To 1048570)
    Dim RS As ADODB.Recordset
    Set RS = New ADODB.Recordset
    RS.Fields.Append "Sayi", adDouble
    RS.Open
  
    For i = LBound(myArray) To UBound(myArray)
        RS.AddNew
        RS.Fields("Sayi").Value = i
    Next
  
    RS.Update
    RS.MoveFirst
    Range("A1").CopyFromRecordset RS
    RS.Close
    Set RS = Nothing
End Sub

.
Anladım hocam.
Denedim oldu.:giggle:
 
Evren Bey mevcut kodda benzer hiç veri yok onun için Korhan Beyin söylediğine katılıyorum.
aşağıdaki kodda ben çıkarttım kırmızı yeri ekledim.

Rich (BB code):
Sub myscripting59()
    Dim i As Long, myarr()

    ReDim myarr(1 To 70000, 1 To 2)
    Columns(2).Clear
    Columns(3).Clear
    For i = 1 To 70000

        myarr(i, 1) = i
        myarr(i, 2) = i * 10
    Next
    Range("B1").Resize(70000, 2) = myarr

    Erase myarr

End Sub
Halit bey, arkadaş böyle bir şey istemedi ama ben orada kullanacağını tahmin etmiştim.
 
Range("B1").Resize(Dict.Count, 2) = myarr
Evet burdaki myarr yerine keys yada items kullanılıp çözülmeliymiş.Yoksa benim kodla farkı yokmuş :)
O zaman problem bitmemiş hocalarım.
 
Aslında o kadar sorun değil.Sadece merak etmiştim dictionary olayında 65536 satır sonrasını.
Artık redim ve dictionaryi harmanlayıp sonuca ulaşırım gerektiğinde.Zaten büyük dosyalarda Ado imdada yetişiyor.Gerçi benim büyük dosyamda yok fakat bazen yardım ettiklerimin oluyor:(
Fakat redim olayındaki çözümler süper oldu.Herkesin eline sağlık.
 
....
Fakat redim olayındaki çözümler süper oldu.Herkesin eline sağlık.

Ben olayın ReDim kısmıyla fazla ilgilenmedim de, olayın yanlış anlaşılmaması için bir açıklama yapma ihtiyacı hissettim.

ReDim ile, siz daha önce boyutlandırdığınız bir Array'i tekrar boyutlandırma ihtiyacı hissettiğinizde kullanırsınız.

Yani, kodun içinde eğer Array'in boyutları değiştirme ihtiyacı hissetmiyorsanız, ReDİm kullanmaya gerek olmaz, kullanılanca da kodun süresi kısalmaz.

Normalde, Dim dediğimiz deklarasyon esasında Dimension demektir. ReDim ise, ReDimension yani; YenidenBoyutlandır anlamındadır ve sadece Array tipindeki değişkenler için kullanılır.

.
 
Son düzenleme:
Merhaba;

Konuya ilişkin olarak bir de; bellekte oluşturulan bir DOMDocument nesnesine verileri yazdıktan sonra Recordset olarak açıp, sayfaya yazdırılabilir.

Bu yöntem ile birlikte, yukarıda 21 ve 28. mesajlardaki kodların yer aldığı dosya ektedir. (1.048.570 adet veri yazılıp, okunmaktadır)

Konuya ilişkin daha fazla bilgi almak isteyenler, aşağıdaki linkte @Zeki Gürsoy 'un mesajına bakabilir.

https://www.excel.web.tr/threads/adodb-recordset-ve-xml-ile-olan-iliskisi.174772/

.
 

Ekli dosyalar

Son düzenleme:
Ben de bir örnek hazırladım.

PHP:
Sub Test()
    Dim l As Long
   
    ReDim testarray(0 To 1048569)
   
    '1.048.570 satır için...
    For l = 0 To 1048569
        testarray(l) = l
    Next
   
    t1 = Timer
    Range("a1").Resize(1048569, 1) = MyTransose(testarray)
    t2 = Timer
   
    MsgBox t2 - t1 & " saniye"
End Sub

Function MyTransose(arr)
    Dim l As Long, vArr, low As Byte, high As Long
   
    low = LBound(arr)
    high = UBound(arr)
   
    ReDim vArr(low To high, low To low)
   
    For l = low To high
        vArr(l, low) = arr(l)
    Next
   
    MyTransose = vArr
End Function
 
Merhaba;

Konuya ilişkin olarak bir de; bellekte oluşturulan bir DOMDocument nesnesine verileri yazdıktan sonra Recordset olarak açıp, sayfaya yazdırılabilir.

Bu yöntem ile birlikte, yukarıda 21 ve 28. mesajlardaki kodların yer aldığı dosya ektedir. (1.048.570 adet veri yazılıp, okunmaktadır)

Konuya ilişkin daha fazla bilgi almak isteyenler, aşağıdaki linkte @Zeki Gürsoy 'un mesajına bakabilir.

https://www.excel.web.tr/threads/adodb-recordset-ve-xml-ile-olan-iliskisi.174772/

.
Sağolun.Keşke dosyayı indirebilseydim :(
 
Ben de bir örnek hazırladım.

PHP:
Sub Test()
    Dim l As Long
  
    ReDim testarray(0 To 1048569)
  
    '1.048.570 satır için...
    For l = 0 To 1048569
        testarray(l) = l
    Next
  
    t1 = Timer
    Range("a1").Resize(1048569, 1) = MyTransose(testarray)
    t2 = Timer
  
    MsgBox t2 - t1 & " saniye"
End Sub

Function MyTransose(arr)
    Dim l As Long, vArr, low As Byte, high As Long
  
    low = LBound(arr)
    high = UBound(arr)
  
    ReDim vArr(low To high, low To low)
  
    For l = low To high
        vArr(l, low) = arr(l)
    Next
  
    MyTransose = vArr
End Function
Bu koddaki farkı çözemedim sayın hocam.
 
Geri
Üst