1. Değişken Nedir

Programlamanın mantığını anlamak için değişkenlerin mantığına hakim olmak çok önemlidir. Bilgisayarlar bir çok değeri, metin veya rakam olması farketmeksizin, hafızada tutarlar. Programlama açısından değişken, kullanmak istediğiniz değerin hafızada tutulabilmesi için yer açma işlemi olarak tanımlanabilir. Eğer siz değişken için hafızada yer ayırmazsanız bu değer okunduktan sonra silinecek ve bir daha kullanılamayacaktır. Farklı bir ifade ile siz program içinde belli bir değeri farklı aşamalarda kullanmak istiyorsanız bu değeri bir değişkene atamanız gerekmektedir.

VBA’da değişken tanımlama için isim = değer gibi bir atama yapabilirsiniz. Bu durumda VBA sizin için o isimde bir değişken tanımlar ve içine de verdiğiniz değeri atar. Bu tanımlama şekli belirsiz (implicit) tanımlama olarak adlandırılır ve kod yazma açısından incelediğimizde verimli bir yöntem değildi. Sebeplerine gelince: 

a.  Daha sonra kodunuzu tekrar incelediğinizde veya bir başkası sizin kodunuza eklemeler yapmak istediğinde kodunuz anlaşılamaz.

b. Eğer değişken türünü tanımlamazsanız sistem hafızada en büyük değişkeni tutabilecek miktarda bir hafıza ayarlayacaktır. Bu da çok fazla değişken kullanmanız durumunda VBA’ya ayrılmış sistem hafızasını tüketerek programın hafıza hatası vermesine sebep olabilecektir.

c. Bu tarz değişkenlere ne zaman bir değer atasanız VBA arka planda bir değişken değiştirme işlemi gerçekleştirir. Bu da arka planda çalışan kod nedeni ile uygulamanın performansını düşürecektir.

Peki biz VBA’da değişkeni nasıl tanımlarız. VBA’da ve VB’de değişken tanımlama DIM kelimesi ile yapılır. Yazılımı:

DIM Değişken_Adı [as Değişken Turu]

şeklindedir. Bu yazımda değişken türü tanımlamak şart değildir. Değişken türü tanımlamadan yapılan tanımlamalar daha önce anlattığım belirsiz tanımlamadır. Eğer değişken türünü tanımlarsanız bu belirli (explicit) bir tanımlama olur ve değişken sadece bu türde değerler barındırabilir.

Siz bu değişken türünde bir atama yapmazsanız (misal tam sayı değişkenine kayar noktalı değer atamak) diğer dillerden farklı olarak VBA sizin için arkada bir değişken dönüştürme işlemi yapacaktır. Tabii her değer her değişkene dönüşemeyebilir. Bu durumda bir hata mesajı alırsınız.

VBA’da, Visual Basic 20xx’den farklı olarak aynı satırda tanımlama ve atama yapamazsınız. Yani: 

DIM Değişken_Adı [as Değişken Türü] = Deger

şeklinde bir tanımlama hataya sebep olur. Bunun yerine atama farklı bir satırda yapılmalıdır:

DIM Değişken_Adı [as Değişken Türü]

Değişken_Adı = Değer

