Değişkenler

D

VBA|Seviye|Temel

VBA-makro ile programlama yapabilmek için kullanıcı tarafından çeşitli değişkenlerin tanımlanması gerekir. Ancak tanımlanan bu değişkenler metin, tam sayı, ondalık sayı, mantıksal önerme, nesne vb. kullanıcının ihtiyaç duyabileceği herhangi bir tipte olabilir. Bunlardan en yaygın kullanılan numerik değişken tipleri aşağıda listelenmiştir.

TipBoyutAlabileceği Değer Aralığı
Integer2 bit-32.768 ile 32.767 arası
Long4 bit-2.147.483.648 ile 2.147.483.648 arası
Double8 bitLong tipine ilave olarak pozitif/negatif ondalık sayılar (Çok geniş bir aralığı var)

En yaygın numerik olmayan değişken tipleri de aşağıda listelenmiştir.

TipBoyutAlabileceği Değer Aralığı
String1 ile 65.400 karakter
Boolean2 bitTrue veya False
Date8 bit
Object4 bit
Variant16 bitString, Integer, Long, Double herhangi bir değeri taşıyabilir.

Değişkenlerin boyutları ve alabileceği değerler hakkında daha fazla bilgi için guru99.com ve tutorialspoint.com bağlantılarını inceleyebilirsiniz.

1.  Integer-Tam Sayı Değişkeni

Tam sayı bir değişken tanımlamak için Integer değişken tipinden yararlanılır. Değişkenler, aşağıdaki gibi Dim … As Integer şeklinde deklarasyonu yapıldıktan sonra kullanılır.

Private Sub CommandButton1_Click()
Dim x As Integer, y As Integer, z As Integer

x = -5
y = 12
z = -32000

Range("A1").Value = x
Range("A2").Value = y
Range("A3").Value = z

End Sub

Integer tipinde tanımlanmış bir değişken -32.768 ile 32.767 dışında bir değer alacak olursa aşağıdaki hata ile karşılaşılır.

Private Sub CommandButton1_Click()
Dim x As Integer

x = 40000
Range("A1").Value = x

End Sub

Karşılaşılacak hata kodu ve metni:

Run-time error ‘6’:

Overflow

Yukarıdaki resimde görüntülenen hata mesajında Debug butonuna tıklanırsa, hatanın oluştuğu satıra yönlendirilirsiniz.

Debug sonrasında sorunun x=40000 satırında olduğuna ilişkin bir ipucu verir. x değişkeni bir Integer olarak deklare edildiği ve x’in aldığı değer Integer değişkenin alabileceği değer aralığı dışında olduğu için Overflow hatası verdi.

Debug hatasından sonra sayfada yer alan butona tıklarsanız, tıkladığınız buton herhangi bir tepki vermeyecektir. Çünkü derleyici durdurulduğu için hiçbir kod veya tetikleyici çalışmaz.  Bu yüzden yukarıdaki resimde belirtilen ikona tıklamak suretiyle derleyiciyi tekrar başlatmanız gerekir.

2.  Long-Tam Sayı Değişkeni

Yukarıda bahsedildiği gibi tam sayı bir değişkenin değeri Integer değişkenin taşıyabileceği değerin üzerinde ise Long tipinden yararlanılır.

Private Sub CommandButton1_Click()
Dim x As Long

x = 40000
Range("A1").Value = x

End Sub

x ve y değişkenleri Long tipinde deklare edildiği varsayımında, eğer x=3,2 gibi ondalıklı bir değişkene eşit ise sonucu 3,2 değil, 3 olarak aşağıya yuvarlayacak; y=3,5 (ve üzerinde) ise yukarı yuvarlayıp 4 olarak bir değer döndürecektir.

Private Sub CommandButton1_Click()
Dim x As Long, y As Long

x = 3.2
y = 3.5

Range("A1").Value = x
Range("A2").Value = y

End Sub

Not: VBA editöründe ondalık ifadeler virgül ile değil, nokta ile ifade edilir.

3.  Double-Rasyonel Sayı Değişkeni

Yukarıda bahsedildiği gibi bir değişken ondalıklı bir değere sahip ise herhangi bir yuvarlama olmadan gerçek değerini taşıması için Double tipinden yararlanılır.

Private Sub CommandButton1_Click()
Dim x As Double, y As Double

x = 3.243
y = 3.5

Range("A1").Value = x
Range("A2").Value = y

End Sub

Integer, Long, Double gibi numerik bir değişken tipine String (metin) tipinde bir değer atanırsa aşağıdaki hata ile karşılaşılır.

