VBA Diziler (Arrays)


Dizi/Array için içerisinde bir çok değişken taşıyan belirli isme ve boyuta sahip bir değişkenler kümesi tanımı yapılabilir. Array/Dizi’yi bir kutu olarak düşünürsek kutu içerisindeki ürünler dizi elemanlarını, ürünlerin tipi dizinin tipini, ürünlerin sayısı ise bize dizideki toplam eleman sayısını verir. Kutu içerisindeki her bir ürünün bir index numarası vardır ve o ürüne o index numarasından ulaşabiliriz.

Dim|Public|Private ArrayName(Dimension) As DataType

Dim|Public|Private DiziAdi(Boyut) As Tipi

Diziler Statik (Static) ve Dinamik (Dynamic) dizi olmak üzere iki’ye ayrılırlar. Eleman sayısı en başta (declaration kısmında) tanımlanan sabit boyutlu diziler statik dizilerdir, eleman sayısı kod içerisinde sonradan tanımlanan, değiştirilen değişken boyutlu diziler ise dinamik dizilerdir.

1.Bir kaç tane örnek dizi oluşturalım:


Sub arry()

Dim sayilar(0 To 4) As Integer 'Dizi boyutu verilmis bu bir statik dizi

Dim notlar(3) As Integer '4 elemanli integer tipinde bir degisken tutan bir statik dizi

Dim isimler(5) As String '6 elemanli string tipinde degisken tutan bir statik dizi

Dim renkler() As String 'Dizi boyutlandirilmamis, string tipinde degisken tutan bir dinamik dizi

Dim yaslar() As Integer 'Dizi boyutlandirilmamis, integer tipinde degisken tutan bir dinamik dizi

End Sub

Not:  Dizinin eleman sayısı = dizi boyutu +1 dir, çünkü dizilerde index değeri 0’dan başlar. Yani,


Sub bytelmn()

Dim notlar(3) As Integer '4 elemanli bir statik dizi

notlar(0) = 40 'bu 4 elemani index degeri 0'dan baslayacak sekilde tanimladik
notlar(1) = 50
notlar(2) = 70
notlar(3) = 60

End Sub

 

Dikkat : Dizi boyutundan fazla eleman tanımlarsanız subscript out of range hatası alırsınız.

arrays

2.Statik dizi örneği yapalım, dizi elemanlarını basit bir For döngüsü ile hücreye yazdıralım:


Sub arry_1()

Dim sayilar(0 To 4) As Integer

sayilar(0) = 10
sayilar(1) = 15
sayilar(2) = 20
sayilar(3) = 25
sayilar(4) = 30

For i = 0 To 4

Cells(i + 1, 1).Value = sayilar(i)

Next i

End Sub

arrays

3.Dinamik dizilerle ilgili bir örnek yapalım:

Redim ve Redim Preserve Kavramları

ReDim [Preserve] ArrayName(Dimension) As DataType

Redim : Diziyi yeniden boyutlandırmak için kullanacağım ifade

Preserve : Kullanılması zorunlu değildir ancak diziyi yeniden boyutlandırırken Preserve demez isek  önceki elemanları hafızada tutmaz, Preserve sayesinde önceden tanımlanmış eleman var ise aynen kalır.

Array Name : Dizi adı

Data Type : Diziyi ilk tanımlarken hangi tipte tanımladıysak aynı tipte olmalı, Redim içerisinde tip değişikliği yapılmaz kod hata alır.


Sub array_2()
 
Dim ulkeler() As String 'String tipinde dinamik bir dizi

Dim ulkeliste As String

ReDim ulkeler(2) As String 'Diziyi boyutlandırmak için "Redim" ifadesi kullanılır

ulkeler(0) = "Turkiye"
ulkeler(1) = "Ispanya"
ulkeler(2) = "Portekiz"

'Bir ulke daha eklemek istiyorum ancak dizim doldu
'Bunun için yeniden boyutlandırma yapmam gerekecek

ReDim Preserve ulkeler(3) As String

ulkeler(3) = "Avustralya"

