1. VBA Ana Ekranı ve Nesne Ekleme

VBA’ya ilk girdiğinizde aşağıdaki gibi temiz bir ekran ile karşılaşacaksınız. Ve daha önce programlama ile ilgilenmedi iseniz nereden nasıl başlanacak henüz bir fikriniz yok. İsterseniz sizi daha fazla yormadan başlayalım. Ancak sizden bir ricam olacak, bu yazı programlama hakkında ayrıntılar içerdiğinden ve ben biraz anlatma özürlü olduğumdan özellikle bu yazıda eksik anlattığım, kavram karmaşasına yol açtığım veya genel olarak kafa karıştıran kısımlar var ise lütfen ya iletişim sayfasından ya da yorum kısmından bana bilgi verin. 

Bu ekrana girdiğinizde yandaki Proje Gezgini kısmına BuÇalışmakitabı ve Sayfa1 (eğer daha fazla sayfanız varsa bu sayfaların da) adlı en az 2 tane nesne olacaktır. Bunların üzerine çift tıkladığınızda o nesne için kod yazabileceğiniz kod sayfası açılır. Programlarınızı buraya yazmaya başlayabilirsiniz. Ancak ben eğer o nesnenin olayları ile ilgili bir kod yazmayacaksam bunu tercih etmiyorum. O yüzden önce bu kısımda boş bir yere sağ tıklayarak “Insert–>Module” seçeneğini tıklayarak bir modül ekleyin. Bu modülün ismini “Özellikler” kısmından istediğiniz gibi değiştirebilirsiniz. Programınız için form veya nesne sınıfları ekleme işlemini de yine bu menüden yapabilirsiniz.

2. Program Çalışma Sıralaması

Programlar bir ana yordam ve bu yordamdan çağrılan alt yordamlardan oluşur. Yordam sizin yazdığınız kodları barındıran ve bu kodları belli bir başlangıç noktasından başlayarak yine belirli bir bitiş noktasına kadar satır satır çalıştırılmasına yarayan program yapılarıdır. Yordam haricinde yazdığınız kodların tam olarak hangi noktadan başladığı, hangi sıra ile çalıştırılması gerektiği ve nerede sonlanacağı VBA tarafından bilinemez ve bu nedenle çalıştırılamaz. Programlar en az bir ana yordam içermek zorundadır, istenir ise ek yordamlar bu ana yordam içinden çağrılabilir. Alt yordamdan farklı alt yordamlara da atlama yapabilirsiniz. Hatta bir alt yordam kendini bir daha çağırabilir.

Bir ana yordam veya alt yordam içinden farklı alt yordamlara atlama dallanma olarak adlandırılır. VBA altında iki tane yordam türü vardır bunlar Sub ve Function  yordamlarıdır. Bu yordamlara birazdan daha ayrıntılı değineceğim bununla birlikte ilk önce dallanma mantığına bir bakalım:

Program Çalışma Sıralaması

VBA’da iki farklı yordam türü var demiştim. Sub alt yordamları geriye herhangi bir değer döndürmez. Bu alt yordamlara dallanmak için sadece alt yordamın adını da yazabilirsiniz. Örnek olarak resimde “Call Altprogram” satırında sadece “Altprogram” yazabilirsiniz. Değişen bir şey olmayacaktır. Ancak kodunuzun daha anlaşılabilir olması için “Call” anahtar kelimesini kullanmanızı tavsiye ederim. Özellikle uzun bir aradan sonra programınıza geri döndüğünüzde “Call” ifadesinin yanında yer alan ismin bir alt yordam olduğunu ilk bakışta anlayabilirsiniz.

Function alt yordamları ise bir değişken döndürür. Bu nedenle döndürdüğü değişken türüne ait bir değişken tanımlayarak bu değişkene “=” ifadesi ile atama yaparak bu alt yordamı çağırabilirsiniz. Yani eğer bir metin döndüren alt yordamınız var ise bunun döndürdüğü değeri alan değişkenin de metin türünde olması gerekir. Eğer dönen değeri herhangi bir değişkene atamazsanız, işlevin sonrasında geri döndürülen değer hafızada tutulmayacaktır. Bu tarz yordamlara döndürülen değişken türünü kullanan bir işleve atayarak ta çağırabilirsiniz. Veya Excel içinde bir hücreye bu işlevin adını yazarak, işlevin döndürdüğü değeri hücre değeri olarak kullanabilirsiniz. Bu konu hakkında ilerleyen bölümlerde daha fazla bilgi vereceğim.