Private Sub CommandButton1_Click()
Dim x As Double, y As Double

x = ishakkutlu.com
y = 3.5

Range("A1").Value = x
Range("A2").Value = y

End Sub

Karşılaşılacak hata metni:

Compile error:

Variable not defined

Esasında yukarıdaki hata ishakkutlu.com ifadesini bir değişken olarak algılamasından kaynaklanmaktadır. Çünkü String ifadeler sayısal ifadeler gibi doğrudan değil, çift tırnak işareti içinde (“ishakkutlu.com” gibi) belirtilmelidir. Sayısal bir değişkene sayısal olmayan bir değişkenin (örneğin String bir değerin) atanması durumunda oluşacak hata simülasyonuna ilişkin kodlar aşağıdadır.

Private Sub CommandButton1_Click()
Dim x As Double, y As Double

x = "ishakkutlu.com"
y = 3.5

Range("A1").Value = x
Range("A2").Value = y

End Sub

Karşılaşılacak hata kodu ve metni:

Run-time error ‘13’:

Type mismatch

Debug butonuna tıklanırsa hatanın oluştuğu satıra gidilir.

x değişkeni Double tipinde deklare edilmesine rağmen, ishakkutlu.com gibi String bir değeri taşıması istendiği için söz konusu hatanın oluştuğunu anlıyoruz.

4.  String-Metin Değişkeni

Alfabetik veya sayısal karakterlerden oluşan değerlerin taşınması için çift tırnak içinde belirtilmek koşuluyla String tipinden yararlanılır.  Burada sayısal bir değer String tipinde taşınacak olursa, örneğin 3>2 gibi matematiksel bir önerme yapılamaz; o değişken sadece metin olarak taşınır. Metin olarak ifadesi 3’ün “üç”, 2’nin “iki” olarak taşınmasını temsil etmez.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "ishakkutlu.com"
y = "3.5"

Range("A1").Value = x
Range("A2").Value = y

End Sub

Yukarıdaki resimde A2 hücresine yazılan “3.5” String değişkeni, Excel’in hücre formatının özelliğinden dolayı otomatik olarak 3,5 değerine dönüştürülmüştür. Bu durum y değişkeninin “3.5” değerini String olarak taşıdığı gerçeğini değiştirmez. Bu ayrım VBA ile programlama yaparken yazılımı yapan kişiyi kolaylıkla tuzağa düşürebilecek çok önemli bir ayrımdır. Konuyla ilgili olarak, x ve y Double tipinde deklare edilen değişkenler olmak üzere aşağıdaki örnekten devam edebiliriz.

Private Sub CommandButton1_Click()
Dim x As Double, y As Double

x = 2.7
y = 3.5

MsgBox x + y

End Sub

Yukarıdaki işlemin sonucu x+y=6,2 olacaktır.

Ancak x ve y değişkenlerini Double tipinde değil de String tipinde deklare edersek, x+y=2.73.5 şeklinde bir değer elde edilir. x ve y değişkenleri String olarak deklare edildiği için bunların eşiti olan değerler de “” işaretleri içinde belirtilir.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "2.7"
y = "3.5"

MsgBox x + y

End Sub

Yukarıdaki resimde de görüldüğü gibi sonuç 6,2 değil, 2.7 ile 3.5 değerini yan yana getirilip bileştirilmesi olan 2.73.5 String değeri oldu.  Esasen String iki değişkenin “+” işareti ile toplanması, toplama işlemini değil, iki değişkeninin birleşiminde kullanılan “&” ifadesi anlamına gelir.

Private Sub CommandButton1_Click()
Dim x As String, y As String

x = "ishak"
y = "kutlu.com"

MsgBox x & y

End Sub

Yukarıdaki prosedürde MsgBox x & y ifadesi yerine MsgBox x + y ifadesi de kullanılabilirdi. Her ne kadar String değişkenlerin birleştirilmesi anlamında “+” ve “&” işaretleri aynı görevi yerine getirse de birden çok String değişkeninin birleştirilmesinde “+” işareti yerine “&” işaretinin tercih edildiğini belirtmekte yarar var.

Özetle String değişkenlerde 1+2=3 değil, 1+2=12 eder. Çünkü String değişken olarak deklare edilmiş bir değişkene sayısal bir değer atanması mümkün olmakla birlikte, String değişkene atanan sayının matematiksel özellikleri aktarılmaz ve String değişkene atanan sayısal bir değerin, “a, b, c” gibi görsel bir işaretten başka bir anlamı olmaz.

