1. Dizi Nedir

Daha önce değişkenlere bakmıştık. Değişkenler belirli bir değeri hafıza tutmaya yarayan program parçaları idi. Tek bir değişkeni hafızada tutmak için oldukça faydalı olmalarına rağmen elimizde birbiri ile bağlantılı birden fazla değer var ise bunları ayrı ayrı değişkenlerde tutmak çok verimli bir yöntem değildir.  Özellikle bu değerleri kullanarak bir ortalama veya toplam almaya çalışıyorsanız her seferinde tüm değişken isimlerini elle yazmanız gerekir. Örnek olarak bir öğrencinin yıl içinde 3 tane sınav 4 tane sözlü notu olduğunu düşünelim. Bunları Sınav1, Sınav2… gibi değişkenlerde tutmak daha sonrasında bu değerleri kullanarak işlem yapmayı çok güçleştirir. Aynı şey matrisler için de geçerlidir. Dizi değişkenleri işte bu soruna çözüm oluyor. Dizi değişkenleri birden fazla değeri hafızada tutmanızı sağlıyor.

2. Dizi Tanımlama
a. Sabit Boyutlu Dizi

Bu değişkenin tanımlaması da yine DİM komutu ile yapılıyor, tek farkı parantez içinde kaç tane değer tutmasını istiyorsanız o kadar rakam girmeniz. Örnek:

Dim Dizin1(10) as Integer

Burada gördüğünüz gibi değişkenin kaç tane değer tutabileceğini rakam olarak parantez arasına yazıyoruz. Bu tarz adet girerek yapılan tanımlamalara sabit boyutlu dizi deniyor. Burada bir başka önemli husus dizi değişkeninin 0’dan itibaren tutulması. Yani siz 10 değerini girerseniz 0. değişken dahil toplamda 11 adet değişkeni hafızada tutabilirsiniz.

Değişkeni tanımladıktan sonra nasıl değer atar veya okuruz? Bunu da yine parantez kullanarak yapıyoruz:

Dizi1(0)=10
Dizi1(1)=5

gibi. Burada belirtmek gerek bu dizi tek boyutlu bir dizi. Yani sadece tek bir sıra halinde değişken tutabilir.

Değişkenin alt sınırını istediğiniz gibi ayarlayabileceğiniz bir başka tanımlama şekli ise:

Dim Dizi2(-10 to 10) as Integer
Dizi2(-10)= 5
Dizi2(-9) = 10

Gördüğünüz gibi burada dizinin alt sınırı -10. elemandan başladı. -10’da +10’a kadar, 0. eleman dahil toplamda 21 değeri hafızada tutabilirsiniz.

Bunun haricinde çok boyutlu diziler de tanımlayabilirsiniz, matrisler gibi:

Dim Dizi3(10,10) as Integer
Dizi3(0,0) = 1
Dizi3(0,1) = 2

Gördüğünüz gibi burada her bir sıra iki elemandan oluşuyor. İsterseniz daha fazla boyutlu diziler de tanımlayabilirsiniz. Ancak şunu unutmayın dizi boyutu arttıkça, siz değer atamasanız bile, hafızada kaplayacağı yer de o kadar artacaktır.

Çok boyutlu dizilerde de alt sınırı istediğiniz gibi tanımlamanız mümkündür:

Dim Dizi4(-10 to 10, -20 to 20, -30 to 30) as Integer
Dizi4(-10,-20,-30) = -3000
Dizi4(-9,-19,-29)= -2000

Bu tarz sabit boyutlu dizi tanımlamalarda program işleyişi esnasında boyutlarını değiştirmek biraz zahmetli bir iş. Ve tabii eğer dizinin boyutunu aşan bir atama yaparsanız programınız “Run time error 9: Sub string out of range” hatası verecektir.

b. Değişken Boyutlu Dizi

Bazı durumlarda dizin boyutunu programın başında belirlemeniz pek mümkün değildir. Örnek olarak sürekli veri eklenen bir sayfada satırlardaki değerleri dizide tuttuğunuzu varsayalım. Bu durumda program her çalıştığında Excel’de veri girilmiş satır sayısı devamlı değişiyor olabilir. Siz oldukça büyük bir dizi tanımlayabilirsiniz ancak bu durumda hafızada da her zaman bu kadar bir yer ayrılır ve satır sayısı tanımladığınız dizi boyutunu aştığı anda da program hata verir. Bu gibi durumlarda boyutu değişken olan diziler kullanabilirsiniz. Tanımlaması:

Dim Dizi1() as integer

şeklide yapılır. Gördüğünüz gibi burada dizinin sahip olduğu eleman sayısını girmiyoruz. Bu tarz diziler ilk tanımlandıklarında hiç bir elemana sahip değillerdir. Yani bu diziye Dizi1(0) = 10 gibi bir değer atayamazsınız. Önce diziyi çalışma esnasında boyutlandırmanız gerekir. Bunu ise REDIM komutu ile yapıyoruz:

Dim Dizin1() as integer
ReDim Dizi1(0)
Dizi1(0) = 10

Bu kod artık hata vermeyecektir. ReDim komutu ile siz program çalışırken dizinin boyutunu istediğiniz gibi arttırabilirsiniz. Hatta çok boyutlu dizileri de yine değişken şekilde tanımlayabilirsiniz:

Dim Dizi1() as Integer
Redim Dizi1(10,10)
Redim Dizi1(100,100)

ReDim komutunun ikinci kısıtlaması ise dizinin ilk tanımlanmış değişken türünü değiştirmenize izin vermemesidir. Yani:

Dim Dizi1() as Integer
ReDim Dizin1(10) as String

gibi bir kod yazarsanız program dizinin veri türünü değiştiremeyeceğini belirten bir hata gösterecektir. Tabii ReDim ile sabit boyutlu dizilerin boyutunu değiştiremezsiniz.

c. Preserve Anahtar Kelimesi

ReDim komutunun çalışma mantığı nedeni ile ortaya çıkan en büyük sıkıntı ise diziye daha önce atanmış değerlerin silinmesidir. Bunun nedeni ReDim komutunun aslında her kullanıldığında değişkeni yeniden oluşturmasıdır. Yani değişkeni ve bu değişkenin içindeki tüm değerleri önce hafızadan siler, sonra tekrar yeni girdiğiniz boyuta göre sıfırdan hafızada alan oluşturur. Örnek olarak:

Sub Main()

Dim Dizi1() As Integer
ReDim Dizi1(0)
Dizi1(0) = 20
Debug.Print Dizi1(0)
ReDim Dizi1(1)
Debug.Print Dizi1(0)

End Sub

programı çıktı olarak 20 ve 0 değerlerini verecektir çünkü ikinci ReDim ifadesinden sonra Dizi1 dizisi hafızadan silinmiş ve tekrar oluşturulmuş olduğundan önceden atanan değer kaybolmuş olacaktır. Bunu engellemek için Preserve anahtar kelimesi kullanılır. Yukarıdaki kodu aşağıdaki şekilde yazdığımızda:

Sub Main()

Dim Dizi1() As Integer
ReDim Dizi1(0)
Dizi1(0) = 20
Debug.Print Dizi1(0)
ReDim Preserve Dizi1(1)
Debug.Print Dizi1(0)

End Sub

Program 20 ve 20 değerini çıktı olarak verecektir. Burada Preserve anahtar kelimesi derleyicinin önceden atanmış değerleri korumasını sağlamış oldu.

Tabii ReDim gibi Preserve anahtar kelimesinin de iki kısıtlamaları var. Preserve ile değer atanmış bir dizinin alt sınırını değiştiremezsiniz:

Dim Dizi1() As Integer
ReDim Dizi1(10)
ReDim Preserve Dizi1(20 To 100)

kodu hata verecektir. Ki zaten bir yandan değerlerin korunmasını istemek diğer yandan komut ile alt sınırı yükselterek değerlerin hafızadan silinmesine zorlamak kendi içerisinde tutarsız. Son olarak Preserve anahtar kelimesini kullandığınızda çok boyutlu bir dizinin son elemanını değiştirmenize izin verilir. Örnek olarak:

Dim Dizi1() As Integer
ReDim Dizi1(10, 10)
ReDim Preserve Dizi1(10, 100)

kodu hata vermez çünkü siz programa daha önce oluşturmuş olduğunuz değişkeni tamamen silerek yeni ve farklı boyutta bir dizi değişkeni oluşturmasını söylemiş oldunuz. Ancak 

Dim Dizin1() As Integer
ReDim Dizi1(10, 10)
ReDim Preserve Dizi1(101, 100)

kodunu çalıştırdığınızda hata alırsınız. Çünkü Preserve anahtar kelimesi dizinin ilk boyutunu değiştiremez. Bunu aşmanın bazı yolları var tabii ancak bu biraz programlama istiyor.

3. Dizi Sınırlarını Bulma

Dizileri program içinde özellikle döngüler ile kullanmak çok büyük kolaylık sağlar. Ancak burada karşımıza hataya yol açabilecek bir ihtimal çıkıyor. O da döngüde sabit değerler kullanmak. Örnek olarak siz sabit veya değişken bir dizi tanımladınız ve bu değişkenin değerlerini bir döngü ile tarıyorsunuz. Ancak programın ilerleyen aşamalarında ilk tanımladığınız dizi boyutunun yetersiz olduğunu ve daha farklı alt ve üst sınır olan bir dizi kullanmanız gerekliliği ortaya çıktı. Bu durumda döngüdeki sınırlarınızı değiştirmeyi unutursanız programınız hata verecektir. Bu durumda dizin alt ve üst sınırını program içinde otomatik olarak okutmak size kodunuzu sürekli düzeltme zorunluluğundan kurtaracaktır. Bunun için iki komut var:

LBound(Dizin_Değişkeni, [Boyut_No])
UBound(Dizin_Değişkeni, [Boyut_No])

Bu komutlar sırası ile girmiş olduğunuz dizi değişkeninin alt ve üst sınırlarını veriyor. Dikkat ederseniz Boyut_No adlı isteğe bağlı bir değer daha istiyor. Bu değer çok boyutlu dizilerde hangi boyutun sınırlarını istiyorsak onun numarasıdır. Eğer bu değer girilmez ise otomatik olarak 1 değerini alır. Tek boyutlu dizilerde girilmesine gerek yoktur. Örnek olarak:

Sub Main()

Dim Dizi1() as Integer
ReDim Dizi1(10 to 1o0, 20 to 200)
Debug.Print Lbound(Dizi1)
Debug.Print Ubound(Dizi1)
Debug.Print Lbound(Dizi1,2)
Debug.Print Ubound(Dizi1,2)

End Sub

programını çalıştırdığınızda sırası ile 10, 100, 20, 200 değerlerini çıktı olarak verecektir. Burada ilk LBound ve UBound satırını LBound(Dizi1,1) ve UBound(Dizi1,1) şeklinde de yazabilirsiniz, değişen bir şey olmayacaktır.

4. Değişken Diziler

Daha önce variant değişkenlerden bahsetmiştim. Kısaca her türlü değeri barındırabilen değişkenler idi. Ben variant değişken tutabilen dizileri 2 farklı amaç ile kullanıyorum. İlk amaç metin, tam sayı, tarih gibi farklı değişken türlerini tek bir dizi içinde tutmak ve daha karmaşık olarak değişken boyutlu olan ve farklı değerler barındıran dizileri başka bir ana dizide tutmak için. Çünkü variant değişkeni bir dizi de olabilir. İkinci kullanım programlamaya yeni başlayanlar için biraz karmaşık ve yazıyı uzatmamak adına burada bunu anlatmayacağım ancak ilk kullanım için bir örnek vermekte fayda var.

Şimdi Personel bilgileri gibi bir sıra bilgiyi bir dizide tutmak istediğimizi varsayalım ki bence güzel bir programlama örneği değil. Bu durumda tek bir değişken türüne sahip dizi işimize yaramaz. Çünkü isim, soy isim gibi bilgiler metin iken yaş, sicil gibi bilgiler tam sayı olabilir, işe giriş tarihi ise tarih türündedir ve hatta yıl içinde aldığı ikramiyeler bir dizi olabilir. Şimdi isterseniz bir değişken dizi tanımlayalım:

Dim Personel(5) as variant
Dim Ikramiye(4) as double
Personel(0) = “Metin”
Personel(1) = “Demirci”
Personel(2) = 35
Personel(3) = 100245 ‘Sicil
Personel(4) = #10/25/2012#
Personel(5) = Ikramiye

Bu şekilde dizinin farklı elemanlarına farklı tipte değişkenler atayabilirsiniz. Programınız hata vermeden çalışacaktır. Hatta dikkat ederseniz son eleman bir dizi barındırıyor. Bu tarz kullanım VBA ile mümkün olsa da bazı programlama sıkıntılarını da beraber getirir.

1. Variant türü hafızada en fazla yer barındıran değişken türüdür. Bu nedenle bu tarz değişkenler hafızayı verimli kullanmayacaktır. Özellikle birden fazla personelin bilgilerini tutmak istiyorsanız oldukça fazla bellek harcayacaksınız demektir.

2. Dizinin hangi elemanının hangi bilgiyi barındırdığını yazdığınız kodu incelemeden bilemezsiniz. Ki açıklama dahi kullansanız ileride programa yapacağınız eklemeler olduğunda neyin nerede olduğu bulmak için zaman kaybedersiniz

3. Kodunuz anlaşılabilir olmaktan çıkar.

4. Son eleman olan dizi elemanının içindeki alt elemanlara erişiminiz kısıtlıdır. Bunun için biraz karmaşık ve çok ta sağlam olmayan kod yazmanız gerekir.

5. Eğer birden fazla elemanın bilgilerini bir dizi halinde tutuyor iseniz aradığınız elemanı bulmak için tüm diziyi taramanız gereklidir. Bu da büyük dizilerde çok zaman alacaktır. 

Bu kısıtlamaları dizi kullanarak çözmek zor, ancak başka programlama yöntemleri kullanarak çözebilirsiniz. Sonraki yazılarda teker teker bunları anlatacağım ancak şimdiden bir ön hazırlık yapayım istedim. Hem de yazıyı burada bitireyim artık. Zaten yeterince uzun bir yazı oldu. Umarım faydalı olmuştur.

İlginizi Çekebilecek Diğer Yazılar
Etiketler: ,

Leave a Reply