For i = 0 To 3

ulkeliste = ulkeler(i) & vbNewLine & ulkeliste

Next i

MsgBox ulkeliste

End Sub

redim2

4.Yukarıdaki kodun aynısını Preserve kullanmadan yazalım:


Sub array_3()
 
Dim ulkeler() As String 'String tipinde dinamik bir dizi

Dim ulkeliste As String

ReDim ulkeler(2) As String 'Diziyi boyutlandırmak için "Redim" ifadesi kullanılır

ulkeler(0) = "Turkiye"
ulkeler(1) = "Ispanya"
ulkeler(2) = "Portekiz"

'Bir ulke daha eklemek istiyorum ancak dizim doldu
'Bunun için yeniden boyutlandırma yapmam gerekecek

ReDim ulkeler(3) As String 'Bu sefer Preserve ifadesini kullanmadık.

ulkeler(3) = "Avustralya"

For i = 0 To 3

ulkeliste = ulkeler(i) & vbNewLine & ulkeliste

Next i

MsgBox ulkeliste

End Sub

 

 

redim

5.LBound & Ubound Kavramları

LBound dizideki ilk elemanın indexini UBound ise son elemanın index’ini yani eleman sayısını verir.


Sub arry_4()

Dim sayilar() As Integer

Dim i As Integer

Dim y As Integer

ReDim sayilar(6) As Integer

i = LBound(sayilar)

y = UBound(sayilar)

MsgBox i & vbNewLine & y

End Sub

 
lbound_ubound

6.Şimdi LBound ve UBound kavramları ile  dizi elamanlarını hücreye yazdıralım.


Sub array_5()
 
Dim sporarabalar() As String

Dim i As Integer

ReDim sporarabalar(3) As String

sporarabalar(0) = "Ferrari"
sporarabalar(1) = "Lamborghini"
sporarabalar(2) = "Porsche"
sporarabalar(3) = "Lexus"

For i = LBound(sporarabalar) To UBound(sporarabalar)

Cells(i + 1, 1).Value = sporarabalar(i)

Next i

End Sub


redim2

7.Array/Dizi kavramıyla ilgili tüm anlatılanları pekiştiren bir örnekle konuyu bitirelim:


Sub array_6()

Dim palet() As String

Dim boyutvarmi As Boolean

Dim renk As String

Dim paletim As String

Dim i As Integer

boyutvarmi = False

Do

renk = InputBox("Bir renk Giriniz", "Paletteki renkler")

If boyutvarmi = False Then

ReDim palet(0) As String

boyutvarmi = True

Else

ReDim Preserve palet(UBound(palet) + 1)

End If

palet(UBound(palet)) = renk

Loop Until renk = ""

For i = LBound(palet) To UBound(palet)

paletim = palet(i) & vbNewLine & paletim

Next i

MsgBox "Paletimdeki renkler :" & vbNewLine & paletim

End Sub

=> Kodu çalıştıralım, InputBox her bir renk girip ok’a basınca yeniden açılacak cancel’a basana kadar istediğiniz kadar renk adı girebilirsiniz.

2016-05-11 23_18_49-Microsoft Excel - arrays 2016-05-11 23_18_49-Microsoft Excel - arrays2 

=> Bir kaç tane daha renk girdikten sonra cancel’a bastım.
2016-05-11 23_18_49-Microsoft Excel - arrays3

Reklamlar

VBA Diziler (Arrays)” üzerine 2 yorum

  1. merhaba bir sorum olacak
    öğrenci şubesi, öğrenci no, dönemi, ilk sınav tarihi, son sınav tairihi, aldığı not gibi bilgiler var.

    Birden fazla sınav yapılır ve bana lazım olan öğrencinin ilk 100 aldığı sınavın yukarıdaki bilgileri ve son 100 aldığı sınavın bilgilerini yeni sayfaya yazdırıp bu iki 100 aldığı sınav aralığındaki notları toplamasını alıp toplam not olarak yazdırması.

    Buna uygun makro yazılabilir mi_?

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s