String değişkenine ilişkin daha fazla bilgi için “String -Metin Değişkeni isimli makaleyi inceleyebilirsiniz.

5.  Boolean Değişkeni

Boolean tipi değişken sadece True ya da False değerini alabilir.

Private Sub CommandButton1_Click()
Dim x As Boolean

If Range("A1").Value = "ishakkutlu.com" Then
    x = True
Else
    x = False
End If

MsgBox x

End Sub

6.  Date-Tarih Değişkeni

Tarih veya zaman değerlerinin taşınması için Date değişkeninden yararlanılır. Deklarasyonu ise Dim … As Date şeklinde yapılır.

Private Sub CommandButton1_Click()
Dim Tarih As Date

Tarih = Date

MsgBox Tarih, vbOKOnly, "ishakkutlu.com"

End Sub

Yukarıda örneklendiği gibi Date değişkenin kendisi bugünü gösterir.

Date değişkenine ilişkin daha fazla bilgi için “Date-Tarih Değişkeni” isimli makaleyi inceleyebilirsiniz.

7.  Object-Nesne Değişkeni

Nesneler (Object) VBA için birer köşe taşıdır. Workbook, Worksheet, Range vb. birer nesne değişkenidirler. Her nesnenin kendine özgü özellikleri ve metotları (kodları) vardır. Deklarasyonu Dim … As Object gibi  genel olarak yapılabileceği gibi Dim … As Workbook, Dim … As Worksheet, Dim … As Range vb. spesifik bir objeye özgü de yapılabilir. Object değişkenlerini bir değer atanırken diğer değişkenlerden farklı olarak başına “Set” ifadesi getirilir.

Private Sub CommandButton1_Click()
Dim MyRng As Range

Set MyRng = Range("A1") '.Value ifadesinin olmadığına dikkat edin.
MyRng.Value = "ishakkutlu.com"

'MyRng.Value ile Range("A1").Value aynıdır.
'Range("A1").Value = "ishakkutlu.com"

End Sub

Yukarıdaki örnekte ‘MyRng.Value ile Range(“A1”).Value aynıdır. O halde nesne tanımlamaya neden ihtiyaç duyalım? Nesneler, VBA ile verimli programlama yapabilmek için daha önce de belirtildiği gibi birer köşe taşıdır. Konu bütünlüğünün dağılmaması amacıyla şimdilik, neden nesne tanımlamaya ihtiyaç duyulduğuna ilişkin çok fazla örnek verilmeyecektir. Ancak ilerleyen bölümlerde nesne tanımlamaya oldukça sık başvurulacaktır. Nesne tanımlamaya neden ihtiyaç duyulacağına ilişkin basit bir örnek olması için aşağıdaki kodları inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim MyRng As Range, Hucreler As Range

Set Hucreler = Range("A1:D10")
For Each MyRng In Hucreler 'A1:D10 arasındaki hücreleri dolaş
    If MyRng.Value = "" Then 'A1:D10 arasında boş hücreleri bul
        MyRng.Interior.Color = RGB(132, 151, 176) 'Boş hücrye dolgu ekle
    Else
        'MyRng.Value değeri boş değilse hiçbir şey yapma
    End If
Next MyRng

End Sub

Yukarıdaki kodlar, Hucreler değişkenine atanan hücrelerin tek tek dolaşılarak, bunlardan içinde herhangi bir veri bulunmayan hücrelerin bulunmasını ve boş hücrelerin dolgu renklerinin değiştirilmesini ifade etmektedir. Dikkat edilirse Hucreler değişkeninin aksine, MyRng değişkeni için deklarasyon dışında herhangi bir tanımlama yapılmamıştır. Bu durumda MyRng nesnesi, Hucreler değişkenin sınırları (A1:D10) içinde kalmak koşuluyla geçici olarak bir hücreyi temsil edecek. MyRng nesnesinin yukarıdaki örnekte, (each-next döngüsü içinde) geçici olarak temsil ettiği bazı (boş) hücreler (aşağıdaki resimlde de görüldüğü üzere) A3, A6, A9, B3, B7, C2 vb. olarak örneklenebilir.

Nesneyi aşağıdaki örnekte gösterildiği gibi hatalı tanımlayalım ve CommandButton1 butonuna tıklayalım.

Private Sub CommandButton1_Click()
Dim MyRng As Range

MyRng = Range("A1") ‘Hatalı tanımlama