C ve türevlerinde (C, C++, C#, Java) değişken tanımlama ile kıyaslandığında burada ters bir yazım var. Bu dillerde önce değişken türü sonra değişken adı yazılır ve sonrasında ; ile satırı bitirirsiniz.

2. Genel Yazım Kuralları

İkinci olarak VBA değişken tanımlamalarında, C gibi dillerden farklı olarak, büyük küçük harf ayrımı yoktur. Misal siz A diye bir değişken tanımladınız. Daha sonra aynı yerde a diye bir değişken tanımlamanıza izin verilmez. Zaten yazarken ilk A değişkeni a olarak değiştirilir ve program çalıştırıldığında “Dublicate declaration in current scope” hatası alırsınız.

Bunların haricinde değişkenlere isim verirken dikkat etmeniz gereken bir kaç kural var. Öncelikle bir değişken ismi 255 karakterden fazla olamaz. Zaten değişken isimlerini genelde kısaltma olarak yazdığımızdan bu kısıtlama çok bir şey ifade etmiyor.

2. Olarak değişken isimlerinde nokta (Test.1 gibi) kullanılamaz. Bunun yerine alt çizgi (Test_1 gibi) kulanılmalıdır

Değişkenlerin isimleri bir rakam ile başlayamaz. 1_Test, 1inciTest gibi ifadeler geçersizdir. Ve değişken ismi olarak kullanmanıza izin verilmez

Değişken isimlerinde boşluk olamaz. Test 1 gibi bir değişken tanımlayamazsınız.

Bunun haricinde bazı kelimeler VB tarafından farklı amaçla kullanılmak için ayrıldığından bu isme sahip bir değişken tanımladığınızda VB uyarı verecektir.

Yine temiz bir kod yazma kuralı olarak değişken isimlerin başına değişken türü kısaltma olarak yazılır ise daha sonra o değişkenin ne tür bir veri tuttuğunu, değişkenin adına bakarak anlayabilirsiniz. Bu da kodun anlaşılabilirliğini büyük oranda arttırır.

Yazılan kodun anlaşılırlığını arttırmak üzere bazı kaynaklarda _ yerine büyük küçük harf ile ayrım yapılmasının daha iyi olduğu söyleniyor. Örnek olarak Musteri_Tablosu yerine MusteriTablosu kullanmak anlaşılırlık olarak aynı sonucu vermesine rağmen daha kısa bir yazım elde etmiş oluyoruz.

VBA’da küçük büyük harf ayrımı olmadığını söylemiştim. Bu sayede bir değişken adında büyük ve küçük harf kullanılması daha önce tanımlanmamış bir değişkenin kullanılıyor olmasını kontrol etmek için size kolaylık sağlar. Örnek olarak inTest değişkeni tanımladığınızı düşünelim. Siz kodun herhangi yerinde bu değişkeni kullanmak istediğinizde intest yazsanız dahi düzenleyici bu yazımı otomatik olarak inTest haline getirecektir.

3. VBA'da Değişken Türleri
3.a. Boolean Değişkeni

İlk değişken türümüz Boolean türü. Bu değişken 2 byte yani 16 bitlik bir alan kaplar. Ancak sahip olabileceği değer sadece TRUE (doğru) veya FALSE (yanlış) olabilir. Bunu yaparken de tüm 16 bitleri 0 ve bunun tersi tüm bitleri 1 olan (10’luk sayı sisteminde -1) bir değer oluşturur. Bu nedenle eğer bu değişkenin türünü bir tamsayı veya çit duyarlıklı kayan noktalı (double) değişkene çevirirsek TRUE değerler -1, FALSE değerler 0 olarak dönecektir. Eğer tam tersi bir dönüşüm yaparsak 0 olan değerler FALSE, geri kalan tüm değerler TRUE olacaktır. İsterseniz tanımlama ve değer atama kısımlarını VBA altında nasıl yazıldığına da bakalım.

Sub Main()

    DIM blnTest as Boolean
    blnTest = TRUE
    Debug.Print(blntest) ‘Immediate penceresine değişkenin değerini yazar
    blnTest = FALSE
    Debug.Print(blnTest)

End Sub

Bu kodu VBA altında yazar çalıştırırsanız Immediate penceresinde aşağıdaki gibi bir görüntü oluşur

   TRUE
   FALSE

3.b Integer Değişkeni

Integer değişkeni sadece tam sayı değerlerini tutmak için kullanılan bir değişkendir. Hafızada 2 byte, 16 bit alan kaplar. Bu 16 bitin bir biti rakamın + veya – olduğu bilgisi için ayrılmıştır. Geri kalan bitler ile en fazla 215 kadar bir değeri tutabilirsiniz. Bu da +32.768 ve -32.768 arası bir rakamı ifade eder. Eğer integer ile tanımladığınız değişkene bu sayıdan büyük bir değer atamaya kalkarsanız memory overflow hatası alırsınız.

Sub Main()

    Dim intTest As Integer
    intTest = 100
    Debug.Print intTest
    intTest = -13.562
    Debug.Print intTest
    intTest = 50000
    Debug.Print intTest

End Sub

Bu kodu yazıp çalıştırdığınızda önce Immediate penceresinde aşağıdaki rakamlar yazar:

100
-14

sonra intTest = 50000 satırında (50000>32768) overflow hatası alırsınız. Dikkat ederseniz Immediate penceresinde 2. satırda -13,562 yerine -14 yazılacaktır. Bunun nedeni tanımladığımız intTest  tam sayı  değeri tutabileceğinden -13,562 rakamının en yakın tam sayıya yuvarlanmasıdır.

3.c. Byte Değişkeni

Adından da anlaşılabileceği gibi 1 byte, 8 bit hafıza alanı kaplayan bir değişkendir. Bu değişken sadece pozitif değerlere sahip olabilir ve 28 kadar rakamı yani 0-255 arası rakamları tutabilir. Genelde ASCII karakter kodllarını tutmak için kullanılır. 

3.d. Date Değişkeni

Bu değişken sadece tarih ve saat değerlerini tutmak için kullanılır. Atamanın düzenleyici tarafından  tarih saat bilgisi olarak algılanabilmesi için başına ve sonuna # karakteri konmalıdır. Tarih biçimi Ay/Gün/Yıl saat ise arada boşluk olacak şekilde SS:DD:ss şeklinde yazılmalıdır. Özellikle tarih yazmada yazdığım kurala çok dikkat edin. VBA bazı durumlarda sizin girdiğiniz hatalı girişi düzeltecektir ancak ay ve gün 12’den küçük ise yapabileceği çok bir şey yok. Örnek olarak siz 12. ayın 10. gününü girdiğinizi düşünürken VBA bunu 10. ayın 12. günü olarak algılayabilir.

Eğer bu değişkene kayar noktalı bir değişken atarsanız sayının noktadan önceki kısmı tarih, noktadan sonraki kısmı saat olarak ele alınır. Ancak ne yaptığınızı tam olarak bilmiyorsanız elde edeceğiniz sonucun istediğiniz sonuç olma ihtimali de bayağı bir düşük.

Sub Main()

Dim dtTarih as date
dtTarih = #10/25/2019 12:30 PM#
Debug.Print dtTarih
dtTarih = DateValue(Date) ‘Tarih saat bilgisinin tarih kısmını al
Debug.Print dtTarih
dtTarih = TimeValue(Date) ‘Tarih saat bilgisinin saat kısmını al

End Sub

Bu kodu yazıp çalıştırdığınızda Immediate penceresinde sırası ile aşağıdaki değerler gösterilir.

31.01.2020 12:30:00
15.04.2019
00:00:00

3.e. Double Değişkeni

Double değişkeni çift duyarlıklı kayar nokta değişkenidir. Hafızada 2 tane 32 bit yani 8 bayt kadar bir alan kullanır. Bu değer bir değişkenin kullanabileceği en büyük alanı ifade ediyor. Bu nedenle bu değişkene -1.79769313486231E308’den -4.94065645841247E-324’e kadar olan negatif sayı ve 4.94065645841247E-324’den 1.79769313486232E308’e kadar olan pozitif sayı değerlerini, tam sayı veya kayar noktalı olarak atayabilirsiniz.

Bu değişken gördüğünüz üzere tam sayı değişkeninin sahip olduğu aralıktan çok daha fazla bir aralığı depolayabiliyor.

Sub Main()

Dim dblTest As Double
dblTest = 123456789123456789.123456789123456789
Debug.Print dblTest
dblTest = -123456789.1235
Debug.Print
dblTest = 450000
Debug.Print dblTest

End Sub

Bu kodu yazdığınızda ilk göreceğiniz şey 2. satırdaki rakamın 1.23456789123457E+17 olarak değiştirilmesi. E harfi üstel (exponantial) anlamına gelir.

Bu kodu çalıştırdığınızda ise Immediate penceresinde aşağıdaki rakamlar yazar:

 1,23456789123457E+17
-123456789,1235
450000

Burada dikkat ederseniz tam sayı değişkenine atayabileceğimiz en büyük değer olan -32.768 rakamından daha büyük 450.000 rakamını tutabiliyoruz..

3.f. Long Değişkeni

Bu değişken türü sadece tam sayı değerleri tutabilir ve hafızada integer değişkeninin kapladığı alanın iki katıdır, yani 32 bit bir alan kaplar. Bir bit +/- işaretini tutacağından 231 kadar bir değeri yani -2,147,483,648’den 2,147,483,647’a kadar olan değişkenleri tutabileceği anlamına geliyor. Geri kalan her açıdan integer değişkene benzer.

3.g. LongLong Değişkeni

±LongLong değişkeni VBA 7.0 ile geldi. Ve sadece 64 bit sistemlerde kullanılabilir. Hafızada 2 tane Long değişkeninin kapladığı alan kadar yani 2*32bit, 64bit alan kaplar. Bu da 263 kadar bir rakamı yani -9,223,372,036,854,775,808’dan 9,223,372,036,854,775,807’ye kadar rakamları içerir. Geri kalan açılardan Long ve Integer değişkenleri ile aynıdır.

3.h. Single Değişkeni

Bu değişken double değişkenine benzer yapıdadır ancak hafızada onun yarısı kadar bir alan kaplar. Bu da 32bit, 4byte alan anlamına gelir. Bu nedenle tutabileceği rakam da double değişkeninden daha düşüktür. Bu da -1.79769313486231E308’den -4.94065645841247E-324’e kadar olan negatif sayılar ile 4.94065645841247E-324’ten 1.79769313486232E308’e kadar olan pozitif sayıları tutabileceğin anlamına gelir. Diğer açılardan double ile aynı özelliklere sahiptir.

3.ı. String Değişkeni

Metinleri tutmak için kullanılan bir değişkendir. Sabit ve değişken aralıklı olmak üzere iki türde kullanılabilir.

Dim strTest1 as string * 32
Dim strTest2 as string

Bu tanımlamalardan ilki 32 karakterden oluşan bir metini ifade ederken ikincisi yaklaşık 2 milyon karakteri hafızada tutabilir. Her bir karakter aslında ASCII kodlarından oluşur. Atama yapılırken metin çift tırnak ile başlar ve biter:

strTest2=”Bu bir test metnidir”

Aşağıdaki kodu yazıp çalıştırırın:

Sub Main()

Dim strTest As String * 3
Debug.Print “Değişken uzunluğu: ” & Len(strTest) & ” harf [” & strTest & “]”
strTest = “a”
Debug.Print “Değişken uzunluğu: ” & Len(strTest) & ” harf [” & strTest & “]”
strTest = “abcdefghijklmnopqrstuvwxyz”
Debug.Print “Değişken uzunluğu: ” & Len(strTest) & ” harf [” & strTest & “]”

End Sub

Immediate penceresinde aşağıdaki ifadeler gözükecektir.

Değişken uzunluğu: 3 harf [ ]
Değişken uzunluğu: 3 harf [a ]
Değişken uzunluğu: 3 harf [abc]

Dikkat ederseniz 5. satırda değişkene atadığımız değer 3 karakter sınırından fazla olmasına rağmen değişken ilk üç harfi alabildi.

Bir başka husus ta boşluk ve özel karakterlerin de metin içinde yer alabilmesidir. Örnek olarak Chr(10) enter tuşu gibi çalışarak metni birden fazla satıra bölmek için kullanılabilir.

strTest=”Bu ilk satır” &chr(10) &”Bu da ikinci satır”

ifadesinin çıktısı:

Bu ilk satır
Bu da ikinci satır

olacaktır.

3.i. Variant Değişken

Bu değişken türü yanar döner bir değişken türüdür. Nasıl diyeceksiniz, bu değişken türüne hangi değeri atarsanız o değere en uygun değişken türüne evrilecektir. Örnek olarak:

Dim varTest as variable
varTest=9875

tanımlaması yaparsanız bu değişken “var/integer” olacaktır. Aynı şekilde bu değişkene bir metin atarsanız bu sefer “var/string” olarak değişir.

Program içinde bu değişkene atanan değer üzerinde çarpma/bölge gibi işlemler uygular ve değer kayar noktalı olacak şekilde değişime uğratırsanız değişken de single veya double olarak değişecektir.

Şahsen bu tarz değişkenlerin kullanılmasını pek tavsiye etmiyorum ancak bazı durumlarda kullanmak zorunda kalabiliyorsunuz. Değişken uzunluklu dizin barındıran dizin değişkenleri misal. Yeri gelince bahsedeceğim.

3.j. Object Değişkeni

Bu değişken türü genel nesneleri tutmak için kullanılır. Nesnelere daha sonra detaylı olarak değineceğim ancak örnek olarak bir çalışma sayfası nesne değişkenine örnektir. Burada en önemli konu bu tarz değişkenlere Set kelimesi ile değer atanmasıdır.

Genelde bu tarz nesneler kendi adları ile tanımlanır. Örnek olarak:

Dim Sayfa as worksheet
Set Sayfa= Worksheets(1)

Bu sayede VBA bu nesnenin hangi tür bir nesne olduğunu bilir ve kod yazarken bu nesnenin değişkenlerini tanımlarken otomatik doldurma imkanından faydalanmanızı sağlar. Kod yazarken size çok yardımcı olan bir özelliktir.

Bu değişkeni aşağıdaki şekilde de tanımlayabilirsiniz:

Dim Sayfa as object
Sayfa=Worksheets(1)

Ancak bu durumda VBA değişkenin hangi nesne türünü barındıracağını bilmez. Bu da kod yazarken otomatik doldurma özelliğinden faydalanamayacağınız anlamına gelir. Tabii kodun anlaşılırlığını da oldukça düşürecektir.

Aslında bu değişken variable değişkeninin nesneler için olan türüdür diyebiliriz. Zorunda kalmadıkça kullanmanızı tavsiye etmem.

Otomatik doldurma nedir diye soracak olursanız nesneler hakkında kısa bir bilgi vermek gerekiyor. Bir nesne yerel değişken ve yordamlardan oluşur ve siz bunlara NesneAdi.DeğişkenAdi ve NesneAdi.YordamAdi(…) şekliden erişebilirsiniz. Eğer nesneniz ilk başta kendi adı ile tanımlandı ise siz . yazdıktan sonra nesne içinde tanımlı olan tüm değişkenler ve yordamlar bir küçük kutu içinde gösterilir. Siz kullanmak istediğinizi seçerek TAB tuşuna basıp hızlıca bunu kullanabilirsiniz.

4. Değişken Dönüştürme

Visual Basic ve diğer programlama dilleri değişkenleri birbirine dönüştürmenize izin verirler. VB’de bu işlem otomatik olarak gerçekleştirilebilir. Misal siz bir integer değişkenini double olarak değiştirmek isteyebilirsiniz, ya da tam tersi. Bu durumda değişken ataması esnasında VBA bunu otomatik olarak sizin yerinize yapacaktır. Ancak kodun daha anlaşılabilir olmasını sağlamak ve diğer dillere daha fazla uyum için VBA altında değişken dönüştürme işlevleri tanımlanmıştır. Sırası ile:

CBool
CByte
CCur
CDate
CDbl
CDec
CInt
CLng
CLngLng (64bit sistemler)
CSng
CStr
CVar

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

Leave a Reply