Resimdeki kodu denemek isteyenler için kodun tamamını aşağıda veriyorum.

Test Kodu

Option Explicit

Sub AnaProgram()

Dim Degisken1 As String
Dim Degisken2 As String

Degisken1 = "Ilk bu yazı ekrana gelecek"
Degisken2 = "En son bu yazı ekrana gelecek"

MsgBox (Degisken1)

Call Altprogram

MsgBox (Degisken2)

End Sub

Sub Altprogram()

Dim Degisken1 As String
Degisken1 = "Alt Program: ikinci gösterilecek metin"
MsgBox (Degisken1)

End Sub

3. Sub Yordamı

VBA’da yeni bir modül oluşturduğunuzda boş bir programlama nesnesi oluşturmuş olursunuz. C ve türevleri gibi VBA’da bir başlangıç yordamı bulunmaz (void main() gibi). Programın nereden başlayacağı sizin yazdığınız yordamlara ve makroyu çalıştırma biçiminize bağlıdır.

VBA’da temelde 2 tane yordam bulunur bunlardan ilki Sub yordamıdır. Bu subroutine (alt yordam) kelimesinin kısaltılmışıdır. Bu yordam çalıştığında sadece içindeki kodlar çalışır, yordam geriye bir değer döndürmez. C ve türevlerinde void ile tanımlanmış alt yordamların karşılığıdır.

Yazılımı “Sub YordamAdı([değişken listesi])” şeklindedir ve yordamın başlangıcını ifade eder. Değişken listesine şimdilik takılmayın yazının ilerleyen kısmında anlatacağım. Her yordam End Sub ifadesi ile de sonlandırılır. Aksi takdirde VBA yazdığınız kodların nerede bittiğini bilemez ve hali ile çalıştıramaz. Ancak merak etmenize gerek yok yordamınızı yazıp Enter tuşuna bastığınızda düzenleyici otomatik olarak End Sub ifadesini ekleyecektir.

İsterseniz ekrana bir ileti gösteren basit bir yordam yazalım:

Sub Test()

MsgBox(“İlk Makrom”)

End Sub

Kodu yazarken büyük küçük harf yazmaya çalışmayın, düzenleyici siz yazmayı tamamlayıp Enter tuşuna bastığınızda otomatik olarak büyük küçük harf çevirimini yapacaktır. Şimdi yazdığımız kodu test edelim. Bunun için  araç çubuğundaki play düğmesine basalım. Bir metin kutusu içinde İlk Makrom ifadesi gösterilecektir.

İlk Makro