MyRng.Value = "ishakkutlu.com"

End Sub

Karşılaşılacak hata kodu ve metni:

Run-time error ’91’:

Object variable or With block variable not set

Debug butonuna tıklarsanız hatalı satıra yönlendirilirsiniz.

Oluşan hatanın sebebi, Set MyRng = Range(“A1”) şeklinde tanımlama yapılması gerekirken MyRng = Range(“A1”) şeklinde tanımlama yapılmasıdır. Yukarıdaki resimde de görüldüğü gibi sol üst köşede yer alan Stop ikonuna tıklayıp derleyiciyi resetleyip tanımlamayı Set MyRng = Range(“A1”) şeklinde düzeltebilirsiniz.

Eğer Set MyRng = Range(“A1”) ifadesinin önünde “.Value”  ifadesi varsa aşağıdaki gibi bir hata mesajı görüntülenir.

Karşılaşılacak hata kodu ve metni:

Run-time error ’424’:

Object required

Debug butonuna tıklarsanız hatalı satıra yönlendirilirsiniz.

Object değişkenlerinden Workbook ve Worksheet değişkenlerine ilişkin daha fazla bilgi için “Workbook ve Worksheet Nesneleri-1” ve “Workbook ve Worksheet Nesneleri-2” isimli makaleleri inceleyebilirsiniz.

Range değişkenine ilişkin daha fazla bilgi için “Range Nesnesi” isimli makaleyi inceleyebilirsiniz.

8.  Variant Değişkeni

Variant tipi bir değişken Integer, Long, String, Date, Boolean vb. herhangi bir değeri taşıyabilir. Konuyla ilgili olarak Variant tipi değişken kullanımı için aşağıdaki örneği inceleyebilirsiniz.

Private Sub CommandButton1_Click()
Dim Var As Variant

Set Var = Range("A1") 'Object değişken olarak
MsgBox Var.Value, vbOKOnly, "ishakkutlu.com"

Var = "ishakkutlu.com" 'String değişken olarak
MsgBox Var, vbOKOnly, "ishakkutlu.com"

Var = Format(1234567.89, "#,##0.00") 'Double değişken olarak
MsgBox Var, vbOKOnly, "ishakkutlu.com"

Var = True 'Boolean değişken olarak
MsgBox Var, vbOKOnly, "ishakkutlu.com"

'vbCancel, vbOk gibi butonların 0, 1 gibi değerleri olduğu için burada Integer değişken olarak kullanılıyor.
Var = MsgBox("Kullanıcının mesaj kutusunda yer alan hangi butona tıkladığını anlamak istiyoruz.", vbOKCancel + vbExclamation, "www.ishakkutlu.com")
If Var = vbCancel Then
    MsgBox "Kullanıcı bir önceki mesaj kutusunda İptal/Cancel butonuna tıkladı.", vbOKOnly, "www.ishakkutlu.com"
Else
    MsgBox "Kullanıcı bir önceki mesaj kutusunda İptal/Cancel butonunu dışında başka bir butona tıkladı.", vbOKOnly, "www.ishakkutlu.com"
End If

End Sub

9.  Global Değişken

Global değişken bir değişken tipi olmamakla birlikte, bir değişkenin kullanılabileceği prosedürlerin sınırlarını belirleyen bir özellik olarak nitelenebilir. Prosedürler belirli sayıda satır içerebildiğinden, özellikle büyük projelerde prosedürleri bölmeniz gerektiğinde global değişken çok kullanışlı bir yöntemdir.

Sayfa1 (Sheet1) içine aşağıdaki gibi bir prosedür tanımlayalım.

Sub OrnekProsedur1()
Dim myOutput As Integer, a As Integer, b As Integer

a = 3
b = 5
myOutput = a + b

MsgBox myOutput, vbOKOnly, "ishakkutlu.com"

End Sub

İmleç Sub OrnekProsedur1() ile End Sub arasında iken VBA editörünün araç çubuğunda yer alan Run ikonuna tıklayıp prosedürü çalıştıralım.

Sonuç beklendiği gibi aşağıdaki gibi olacaktır.

Şimdi OrnekProsedur1 isimli prosedürde yer alan MsgBox satırını yorum haline getirelim veya silelim. Ardından OrnekProsedur2 isimli aşağıdaki gibi bir prosedür tanımlayalım.

Sub OrnekProsedur2()
Dim myOutput As Integer

Call OrnekProsedur1 'OrnekProsedur1 çalıştırıldı.
MsgBox myOutput, vbOKOnly, "ishakkutlu.com"

