Dizi' nin hücreye kopyalarken Resize problemi

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,190
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,

Ekli dosyada ADO Recordset ile ana sayfaya veri alırken;

Kopyalanacak başlangıç hücresini resize etmeye gerek kalmadan, sadece ilk hücrenin adresini tanımlayarak yapılamz mı?
Sht.Range("A2").Resize(y, 2)
Resize olayı hücre otomatik kendi algılasa; her seferinde Resize boyutlarını belirlerken hataya düşüyorum.

teşekkürler,

Kod:
    Veri = RS.GetRows
    y = UBound(Veri, 2)
    
    arr = WorksheetFunction.Transpose(Veri)
    
    Dim Hedef As Range
    
    Set Hedef = Sht.Range("A2").Resize(y, 2)
    Hedef.Value = arr
 

Ekli dosyalar

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,398
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
RS'i diziye alıp, transpose ettikten sonra tekrar diziye alıp Resize etmek bence gereksiz.....

Aşağıdaki kod bu işi çözmüyor mu?

C#:
If ab > 0 Then
    Sht.Range("A2").CopyFromRecordset RS
End If
.
 

Muzaffer Ali

Destek Ekibi
Destek Ekibi
Katılım
5 Haziran 2006
Mesajlar
6,605
Excel Vers. ve Dili
2019 Türkçe
Merhaba.

Sizin kodları da Sayın @Haluk beyin önerdiği şekilde de denedim

Nedendir bilemedim ama ikisi de aktarmada ürün adı "AR1017 Prostick 1000" olanlardan biri siliniyor.

Ayrıca sizin kodlarınızda y = UBound(Veri, 2) satırını y = UBound(Veri, 2) + 1 yapmalısınız.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,367
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
DISTINCT kullanımından dolayı mükerrer olanlar eleniyor. Mükerrer kayıtlar benzersiz olarak listeleniyor.
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,190
Excel Vers. ve Dili
Office 2013 İngilizce
RS'i diziye alıp, transpose ettikten sonra tekrar diziye alıp Resize etmek bence gereksiz.....

Aşağıdaki kod bu işi çözmüyor mu?

C#:
If ab > 0 Then
    Sht.Range("A2").CopyFromRecordset RS
End If
.
Haluk Hocam
Sht.Range("A2").CopyFromRecordset RS
bu yöntemi kullanıyorum,

burada sorgulanan verileri diziye almamım bir kaç nedeni var,
- Bazen dizi içinde bazen aratma yapıp, bazı değerleri elemem gerekiyor,
diğer bir durum TOP x değeri almak istediğimizde, SELECT TOP kullanımında aynı değeri içeren birden çok ifadeler olunca limit değeri geçebiliyor, bunu sınırlandırmak gibi durumlarda;
Dizi içinde işlem yapmak benin için çok daha esnek oluyor. O nedenle Dizi kullanımını tercih etmeye çalışıyorum.

teşekkürler, iyi çalışmalar.
 

Korhan Ayhan

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

Resize aslında daha kolay. Sadece olayı kavramak gerekiyor.

Dizi kullanma isteğiniz olduğu için aşağıdaki kodu öneriyorum. Fakat bunda da eğer veri sayısı 65536'yı geçerse TRANSPOSE komutundan dolayı hata alabilirsiniz.

Kod içinde hem hücre aralığı vererek veriyi sayfaya yazdırma işlemi var. Hem de Resize komutu kullanımı var. Bu kullanım tek tırnak ile pasif durumda.

Bildiğiniz üzere dizinin boyutunu bulmak için UBOUND komutu kullanıyor. Sizin istediğiniz şekilde sayfaya yazdırırıken ilk hücrenin konumu çok önemli oluyor. Sizin örnekte bu hücre A2 hücresidir. Verinizde iki boyutlu bir dizi oluşturuyor. Doğal olarakta sonuç iki sütuna yazdırılacaktır. Bu sebeple veriyi hücreye yazdırırken A2:B... aralığını kullanmak gerekiyor. 3 nokta olarak belirttiğim yere UBOUND ile dizinin satır sayısını tespit edip tanımlıyoruz. Sondaki +1 ise üstten bıraktığınız boş hücre (A1) sayısıdır.

