ListBox dan diziye alıp sayfaya yazdırmak

Katılım
8 Haziran 2007
Mesajlar
401
Excel Vers. ve Dili
excel fonksiyonlar
Forumda emeği geçen herkese merhaba. Arkadaşlar aşağıdaki kodlarda ne gibi bir hata var ki sonuç alamıyorum. Yapmaya çalıştığım şey kısaca şu. ListBox1 e tıkladığımda bazı işlemler yaparak Listbox2 ye listeliyor. Derdim listbox1 in satır sayısı kadar tıklayarak listbox2 nin 7. satırındaki verileri diziye alarak sayfa2 ye
yazdırmak. Ama bu kodlarla sadece bir hücreye veri alabiliyorum. İlgilenen arkadaşlara şimdiden teşekkürler.



Kod:
Application.ScreenUpdating = False

Dim syf2 As Worksheet
Set syf2 = Worksheets("SORGU_TABANI")

With syf2
.Range("FA24:GK1048576").ClearContents

ReDim dizit(0 To ListBox2.ColumnCount - 1, 0 To ListBox1.ListCount - 1)

For i = 0 To ListBox1.ListCount - 1
ListBox1.ListIndex = i

For j = 0 To ListBox2.ColumnCount - 1
dizit(j, i) = ListBox2.List(7, j)
Next
Next

.Range("FA24").Resize.Value = dizit


End With
Application.ScreenUpdating = True
 

Murat OSMA

Altın Üye
Altın Üye
Katılım
23 Mayıs 2011
Mesajlar
5,508
Excel Vers. ve Dili
Microsoft 365 TR-EN
Altın Üyelik Bitiş Tarihi
31-12-2028
Ben de Dizilerden size kısaca bahsetmek istiyorum.

Genel olarak iki tip dizi vardır.
Static Diziler
Dinamik Diziler

Dizilerde başlangıç indeksi belirtilmez ise; bu indeks 0 (sıfır)dır. Yani dizinin ilk elemanı 0 ile başlar.
10 elemanlı bir dizi belirtmek için; "Dim dizi(9)" yazılır. Bunun içerisine 0 da dahil olduğu için 10 elemanlı bir dizi olmuş olur.
Eğer dizilerin indeksi 0' dan değil de 1'den başlasın ve bazı durumlarda kafamız karışmasın derseniz; o hâlde kod penceresinin en üst satırına Option Base 1 ifadesi yazılır. Bu ifade; dizinin ilk eleman indeksinin 1 olacağını belirler.


Boyut nedir ?
Boyutu sütun (alan) gibi düşünebiliriz. Yani; dizinin içerisine alacağınız veriler tek bir alanda ise, içerisine alacağı eleman sayısını yazmanız yeterlidir "Dim dizi(15)" gibi. Bu tanımlama bize; dizinin tek boyutlu ve 16 elemanlı (İndeks 0 dan başladığı için) bir dizi olduğunu gösterir.
Bir diziyi iki boyutlu yapmak için, ilk boyuttan sonra virgül koyup ikinci boyutun eleman sayısını yazmanız yeterlidir.
Örnek olarak bu şekilde; Dizi dizi(15, 10). Aynı şekilde virgül koyup boyutunu artırabilirsiniz.

Eleman nedir ?
Elemanı da satır gibi düşünebiliriz. Dizinin içerisine alınan veri sayısını ifade eder.
Yani; bir sütunu boyut, satırları da eleman olarak düşünürsek; dizi içerisinde şöyle bir tanım yapmamız; Dim dizi(10, 5) bize bu dizideki eleman sayısının 11 x 6 = 60 elemanlı bir dizi olacağını gösterir. Tabii ki yukarıda bahsettiğim Option Base 1 ifadesini ilave ederseniz; eleman indeksi 1'den başlayacağı için 10 x 5 = 50 elemanlı bir dizi olacağını gösterir.


Static Diziler
İçerisine alınacak verilerin boyut ve eleman sınırının önceden belirlendiği dizilerdir.
Bu dizilerde daha sonra boyutlandırma yapılamaz.

Static Dizi Tanımlama Örnekleri;
• Dim dizi(10) As String
• Dim dizi(0 To 10) As Integer
• Dim dizi(30, 2) as Variant
• Dim Dizi(1 To 10, 5 To 10, 10 To 15)


Bu örnekte; Ad ve Yas adında iki adet tek boyutlu dizimiz mevcut ve bu dizilerini alacağı eleman sayıları (2) belirtilmiş.
Buradaki 2 sayısı bize bu dizinin 3 elemanlı bir dizi olduğunu gösteriyor. Tanımlamaları, boyut ve eleman sayısını belirledikten sonra, dizilerin elemanlarına (içerisine) verilerimizi aldırıyoruz. En sonunda da verileri sayfada belirtilen hücrelere aktarıyoruz.

