Terminoloji
İlk kodlarımıza geçmeden önce kısa bir terminoloji bilgisi edinmemizde fayda var. Böylece ne yaptığımızı daha iyi anlıyor olabileceğiz.
Visual Basic veya herhangi bir programlama dili kullanmış olanlar bilir, bir program yazarken programımızı belirli anahtar kelimeler üzerine kurarız.
Bunlar temel olarak şu şekilde sınıflandırılabilir:
- Prosedürler
- Değişkenler
- Sabitler
- Diziler
- Koşullu yapılar
- Döngüler
- Hata ayıklayıcılar
- Kullanıcıyla iletişim
- Olaylar
- Nesneler
- Metodlar
- Özellikler
- Fonksiyonlar
Şimdi ilk etapta bilmemiz gerekenlere bir bakalım.
Prosedür
Gerek kendimizin yazdığı kodlar olsun gerek makro kaydederek oluşturduğumuz kodlar olsun hepsi bir prosedürdür. İki tür prosedürümüz var.
- Sub prosedürler:Çalışır ve birşeyler yapar, ama bir değer döndürmezler. (Türkçede yordam olarak geçer)
Sub prosedüradı() 'Kodlar buraya yazılır End Sub
- Function Prosedürler:Çalışması sonucunda (genelde) değer döndüren prosedürlerdir. Bunlar da kendi içinde ikiye ayrılır. İlk grubun Excelin yerleşik fonksiyonlarından hiçbir farkı yoktur, bunlara Kullanıcı tanımlı fonksiyonlar(UDF) denir. Genelde bir parametre/argüman alırlar. İkinci grupta ise VBA içinde kullandığımız ve döndürdüğü değeri yine VBA içinde kullanmaya devam ettiğimiz VBA Functionlar yer alır.
Function functionadı()
'Kodlar buraya yazılır
End Function
Makro konusunu işlerken ağırlıklı olarak Sub prosedürleri işliyor olacağız, yer yer Functionlara da değineceğiz. Fonksiyonları az önce verdiğim linklerde ayrıca inceliyor olacağız.
Fonksiyona benzeyen bir de metod kavramı var, ki ikisi genelde birbiri yerine kullanılmaktadır, bununla birlikte terminolojide aralarında küçük bir fark bulunur: Fonksiyonlar bağımsız çalışabilir, ancak metodlar mutlaka bir nesneye ihtiyaç duyarlar, bağımsız çalışamazlar.
Ör:Application.InputBox ifadesindeki InputBox, bir metod olup Application nesnesine ihtiyaç duyar. Aşağıdaki tanımladan da görüleceği üzere Application'ın hem ikonundan hem de önündeki Class ifadesinden bir alttaki Inputboxtan farklı olduğu görülmekte.
Normal Inputbox ise bir fonksiyon olup nesneye ihtiyaç duymaz. Bu fonksiyon, Interaction modülü içinde tanımlanmıştır, bir class içinde değil.
Yukarıda, fonksiyonlar "genelde" bir değer döndürür dedik. Bazen, sebebini anlayamadığım bir şekilde, bazı kişilerin(hatta Microsoft'un kendisinin bile) değer döndürmeyen Function prosedürler yazdığını görüyoruz. Bu hem Modül fonksiyonları hem de Class metodları için geçerlidir. Mesela, aşağıda Range classının Activate metodunu görüyoruz. Deklerasyonu Function Activate() şeklinde yapılmış.
AddComment metodu ise sonunuda As Comment ifadesine sahip. İşte bu "As" ile başlayan kısım bize fonksiyonun "dönüş değerini" verir.
Eğer bir metod geriye bir şey döndürüyorsa bu arkaplanda kesinlikle bir Function presedür olarak hazırlanmıştır, ancak değer döndürmüyorsa Sub prosedür olarak hazırlanmış olabileceği gibi sebebini hala anlamadığım bir şekilde Function prosedür olarak da hazırlanmış olabilir.
Modül
Prosedürlerimizi yazdığımız yerlere Modül denmektedir. Bunlar Standart modül, Class Modül ve Userform modüller olabilir. Ancak biz eğitimin büyük kısmında standart modüllerde çalışacağız. Class modüllere çok az kod yazacağız. Eventler bölümünde ise Workbook ve Worksheet isimli class modüllere(evet bunlar da class modüldür) kod yazacağız.
VBE içinde Project penceresinde herhangi bir workbookta sağ tıklayıp Insert'e gelince gördüğümüz seçenekler modül seçenekleridir.
ukarıdaki örneklerde gördüğünüz üzere ' işareti ile yorumlar yazılabilmektedir. Yorumlar yeşil renkte görünürler.
Yorumlar önemlidir, özellikle bazı makroları arada bir çalıştırıyorsak ve makronun nasıl çalıştığını aklımızda tutamıyorsak yorumlarda bunu açıklamak akıllıca olacaktır. Bir diğer gerekçe de, biz gittikten sonra yerimize gelecek kişiye de yol gösterici birşeylerin olması gerektiğidir.
NOT: Bir diğer yorum ekleme yöntemi REM ifadesini kullanmaktır, buna neden gerek duyulmuş hiçbir fikrim yok, ben genelde ' işaretini kullanıyorum.
Sub prosedüradı()
REM açıklamalar buraya yazılır
End Sub
Hadi şimdi biraz kod yazalım. Boş bir dosya açalım. Önceki konularda gördüğümüz gibi Personal.xlsb dosyamıza gidip Modules'e sağ tıklayalım ve yeni bir modül ekleyelim. Sonra aşğıdaki kodu oraya yapıştıralım. Kodun içinde herhangi bir yerdeyken F5 tuşuna basalım ve kodumuzu çalıştıralım. (Bunun yerine üstteki araç çubuğunda Play işaretine de tıklayarak makronuzu çalıştırabilirsiniz)
Sub ilkörnek()
Range("A1").Select
Selection.Value = 10
Range("A2").Select
Selection.Value = 20
Range("A3").Formula = "=A1+A2"
Range("A4").Value = Range("A1").Value + Range("A2").Value
End Sub
Bu örnekte önce A1 hücresini seçtim, sonra mevcut olan bu seçime yani A1'e 10 değerini yazdırdım. Sonra A2 hücresini seçip oraya da 20 değerini yazdırdım. A3 hücresine ise A1+A2 toplamını formül olarak yazdırdım, ancak A4 hücresini yine aynı toplamı değer olarak yazdırdım.
Gördüğünüz üzere Value değerini hem değer atamada hem de değer okumada kullanabildim. İşte bazı özelliklerin hem değer yazma hem değer okuma durumu varken, bazısında sadece değer yazma, bazısında ise sadece değer okuma olabilmektedir. MSDN'de Excel Nesne modeli incelemesi yaparken bunlar şu şekilde gösterilir.
- Return or sets : Hem atanır, hem okunur
- Sets: Sadece atanır
- Returns: Sadece okunur
Şimdi bir kod daha yazalım. Bu sefer yeni modül eklemek yerine aynı modülde, yukardaki kodun hemen altına şu kodları yapıştıralım.
Sub kucukyap()
Set Aktif = Selection
For Each s In Aktif
buyuk = StrConv(s.Value, vbLowerCase)
s.Value = buyuk
Next s
End Sub
Bu kod da seçtiğimiz hücrelerdeki tüm harfleri küçük harfe dönüştürür. Deneme yapmak için A1 hücresine VOLKAN, B1 hücresine kendi adınızı, C1 hücresine de EXCEL yazın, sonra bu üçünü seçip VBE'ye gelip F5 ile kodu çalıştıralım.
Şimdilik bu kadar yeter, isterseniz devam etmeden önce siz de biraz Makro Kaydedici ile alıştırma yapın.