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

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
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:
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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.
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
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.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
Koddaki "5" değeri, RecordSet içinde açtığımız "Sayi" alanının tipini Double olarak belirler.

.
 

Korhan Ayhan

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

Sizin paylaştığınız çözümde Dictionary ile ilgili satırları kod bloğundan silsek sorun olur mu?
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
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.
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
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.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
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:
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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.
 

halit3

Uzman
Uzman
Katılım
18 Ocak 2008
Mesajlar
12,760
Excel Vers. ve Dili
2003 excell türkçe
ve
2007 excell türkçe
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
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
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:
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
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.
 
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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.
 
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
....
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:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,291
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
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:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,237
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
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
 
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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 :(
 
Katılım
5 Kasım 2006
Mesajlar
572
Excel Vers. ve Dili
TÜRKCE Excel 2021 32bit
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.
 
Üst