Kod:
Sub Dizilerrr()
    Dim Ad(2) As String
    Dim Yas(2) As Integer
    Ad(0) = "Murat"
    Ad(1) = "Emre"
    Ad(2) = "Sibel"
    Yas(0) = 29
    Yas(1) = 23
    Yas(2) = 21
    Range("G2").Resize(3, 1).Value = Application.Transpose(Ad)
    Range("H2").Resize(3, 1).Value = Application.Transpose(Yas)
End Sub
Dinamik Diziler
İçerisine alınacak verilerin boyut ve eleman sınırının daha sonra yeniden boyutlandırılabildiği dizilerdir.

Redim nedir ?
Dinamik dizilerde dizinin boyut ve eleman sayısını artırmak veya azaltmak, diziye yeni bir boyut kazandırmak için kullanılır.
Kısaca dizi yeniden boyutlandırılmak istendiğinde kullanılır. Redim ifadesinde, dizinin boyutunu değiştirdiğinizde, içerisine almış olduğu veriler kaybolacaktır (silinecektir).

Redim Preserve nedir ?
Dinamik dizilerde dizinin boyut ve eleman sayısını artırmak veya azaltmak, diziye yeni bir boyut kazandırmak için kullanılır.
Redim Preserve ifadesinde, dizinin boyutunu değiştirdiğinizde, daha önce içerisine almış olduğu veriler kaybolmadan diziye eleman almaya devam edilebilir.
Yani; önceki verileriniz korunarak diziye yeni bir boyut kazandırılabilir.


Bu örnekte; a dizisine Redim ifadesiyle, tek boyutlu ve ilk etapta 4 elemanlı bir dizi olarak boyut kazandırıyoruz ve sonra Redim Preserve ifadesi ile, dizinin içerisine alınmış olunan verileri koruyarak yeni bir boyut kazandırıp eleman aldırmaya devam ediyoruz.
Kod:
Sub Dizimmm()
    Dim a() As String
    ReDim a(0 To 3) As String
    a(0) = "Nihan"
    a(1) = "Engin"
    a(2) = "Murat"
    a(3) = "Kumsal"
    
    ReDim Preserve a(0 To 5) As String
    a(4) = "Cansu"
    a(5) = "Emre"
    
    Range("K1").Resize(6, 1).Value = Application.Transpose(a)
End Sub
Umarım şimdi dizileri kafanızda daha iyi canlandırabilmiş ve nasıl kullanıldığını daha iyi kavrayabilmişsinizdir.
 
Son düzenleme:
Katılım
8 Haziran 2007
Mesajlar
401
Excel Vers. ve Dili
excel fonksiyonlar
Hocam açıklamalarınız için çok çok teşekkürler. Gerçekten çok öğretici açıklamalar. Ama sanırım benim yapmak istediğim bu yöntemle olmuyor. 2-3 saattir uğraşmama rağmen beceremedim. Ben de
başka bir şekilde çözdüm. Özenle hazırlamış olduğunuz bu yazı için de tekrar tekrar teşekkürler hocam. Sağlıcakla kalın. ;)
 

Murat OSMA

Altın Üye
Altın Üye
Katılım
23 Mayıs 2011
Mesajlar
5,508
Excel Vers. ve Dili
Microsoft 365 TR-EN
Altın Üyelik Bitiş Tarihi
31-12-2028
Kod:
[FONT="Trebuchet MS"]Size direkt olarak çözümü de yazabilirdim ama benim için eğitim önce geliyor. 
Bu yüzden öğrenmek isteyenler için [COLOR="Red"]Diziler [/COLOR]hk. detaylı bir açıklama yapmak istedim. 

İyi akşamlar.[/FONT]
 
Katılım
8 Haziran 2007
Mesajlar
401
Excel Vers. ve Dili
excel fonksiyonlar
Application.ScreenUpdating = False

Dim syf2 As Worksheet
Set syf2 = Worksheets("SORGU_TABANI")

With syf2
.Range("FA24:GK1048576").ClearContents

ReDim dizit(0 To 36, 0 To 0)

For i = 0 To ListBox1.ListCount - 1

ListBox1.ListIndex = i

ReDim Preserve dizit(0 To 36, 0 To i)

For j = 1 To 36 'ListBox2.ColumnCount - 1

dizit(j - 1, i) = ListBox2.List(7, j - 1)

Next
Next
.Range("FA24").Resize(i, j - 1).Value = Application.Transpose(dizit)
End With

Hocam diziye alma işi tamam. Ama son satırda , sayfaya yazdırma satırında run-time 13 hatası veriyor.
 

Murat OSMA

Altın Üye
Altın Üye
Katılım
23 Mayıs 2011
Mesajlar
5,508
Excel Vers. ve Dili
Microsoft 365 TR-EN
Altın Üyelik Bitiş Tarihi
31-12-2028
Dosyanızı görebilirsem, hatta yapmak istediğinizi de belirtirseniz daha kolay yorum yapar veya çözüm sunarım.
 
Üst