1. Dizin 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üçlendirir. Aynı şey matrisler için de geçerlidir. Dizin değişkenleri işte bu soruna çözüm oluyor. Dizin değişkenleri birden fazla değeri hafızada tutmanızı sağlıyor.

2. Dizin Tanımlama
a. Sabit Boyutlu Dizin

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 dizin deniyor. Burada bir başka önemli husus dizin 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:

Dizin1(0)=10
Dizin1(1)=5

gibi. Burada belirtmek gerek bu dizin tek boyutlu bir dizin. 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 Dizin2(-10 to 10) as Integer
Dizin2(-10)= 5
Dizin2(-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 dizinler de tanımlayabilirsiniz, matrisler gibi:

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

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

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

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

Bu tarz sabit boyutlu dizin 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 dizinde 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 dizin 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 dizin boyutunu aştığı anda da program hata verir. Bu gibi durumlarda boyutu değişken olan dizinler kullanabilirsiniz. Tanımlaması:

Dim Dizin1() as integer

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

Dim Dizin1() as integer
ReDim Dizin1(0)
Dizin1(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 dizinleri de yine değişken şekilde tanımlayabilirsiniz:

Dim Dizin1() as Integer
Redim Dizin1(10,10)
Redim Dizin1(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 Dizin1() 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 dizinlerin 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 dizine 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 Dizin1() As Integer
ReDim Dizin1(0)
Dizin1(0) = 20
Debug.Print Dizin1(0)
ReDim Dizin1(1)
Debug.Print Dizin1(0)

End Sub

programı çıktı olarak 20 ve 0 değerlerini verecektir çünkü ikinci ReDim ifadesinden sonra Dizin1 dizini 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 Dizin1() As Integer
ReDim Dizin1(0)
Dizin1(0) = 20
Debug.Print Dizin1(0)
ReDim Preserve Dizin1(1)
Debug.Print Dizin1(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 Dizin1() As Integer
ReDim Dizin1(10)
ReDim Preserve Dizin1(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çersinde 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 Dizin1() As Integer
ReDim Dizin1(10, 10)
ReDim Preserve Dizin1(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 Dizin1(10, 10)
ReDim Preserve Dizin1(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. Dizin Sınırlarını Bulma

Dizinleri 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 dizin 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 dizin boyutunun yetersiz olduğunu ve daha farklı alt ve üst sınır olan bir dizin 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ş oluğunuz dizin 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 dizinlerde hangi boyutun sınırlarını istiyorsak o değerdir. 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 Dizin1() as Integer
ReDim Dizin1(10 to 1o0, 20 to 200)
Debug.Print Lbound(Dizin1)
Debug.Print Ubound(Dizin1)
Debug.Print Lbound(Dizin1,2)
Debug.Print Ubound(Dizin1,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(Dizin1,1) ve UBound(Dizin1,1) şeklinde de yazabilirsiniz, değişen bir şey olmayacaktır.

4. Değişken Dizinler

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 dizinleri 2 farklı amaç ile kullanıyorum. İlk amaç metin, tam sayı, tarih gibi farklı değişken türlerini tek bir dizin içinde tutmak ve daha karmaşık olarak değişken boyutlu olan ve farklı değerler barındıran dizinleri başka bir ana dizinde tutmak için. Çünkü variant değişkeni bir dizin 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 dizinde 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 dizin 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 dizin 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 dizin 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 eklemelerde olduğunda neyin nerede olduğu bulmak için zaman kaybedersiniz

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

4. Son eleman olan dizin 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 dizin halinde tutuyor iseniz aradığınız elemanı bulmak için tüm dizini taramanız gereklidir. Bu da büyük dizinlerde çok zaman alacaktır. 

Bu kısıtlamaları dizin 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