Videoda dikkat ederseniz “msgbox(” yazdıktan sonra düzenleyici ufak bir pencere içinde bazı yardımcı bilgiler gösterdi. Bu bilgiler msgbox ile ilgili seçenekler, yeri geldiğinde sizlere daha ayrıntılı bilgi vereceğim. Burada msgbox nesnesinin en basit halini kullanıyoruz, o yüzden diğer seçenekleri dikkate almadım.

4. Function Yordamı

Function yordamı da sub gibi bir yordamdır işlev anlamına gelmektedir. Sub’dan farkı bir değişken döndürebilmesidir. Bu nedenle döndürdüğü değişken türü de belirtilmelidir. Eğer belirtilmez ise variant türü bir değişken geri döndürür. “Function FncAdi([değişken listesi]) as DeğişkenTürü” şeklidedir. DeğişkenTürü olarak VBA değişkenler sayfasında yer alan değişkenler ve ya nesneler olabilir. Yine Sub gibi “End Function” ile bittiği yer tanımlanmalıdır. C ve türevlerinde bu int YordamAdi() {….} ifadesine denk gelir.

Sub yordamından farklı olarak function yordamları bir değişken döndürür demiştim. Ancak VBA’da diğer programlama dilleri ve Visual Basic’te kullanılan “return” ifadesi kullanılmaz. Değişkeni döndürmek için “YordamAdi = Değer” gibi bir ifade kullanmanız gerekir.

Programın döndürdüğü değeri alabilmek için iki farklı kullanım olduğunu ifade etmiştim. İlki bu değeri bir değişkene atamaktır. Şimdi ilk yazdığımız makroyu aşağıdaki şekilde değiştirelim:

Sub Test()

Dim Metin as string
Metin = MetinAta
MsgBox (Metin)

End Sub

Function MetinAta() As String

MetinAta = “İlk Makrom”

End Function

Programı çalıştırdığınızda Metin adlı bir değişken tanımlanacak. Metin = MetinAta satırında program “MetinAta” değerini görecek ve tam bu noktada MetinAta alt yordamına atlayacaktır. Bu yordam “İlk Makrom” değerini döndürüyor, bu geri dönen değer “Metin” değişkenimize atanacaktır. Daha sonrasında “Metin” değişkeni bir ileti kutusunda gösterilecektir. Siz bu kodu sadeleştirmek isterseniz ve tabii Metin değişkenini daha sonra kullanmayacaksanız, aşağıdaki şekilde de yazabilirsiniz:

Sub Test()

MsgBox (MetinAta)

End Sub

Function MetinAta() As String

MetinAta = “İlk Makrom”

End Function

Burada fark MsgBox nesnesi bir metin gösteriyor demiştim, metin kısmına geldiğinde MetinAta ifadesini görüyor ve bu alt programı çağırıyor, alt programın döndürdüğü değeri alarak ekranda gösteriyor.

İkinci kullanım ise direk olarak Excel çalışma sayfasında hücre içine “=MetinAta” ifadesini yazmanızdır. Bu sayede yordamın döndürdüğü değer hücre değeri olacaktır. Bu tarz kullanımda yazdığınız kod “Kullanıcı Tanımlı İşlev” olarak adlandırılıyor. Tabii bu tarz kullanım için Public ve Private anahtar kelimelerini de bilmeniz gerek.

5. Public ve Private Anahtar Kelimeleri

Bir önceki adımda dikkat etti iseniz hücre içine “=MetinAta” yazmaya başladığınız anda Excel yardım etmek adına size bir liste halinde girdiğiniz metne uyan işlevlerin bir listesini gösterdi ve burada MetinAta adlı bir işlev de yer alıyordu. Siz program yazarken çok miktarda alt yordam ve işlev kullanabilirsiniz. Bunlar aksi belirtilmedikçe hem tüm modül ve nesnelerde, işlevler ise hem buralarda hem de çalışma sayfalarında kullanılabilir. Özellikle çok miktarda alt yordam içeren makrolarda siz her yordamın her yerde kullanılmasını istemeyebilirsiniz. Zaten gerek te yoktur. İşte bu tarz ihtiyaçlara yönelik olarak yazdığınız yordamların başına koyabileceğiniz iki tane anahtar kelime var. 

Public: Genel anlamına gelir. Yazdığınız yordam ve işlevlerin tüm nesnelerden ve çalışma kitaplarından erişilebilir olmasını sağlar. Yani siz bir kullanıcı formu oluşturduğunuzda bu kullanıcı formu için kod yazarken modül içinde public ile tanımlanmış bir işlevi veya alt yordamı çağırabilirsiniz demektir. Public ifadesi tüm işlevler ve alt programlar için varsayılan ifadedir. Yani siz belirtmeseniz de tüm yazdığınız “Sub” ve “Function” yordamları “Public” olarak tanımlanır.

Private: Özel anlamına gelir.  Public ifadesinin tam tersidir. Yazdığınız “Sub” veya “Function” yordamının sadece yazıldığı nesne içinde kullanılabilmesini sağlar. Yani siz bu yordamı bir modül içinde yazdı iseniz başka bir modül veya kullanıcı formu veya Excel hücresi içinden bu işleve erişemezsiniz.

Bir önceki örneği aşağıdaki şekilde değiştirin:

Sub Test()

MsgBox (MetinAta)

End Sub

Private Function MetinAta() As String

MetinAta = “İlk Makrom”

End Function

Şimdi Excel çalışma sayfasında hücre içerisine formül yazarken karşınıza “=MetinAta” şeklinde bir seçenek çıkmayacaktır.

6. Option Anahtar Kelimesi

Programlama esnasında VBA derleyicisinin ayarlarını değiştirmek için kullanılır. Kullanıldığı modül içerisinde geçerlidir. Aynı ayarı farklı modüllerde veya formlarda kullanmak isterseniz her seferinde bu ifadeyi kullanmak durumundasınız.

Option anahtar kelimesi tüm programlama yapılarından önce, en üste yazılır. Şimdi bu ayarlar nedir, ne işe yara bir bakalım.

a.Option Explicit

Benim en çok, hatta her makroda kullandığım bir ayar komutu. Değişkenler yazımda VBA’nın “DeğişkenAdı = Değer” şeklinde belirsiz değişken tanımlamasına izin verdiğini belirtmiştim. Bu komut ile daha önce Dim komutu ile tanımlanmamış yani belirsiz tanımlanmış değişkenlerin kullanılması engellenir. Yazılımı:

Option Explicit

şeklindedir. Bu komutu kullanmanızı şiddetle tavsiye ederim. Uzun vadede çok faydasını göreceksiniz. Nasıl çalıştığı ve ne işe yaradığını görmek için aşağıdaki resimleri inceleyin.

Dikkat ederseniz burada Option Explicit komutunu kullanmadım. Ve belirsiz bir değişken tanımlaması olmasına rağmen kod çalıştı ve ekranda ileti kutusu gösterildi.

Bu örnekte ise ilk satırda “Option Explicit” komutu var. Kodu çalıştırdığımda “Metin” adlı değişkenin tanımlı olmadığını belirten bir hata iletisi gösterilerek program durduruluyor.

b. Option Base

Bu komut ile dizin değişkenlerindeki elemanların 0’dan itibaren değil 1’den itibaren başlaması sağlanabilir. Kullanılmaması durumunda zaten 0 olarak alınacaktır. Yazılımı:

Option Base 1

şeklindedir. 1 yerine 0 da yazabilirsiniz ancak bu durumda zaten varsayılan ayarı kullanıyorsunuz demek. Gereksiz bir kod olacaktır. Bu komut ile alt ve üst sınırın ayrı ayrı tanımlandığı dizinler etkilenmez, sadece üst sınır tanımlanarak oluşturulan dizinlerde geçerlidir.

Bu örnekte Option Base komutunu kullanmadım. Gördüğünüz gibi BelirliDizin de dahil olmak üzere tüm dizinlerin ve dikkat ederseniz çift boyutlu ÇiftDizin değişkeninin tüm boyutlarının LBound komutu ile döndürülen alt sınırları 0.

Bu örnekte Option Base komutunu kullandığımda ise BelirliDizin hariç tüm dizinler ve tüm boyutların LBound komutu ile döndürülen alt sınırları 1. BelirliDizin değişkeninde alt sınırı biz tanımladığımız için 0 olarak kaldı.

c. Option Compare

Program içindeki metin kıyaslamalarının neye göre yapılacağını belirler. Burada 3 tane seçenek var bunlar sırası ile; Metin (Text), İkili (binary) ve Veritabanı (database). Veritabanı seçeneği sadece Access için geçerli. Eğer kullanılmaz ise ikili seçeneği geçerlidir. Seçeneklerin nasıl çalıştığına bakalım isterseniz:

İkili (Binary): Bu kıyaslamada harfin kendisi değil VBA’da harfi tanımlamak için VBA içinde kullanılan rakamlar kullanılır. Bu karşılaştırmada A harfi ile a harfi birbirinden farklıdır çünkü iki harfi tanımlamak için kullanılan dahili rakamlar birbirinden farklıdır.

Metin (Text): Bu kıyaslama türünde metinler büyük küçük harf kısıtlaması olmadan birbirleri ile kıyaslanır. Daha açık bir ifade ile A ile a harfi birbirine eşittir.

Veritabanı (Database): Access içinde metinleri kıyaslarken, veri kıyaslamanın yapıldığı veri tabanının yerel kimlik numarasına bağlı olarak oluşturulmuş olan sıralama düzenine bağlı olarak bir sonuç döndürür. Şahsen Access kullanmadığım için nasıl bir kıyaslama yaptığını bilmiyorum.

Komutun yazılımı:

Option Compare Binary
Option Compare Text

şeklinde. Kendi yazdığım programlarda kullanma ihtiyacı hissetmedim.

d. Option Private

Birden fazla çalışma sayfası arasında çalışan ve birbirlerinin makrolarını kullanan geniş çaplı projelerde kullanılabilen modüller için kullanılabilecek bir ayardır. Yine benim kullanmadığım bir komut. Ne işe yarıyor? Modül içinde tanımladığınız genel değişkenlerin başka bir çalışma kitabındaki makroların kullanımına kapatılmasını sağlar. Normalde bu genel değişkenler mevcut çalışma kitabındaki tüm nesneler içinde kullanılmaya devam eder. Yazılımı:

Option Private Module

7. Yerel ve Genel Değişkenler

VBA’da ve tabii Visual Basic kullanırken bir değişken tanımlandığı alanda kullanılabilir. Yani siz bir Sub veya bir Function içinde Dim ile bir değişken tanımlarsanız bu değişken ilgili End ifadesine kadar hafızada tutulur, program bu aşamaya geldiğinde değişken de hafızadan silinecektir. Aynı şekilde diğer program yapıları, For-Next döngüleri gibi, içinde tanımlanan değişkenler de sadece bu yapı içinde kullanılabilir. O yapının sonuna gelindiğinde değişken hafızadan silinecektir. Bu tarz değişken tanımlamaları yerel değişken tanımlaması olarak adlandırılır.

Bunun haricinde program içerisinde sürekli olarak kullanmak isteyeceğiniz değişkenler olabilir. Mesela Excel’de değer yazmak istediğiniz satır numarasını sürekli kullanmak isteyebilirsiniz. Bu durumda genel bir değişken tanımlamanız gerekecektir. VBA ve diğer programlama dillerinde bunu yapmak için herhangi bir yordam tanımlamadan önce bu değişkenleri tanımlamanız gerekir. Yani programınızın başında herhangi bir Sub veya Function yordamlarını yazmadan önce bu değişkenleri tanımlamanız gerekir.

Tabii bu değişkenleri tanımlarken de “Public” ve “Private” anahtar kelimelerini kullanabilirsiniz. Eğer bu kelimeleri kullanırsanız ek olarak “Dim” kullanmanıza gerek kalmaz. Aksi belirtilmedikçe tüm değişkenler Private olarak tanımlanır. Private değişkenler sadece tanımlı oldukları nesne içinde geçerli olacaktır. Diğer nesnelerden bu değişkene erişmek mümkün değildir. Public değişkenler ise tüm nesnelerin erişimine açıktır. Sizin bir kullanıcı formunuz var ise ve bu formdan bir modüle veri aktarmak isterseniz bu değişken türünü kullanabilirsiniz.

8. Alt Yordamlara Değişken Yollama

Bazı durumlarda yordamlarda kullanılmak üzere bazı değişkenleri de aktarmanız gerekebilir. Bunun için genel değişkenler kullanabilirsiniz ancak alt programa yollamak istediğiniz her değişkeni genel bir değişken olarak tanımlamak verimli bir yöntem değildir. Bunun yerine yordamı yazarken kullanacağı değişkenleri de bu esnada belirleyebilir ve bu değişkenleri yordamı çağırırken ona yollayabilirsiniz. Birden fazla değişken gelecek ise değişkenler arasında “,” kullanmanız gerek. Hemen basit bir yordam yazalım:

Sub AdSoyadGoster(Metin1 as String, Metin2 as String)

MsgBox(“Kullanıcı Adı: ” &Metin1 &” ” &Metin2)

End Sub

Şimdi bu yordamı çağıran bir ana program:

Sub Ana()

    Dim Ad As String
    Ad = “Ahmet”

    Dim Soyad As String
    Soyad = “Kurmaz”

    Call AdSoyadGoster(Ad, Soyad)

End Sub

Programı çalıştırdığınızda ekranda Kullanıcı Adı: Ahmet Kurmaz yazan bir ileti kutusu gösterilecektir. Aynı yöntem ile işlevlere de değişken yollayabilirsiniz. Burada yolladığınız değişkenin adı ile alt programda girdi olarak tanımladığınız değişken adı aynı olmak zorunda değil. Kullanıcı tanımlı işlevlerde de bu yöntemi kullanabilirsiniz, ve hücre adreslerini bu değişkenlerin yerine kullanabilirsiniz.

9. ByRef ve ByVal Anahtar Kelimeleri

Alt programlara yolladığımız değişkenler sadece değer bilgisi olarak gider. Bu şu demek değişkenin üzerinde gerçekten bir işlem yapılmaz. Değişiklikler o alt yordam içinde sanal bir değişken üzerinde yapılır ve alt yordam bittiğinde bu değişiklikler kalıcı olmaz.

Bazı durumlarda biz alt yordama yolladığımız değişkenlerde değişiklik olmasını isteriz. Mesela bir Function ile tek bir değer geri döndürebiliyoruz ancak biz bir alt yordamda birden fazla değer geri dönmesini isteyebiliriz. Bu durumda alt yordamın, ona yollanan değerler üzerinde değişiklik yapmasını sağlamamız gerek.

Bunun için kullandığımız anahtar kelime ByRef. ByRef alt yordama yolladığınız değişkenler, değişkene başvuru olarak yollanır. Bu da alt yordamın o değişken üzerinde değişiklik yapabilmesini sağlar.

ByVal ise zaten varsayılan ayardır. Alt yordama sadece değişkenin değerinin yollanmasını sağlar. Alt yordam bu değeri kullanabilir ancak değişkenin kendisi üzerinde değişiklik yapamaz. Yazılımı:

Sub YordamAdi(ByRef Degisken1 [as degiskentipi], ByVal Degisken2 [as degiskentipi])

şeklindedir.

10. Optional Anahtar Kelimesi

Bazen bir alt programa yolladığınız değerin çoğunlukla aynı olduğunu ve fakat bazı durumlarda farklı bir değer yollamanız gerektiği durumlarda kullanılır. Optional zaten isteğe bağlı demektir. Mesela bir tekrarlama işlemi  yaptığınızı varsayalım. Genelde 10 yinelemenin yeterli olduğunu düşünelim. Bu durumda alt programı çağırırken sürekli 10 değerini yollamak gereksiz bir işlem olur. Bunu programın içine gömebiliriz ama bu durumda da farklı yineleme adetlerine ihtiyacınız olduğunda da bunu değiştirmek zorlaşır. Optional anahtar kelimesi bunun için kullanılır. Yazımı:

Sub YordamAdi(Optional Degisken as integer = 10)

Siz bu yordamı çağırırken Optional olarak tanımlanmış değişkenleri belirtmek durumunda kalmazsınız. Yani sadece “Call YordamAdi” gibi bir satır ile yordamı çağırabilirsiniz ki bu durumda alt program bu değeri 10 olarak alacaktır. Bunun yanında:

Call YordamAdi(100)

şeklinde bir dallanma yaparsanız alt yordamda 10 olarak atadığınız değere 100 atanacak ve yineleme adedi olarak 100 kullanılacaktır.

İlginizi Çekebilecek Diğer Yazılar
Etiketler: , , ,
  1. merhaba,bir sorum olacaktı,vba da öyle bir kod yazmalıyım ki ;bir buton atayıp excel çalışmamın herhangibir yerinde o butona bastığımda istediğim eylemi bana versin.

    • Merhaba,

      Excel VBA düğmeleri sayfalara eklenebiliyor. Eğer düğmenin sayfadan bağımsız olarak çalışmasını istiyorsanız Excel şeridi değiştirmeniz gerek. BUnun için de öncelikle istediğiniz makroyu bir Excel kitabında oluşturup bu kitabı Excel add-in olarak kaydetmeniz gerekiyor (xlam). Sonrasında bunu Excel’de Dosya–>Seçenekler penceresinden “Excel Eklentiler” kısmına girip “Ekle” diyerek bu oluşturduğunuz dosyayı Eklenti olarak eklemeniz gerek. Sonrasında Excel şeridini özelleştirerek yazmış olduğunuz makroyu şeride bir düğme olarak ekleyebilirsiniz.

      Saygılarımla,

Leave a Reply