End Sub

İmleç Sub OrnekProsedur2() ile End Sub arasında iken VBA editörünün araç çubuğunda yer alan Run ikonuna tıklayıp prosedürü çalıştırın. Sonuç 8 değil, aşağıdaki gibi 0 olacaktır. Doğru sonucu elde etmek için myOutput değişkeni global bir değişken olarak kullanılmalıdır.

Yapmaya çalıştığımız, OrnekProsedur2 isimli prosedürden OrnekProsedur1 isimli prosedürü çalıştırıp, OrnekProsedur1 isimli prosedürde elde edilen bir değişkenin değerini, OrnekProsedur2 isimli prosedürde kullanmaktır. Böylece yukarıdaki mesajın sonucu 0 değil, beklendiği gibi 8 olacaktır.

OrnekProsedur1 ve OrnekProsedur2 içinde yapılan myOutput değişkeninin deklarasyonları kaldırılır ve en üstte yer alan Option Explicit ifadesinin hemen altında konumlanacak şekilde Dim myOutput As Integer şeklinde deklarasyonu yapılır.

Sub OrnekProsedur1()
Dim a As Integer, b As Integer

a = 3
b = 5
myOutput = a + b

'MsgBox myOutput, vbOKOnly, "ishakkutlu.com"

End Sub
Sub OrnekProsedur2()

Call OrnekProsedur1 'OrnekProsedur1 çalıştırıldı.

MsgBox myOutput, vbOKOnly, "ishakkutlu.com"

End Sub

İmleç Sub OrnekProsedur2() ile End Sub arasında iken VBA editörünün araç çubuğunda yer alan Run ikonuna tıklayıp prosedürü çalıştırın. Sonuç aşağıdaki resimde gösterildiği gibi 8 olacaktır.

Option Explicit ifadesinin hemen altında konumlanacak şekilde Dim myOutput As Integer şeklinde deklarasyonu yapılan değişken Sayfa1 içinde yer alan tüm prosedürlerde kullanılabilir. Eğer OrnekProsedur1 isimli prosedür başka bir modülün içinden çalıştırılmak istenirse, ilgili modülün en üstünde yer alan Option Explicit ifadesinin altına, yukarıdakinden farklı olarak deklarasyonu Public myOutput As Integer şeklinde yapılır.

Böylece OrnekProsedur2 isimli prosedürden OrnekProsedur1 isimli prosedür çalıştırılıp, Module1 içinde yer alan OrnekProsedur1 isimli prosedürde elde edilen myOutput değişkeninin değeri, Sayfa1 içinde konumlandırılan OrnekProsedur2 isimli prosedürden elde edilir.

Bir Modülde Bulunan Prosedürü/Kodları, Başka Bir Modülden veya Sayfadan Çağırmak/Çalıştırmak

Sayfa1’de yer alan OrnekProsedur2 isimli prosedürden Module1’de yer alan OrnekProsedur1 isimli prosedür çalıştırılmak/çağrılmak istendiğinde, yukarıdaki örnekten farklı olarak “Call OrnekProsedur1” komutu yerine “Call Module1.OrnekProsedur1” komutu kullanılır. Eğer Workbook içinde (herhangi bir sayfada, userformda veya modülde) başka bir OrnekProsedur1 isimli prosedür yoksa, Module1 içindeki OrnekProsedur1 isimli prosedürü çağırmak için “Call OrnekProsedur1” de kullanılabilir. Ancak ilk yöntemi kullanmanız önerilir.

Option Explicit ifadesinin hemen altında konumlanacak şekilde Public myOutput As Integer şeklinde bir modülden deklarasyonu yapılan değişken Workbook içinde yer alan tüm prosedürlerde kullanılabilir. Burada myOutput değişkeni global bir değişken özelliğinde olup Integer, Long, String, Boolean, Date vb. herhangi bir değişken tipinde de olabilir.

Not: Editörde “Module1.” yazar ve klavyenin Ctrl ve J tuşlarına birlikte basarsanız, eğer Module1 isimli modül varsa, onun içinde bulunan tüm prosedürlere erişebilirsiniz.

Sadece modüller için değil, herhangi bir metodun yazımı sırasında Ctrl+J tuşlarına birlikte basarsanız o ögenin tüm metotlarına,  boş bir satırda Ctrl+J tuşlarına birlikte basarsanız ise VBA kütüphanesine ulaşabilirsiniz.

 

 

İshak Kutlu, VBA Notları

Yorum Yap

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube