Değişkenlerin geçerlilik durumlarına genel bakış


VBA ile çalışırken değişkenlerin tanımlanmasından sonra dikkat edilecek en önemli nokta o değişkenin nerede tanımlandığıdır. Bir değişken tanımlandığı nokta itibari ile bir geçerliliği sahip olur. Bunu kısaca açmak gerekirse bir alt programında içerisinde ya da bir olay alt programın içerisinde Dim ile  tanımalanan bir değişken sadece o alt program icra edilirken belleğe yüklenip çalışıtırılabilir. Örneğin Sub btnKaydet_Click()... End Sub olay alt programında tanımladığınız bir değişkene Sub btnGuncelle_Click()... End Sub olay alt programından erişemezsiniz. İsterseniz daha somut şekilde ifade etmeye çalışalım.

Yukarıda Sayfa1 çalışma sayfasında iki adet sayac ve hucreDegeri adında iki ayrı yerde sırası ile tamsayı (0.65536 arasındaki sayılar) ve String (sayısal olmayan bilgiler) veri saklamak üzere değişken tanımlanmıştır. Bunlarda sayac sayfa düzeyinde global bir değişkendir. Yani Sayfa1 çalışma sayfasında yer alacak tüm alt program ve fonksiyonlardan çağrılarak kullanılabilecek bir değişkendir. Diğer yandan hucreDegeri değişkeni ise Sayfa1 isimli çalışma sayfasının seçim değiştiğinde (selection change) olay altprogramı dışında hiç bir yerden ulaşılamayan değişkendir.


kitap duzeyi degiskenler

Yukarıdaki resimde görüldüğü üzere satir ve sutun isminde iki adet değişken tanımlanmıştır. Bu değişkenlerden satir çalışma kitabı genelinde global bir değişkendir. Ancak bundan şu anlam çıkmaz "satir değişkenini çalışma sayfası 2 den çağırıp kullabilirim." Tamamen yanlış. Şayet satir değişkenine diğer çalışma sayfalarından erişmek isterseniz onu dim yerine "Public satir as Integer" şeklinde tanımlamalı kullanmak istediğiniz zamanda Thisworkbook.satir şeklinde kullanmalısınız. Ancak çalışma kitabına ait olayların tamamında Dim ile tanımlandığı halde globaldir yani genel bir değişkendir ve satir isimli değişken workbook_open() , _beforeSave(), _deactivate(), sheetActivate() vb. tüm olay alt programlardan erişilerek kullanılabilir. Ancak sutun değişkeni sadece workbook_open() olayında geçerlidir bunun dışında bir alt program ya da fonksiyonda gözükmez ve kullanılamaz.

modul duzeyi degiskenler

Yukarıda verilen değişkenlerden Global ve Public deyimi ile tanımalananlar bu çalışma kitabında yer alan tüm çalışma sayfaları, olaylar ve olay alt programlarda geçerlidir. Yani bir çalışma kitabının genelinde geçerli bir değişken tanımlamak isterseniz Modül seviyesinde Global ya da Public deyimi ile tanımlamalısınız. Diğer yandan Dim ile tanımlanan sayici değişkeni ise sadece Modüle1 isimli modülde geçerli olup çalışma kitabının içindeki diğer çalışma sayfalarından erişilemez.

Özetle bir değişken tanımlandığı yere göre kıymet kazanır ve kendisine erişilebilir. Bu nedenle değişkenlerinizi uygun yerlerde tanımlamalısınız. Ayrıca şunu da hatırlatmakta fayda var "Niye uğraşıyoruz ki tüm değişkenleri Modül seviyesinde Global olarak tanımlayalım !  dediğinizi duyar gibiyim" Değişkenin geçerli olduğu alan genişledikçe bellekte kalma süresi de artar. Bunun anlamı global değişkenler kullanılsa da kullanılmasa da  bellekte yer tutmaya devam edeceğidir. Oysa yerel değişken ilgili alt program çalıştırılırken belleğe yüklenir ve alt programın icrası bitince bellekte tuttuğu yer boşaltılır. Zamanla hangi değişkeni nerede kullanmanız gerektiğinize kendiniz rahatlıkla karar verebileceksiniz.

Yardımcı olması dileği ile