Fakat Resize kullansaydınız bunlara gerek olmayacaktı. Başlangıç hücresini yazdıktan sonra satır ve sütun sayısını UBOUND ile bulup alana verileri yazdırıyoruz. Burada verim 2 sütunlu mu sorunu ortadan kalkmış oluyor.

Tabi ki kullanım tercihi size kalmış...

Bana göre ADO kullanırken en önemli şey sorgu satırıdır. Bunu doğru kurgularsanız kayıt setini döngüye almanıza gerek kalmaz. Buna odaklanmak bence daha efektif sonuçlar yaratacaktır.

C++:
Option Explicit

Sub Unique_List()
    Dim My_Connection As Object, My_Query As String, My_Data As Variant
    
    Set My_Connection = CreateObject("AdoDB.Connection")
    
    My_Connection.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
    
    My_Query = "Select Distinct [Ürün Adı], Sıralama From [Table2$]"
    
    My_Data = WorksheetFunction.Transpose(My_Connection.Execute(My_Query).GetRows)
    
    Range("A2:B" & UBound(My_Data, 1) + 1).Value = My_Data
    'Range("A2").Resize(UBound(My_Data, 1), UBound(My_Data, 2)).Value = My_Data
    
    If My_Connection.State <> 0 Then My_Connection.Close
    
    Set My_Connection = Nothing
End Sub
 

tamer42

Destek Ekibi
Destek Ekibi
Katılım
11 Mart 2005
Mesajlar
3,190
Excel Vers. ve Dili
Office 2013 İngilizce
Merhaba,

Resize aslında daha kolay. Sadece olayı kavramak gerekiyor.

Dizi kullanma isteğiniz olduğu için aşağıdaki kodu öneriyorum. Fakat bunda da eğer veri sayısı 65536'yı geçerse TRANSPOSE komutundan dolayı hata alabilirsiniz.

Kod içinde hem hücre aralığı vererek veriyi sayfaya yazdırma işlemi var. Hem de Resize komutu kullanımı var. Bu kullanım tek tırnak ile pasif durumda.

Bildiğiniz üzere dizinin boyutunu bulmak için UBOUND komutu kullanıyor. Sizin istediğiniz şekilde sayfaya yazdırırıken ilk hücrenin konumu çok önemli oluyor. Sizin örnekte bu hücre A2 hücresidir. Verinizde iki boyutlu bir dizi oluşturuyor. Doğal olarakta sonuç iki sütuna yazdırılacaktır. Bu sebeple veriyi hücreye yazdırırken A2:B... aralığını kullanmak gerekiyor. 3 nokta olarak belirttiğim yere UBOUND ile dizinin satır sayısını tespit edip tanımlıyoruz. Sondaki +1 ise üstten bıraktığınız boş hücre (A1) sayısıdır.

Fakat Resize kullansaydınız bunlara gerek olmayacaktı. Başlangıç hücresini yazdıktan sonra satır ve sütun sayısını UBOUND ile bulup alana verileri yazdırıyoruz. Burada verim 2 sütunlu mu sorunu ortadan kalkmış oluyor.

Tabi ki kullanım tercihi size kalmış...

Bana göre ADO kullanırken en önemli şey sorgu satırıdır. Bunu doğru kurgularsanız kayıt setini döngüye almanıza gerek kalmaz. Buna odaklanmak bence daha efektif sonuçlar yaratacaktır.

C++:
Option Explicit

Sub Unique_List()
    Dim My_Connection As Object, My_Query As String, My_Data As Variant
   
    Set My_Connection = CreateObject("AdoDB.Connection")
   
    My_Connection.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
   
    My_Query = "Select Distinct [Ürün Adı], Sıralama From [Table2$]"
   
    My_Data = WorksheetFunction.Transpose(My_Connection.Execute(My_Query).GetRows)
   
    Range("A2:B" & UBound(My_Data, 1) + 1).Value = My_Data
    'Range("A2").Resize(UBound(My_Data, 1), UBound(My_Data, 2)).Value = My_Data
   
    If My_Connection.State <> 0 Then My_Connection.Close
   
    Set My_Connection = Nothing
End Sub
teşekkürler Korhan Hocam
emeğinize sağlık, iyi ki varsınız!
 
Üst