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.
| Tip | Boyut | Alabileceği Değer Aralığı |
| Integer | 2 bit | -32.768 ile 32.767 arası |
| Long | 4 bit | -2.147.483.648 ile 2.147.483.648 arası |
| Double | 8 bit | Long 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.
| Tip | Boyut | Alabileceği Değer Aralığı |
| String | – | 1 ile 65.400 karakter |
| Boolean | 2 bit | True veya False |
| Date | 8 bit | – |
| Object | 4 bit | – |
| Variant | 16 bit | String, 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 SubKarşı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 SubNot: 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 SubKarşı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 SubKarşı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 SubKarşı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 Sub9. 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ı
