VBA|Seviye|Başlangıç
1. Worksheet, Module, Userform Ögeleri Eklemek
VBA projenize ilişkin Excel dosyasını açın. Sayfa1 ögesinin hemen sağında yer alan “+” işaretine tıklayın yeni bir sayfa oluşturun.

Visual Basic editörüne gidin. Project Explorer penceresinde eklediğiniz sayfayı görebilirsiniz. Project Explorer bölümünden yeni eklediğiniz sayfaya çift tıklayın. Herhangi bir kod bulunmadığı için sayfanın editörü boş olacaktır.

Bir önceki sayfada yazılan kodlara ulaşmak için Sayfa1 isimli ögenin üzerine çift tıklayabilirsiniz.
Yeni oluşturduğunuz sayfaya buton eklemek için “Tasarım Modu-Design Mode” konusunda belirtilen adımları aynen izleyin.
VBA ile programlama yaparken sık sık module ögelerinin içine kod blokları yuvalama ihtiyacı duyulur. Project Explorer bölümünde boş bir alana sağ tıklayın ve aşağıdaki adımları izleyin.
Insert == > Module
Görseli aşağıdadır.

Project Explorer bölümüne Module1 isimli bir öge eklenmiş olacaktır. Module1 ögesinin üzerine gelip çift tıklarsanız, Module1 içine prosedür (kod) ekleyebilirsiniz.

VBA ile programlama yaparken daha önce de belirtildiği gibi kodlarınızı daima Sub ile End Sub arasına yazmanız gerekir. Module1 içine aşağıdaki gibi bir örnek prosedür tanımlayalım.
Sub OrnekProsedur() MsgBox "Bu mesaj Module1 isimli modülden çalıştırılıyor." End Sub

Module1 içine OrnekProsedur isimli bir prosedür tanımladık. Ancak bu prosedür öylece çalışmayacaktır. Prosedürü başlatacak bir tetikleyiciye ihtiyacımız olacaktır. Örneğin Sayfa1’de yer alan CommandButton1 ögesini tetikleyici olarak kullanabiliriz. CommandButton1 butonuna tıklandığında Module1 içindeki OrnekProsedur prosedürünün çalışmasını sağlayabiliriz. Bunun için “Tasarım Modu”nu etkinleştirip Sayfa1’e gidelim ve CommandButton1 butonuna çift tıklayıp onun prosedürüne ulaşalım (Bunun için Project Explorer bölümünde yer alan Sayfa1 ögesine çift tıklayıp CommandButton1_Click() prosedürünü kendimiz de bularak gidebiliriz). CommandButton1 isimli prosedürün içinde Sub ile End Sub arasında yer alan (varsa) diğer kodları yorum satırı yaparak kapatalım ve aşağıdaki kodu yazalım.
Private Sub CommandButton1_Click() Call Module1.OrnekProsedur End Sub

“Tasarım Modu” etkin ise kapatın ve Sayfa1’de yer alan CommandButton1 butonuna tıklayın. Bu durumda buton Module1 ögesi içinde OrnekProsedur isimli prosedürü tetiklemek suretiyle başlatacaktır.

VBA ile programlama yaparken sık sık userform ögelerine de ihtiyaç duyulur. Project Explorer bölümünde boş bir alana sağ tıklayın ve aşağıdaki adımları izleyin.
Insert == > UserForm
Görseli aşağıdadır.

Project Explorer bölümüne UserForm1 isimli bir öge eklenmiş olacaktır. Ayrıca UserForm1 ögesine buton, etiket, açılır liste vb. kontrolleri eklemek için “Toolbox” adında küçük bir araç çubuğu da görüntülenecektir.

“Toolbox” aracını kapatabilirsiniz. Dilediğiniz zaman aşağıdaki resimde işaretli ikondan “Toolbox” aracını kolaylıkla çağırabilirsiniz.

Project Explorer bölümünde UserForm1 ögesinin üzerine gelip çift tıklarsanız, UserForm1 ögesinin kendisini (yukarıdaki resimde sağda tarafta yer alan kısmı) görüntülersiniz. Project Explorer bölümünde UserForm1 ögesinin üzerine gelip sağ tık yapar ve View Code seçeneğini tıklarsanız da UserForm1 içinde, kodları yazacağınız alanı görüntülersiniz.

UserForm1 içinde herhangi bir prosedür bulunmadığından UserForm1 ögesinin içi, aşağıdaki resimde gösterildiği gibi boş olacaktır.

Project Explorer bölümünde UserForm1 ögesinin üzerine gelip çift tıklayalım ve UserForm1 ögesinin kendisine geri dönelim. “Toolbox” aracını tıklayıp UserForm1 üzerine bir buton ekleyelim. 3 no.lu alana tıkladıktan sonra fare form üzerinde iken farenin sol tarafına basılı tutarak küçük bir dikdörtgen çizelim. Böylece UserForm1 üzerinde bir buton oluşturmuş oldunuz.

Oluşturduğunuz butonun üzerine çift tıklayıp UserForm1 ögesinin kod alanına erişin. Butona ilişkin başlangıç ve bitiş etiketleri, yani Sub ile End Sub etiketleri otomatik olarak oluşturulacaktır.

Bu prosedürün içine aşağıdaki gibi bir kod yazalım.
Private Sub CommandButton1_Click() MsgBox "Bu mesaj, UserForm1 isimli formdan çalıştırılmıştır." End Sub

Bu kez Sayfa2’ye, “Tasarım Modu” konusunda anlatıldığı gibi bir buton ekleyelim. “Tasarım Modu” etkinken bu butonun üzerine çift tıklayıp başlangıç ve bitiş etiketlerini otomatik olarak oluşturalım. Prosedürün içine de UserForm1 ögesini çağıracak/görüntüleyecek aşağıdaki kodları yazalım.
Private Sub CommandButton1_Click() UserForm1.Show End Sub

“Tasarım Modu” etkin ise kapatın ve Sayfa2’de yer alan CommandButton1 butonuna tıklayın. Aşağıdaki gibi UserForm1 ögesini göreceksiniz.

UserForm1 ögesi üzerindeki CommandButton1 butonuna tıklarsanız da aşağıdaki mesajı görüntülersiniz.

2. Worksheet, Module, Userform Ögelerini Kaldırmak
Bir module veya userform ögesini kaldırmak için Project Explorer bölümünden kaldırmak istediğiniz ögenin üzerine gelip sağ tık yapın ve Remove … seçeneğini işaretleyin.

Ögeyi kaldırmadan önce bir yere kaydetmek isteyip istemediğimizi soran aşağıdaki gibi bir bilgilendirme mesajı görüntülenecektir.

Bu mesaja Hayır derseniz seçtiğiniz öge kaldırılacaktır.
Sayfa, yani worksheet ögeleri yukarıda gösterildiği gibi Project Explorer penceresinden kaldırılamaz. Sayfa ögelerini kaldırmak için Excel arayüzüne gelip kaldırmak istediğiniz sayfanın üzerine sağ tıklayıp Sil seçeneğini işaretlemelisiniz.

Açılan pencerede Sil butonuna tıklayın.

3. Module ve Userform Ögelerini Dışa Aktarmak-Export File
Bir module veya userform ögesini dışa aktarmak, yani projenin dışında bir yere (örneğin başka bir projede kullanılmak üzere) kaydetmek için Project Explorer bölümünden dışa aktarmak istediğiniz ögenin üzerine gelip sağ tık yapın ve Export File seçeneğini işaretleyin.

Seçtiğiniz ögeyi kaydetmek istediğiniz dizini belirtmenizi isteyen bir pencere açılacaktır. Ögenin masaüstü dizinine aynı isimle kaydedileceğini varsayalım.

4. Module ve Userform Ögelerini İçe Aktarmak-Import File
Bir module veya userform ögesini içe aktarmak, yani projenin dışında kayıtlı bir ögeyi projenin içine aktarmak için Project Explorer bölümünden boş bir alana sağ tıklayın ve Import File seçeneğini işaretleyin.

Açılan pencereden ögeyi daha önce kaydettiğiniz dizini seçin ve ögeyi bulup üzerine bir kez tıklayın ve aç butonuna tıklayın.

Uyarı! Aynı isimli iki ögeyi aynı projede kullanamazsınız. Bu yüzden daha önce UserForm1 ismi ile (masaüstüne) kaydedilen öge ile projede zaten bulunan UserForm1 isimli öge isimleri çakışacaktır. Bu sebeple projede kayıtlı UserForm1 isimli ögenin adını aşağıdaki resimde gösterildiği gibi UserForm1x olarak değiştirelim. Bu amaçla UserForm1 isimli ögeyi tıklayın ve Properties Window penceresinde yer alan (Name) alanından ögenin ismini (örneğin) UserForm1x olarak değiştirin.

Bir önceki adımı tekrar uygularsanız, (artık UserForm1 ismi çakışmayacağı için) masaüstünde kayıtlı UserForm1 ögesini projeye sorunsuz bir şekilde aktarabilirsiniz.

5. Option Explicit
Option Explicit bir ögenin kod alanında en üstte bulunan standart bir koddur. Bu kodu projelerinizde bulunan her ögenin (worksheet, module, userform vb.) içinde kullanmanız “önemle” tavsiye edilir. Değişken çakışması vb. durumlar ile baş edebilmeniz için size çok büyük katkıları olacaktır.
Dilerseniz manuel olarak her ögenin (sayfa, module, userform vb.) içinde yer alan kod alanının en üstüne yazabilirsiniz.

Dilerseniz de oluşturacağınız her ögeye Option Explicit deklarasyonunun otomatik olarak eklenmesini sağlayabilirsiniz. Bunun için Visual Basic editöründen aşağıdaki yolu izleyin.
Tools == > Options

Açılan pencerede “Editor” sekmesi içinde yer alan “Require Variable Declaration” seçeneğini işaretleyip “Tamam“ butonuna tıklayınız.

Bundan sonra bu projede yeni bir module, sayfa, userform vb. öge oluşturduğunuzda Option Explicit deklarasyonu otomatik olarak oluşturulacaktır.
6. Tetikleyici Kavramı (Triggers)
Tetikleyici bir kodun çalışmasını sağlayan olaydır. Bir butona basılması, bir user formun veya sayfanın açılması, sayfada bir hücrenin seçilmesi vb. herhangi bir olayın başlaması tetikleyici olabilir. Bir butona basıldığında (click olayı) bir prosedürün veya prosedür grubunun çalışması sağlandığında, butonun tıklanması fiili bir tetikleyicidir. Bir user formun açılması olayını tetikleyici olarak kullanmak için Project Explorer penceresinden UserForm1 ögesi üzerinde sağ tık yapıp View Code seçeneğini tıklayın ve UserForm1 ögesinin kod alanına ulaşın.
Aşağıdaki resimde gösterildiği gibi önce 1 no.lu alandan “Userform” seçeneğini seçin. Otomatik olarak 2 no.lu alanda belirtilen tetikleyici oluşturulacaktır. 2 no.lu alanda otomatik oluşturulan tetikleyiciyi silebilirsiniz. Sonra 3 no.lu alanda “Initialize” seçeneğini seçin. Bu durumda 4 no.lu alan otomatik olarak oluşturulur. “Initialize” userformun ilk açılışı olayını temsil eder. “Initialize” prosedürü içine aşağıdaki kodu yazın.
Private Sub UserForm_Initialize() MsgBox "UserForm1 açıldığında bu mesaj otomatik olarak görüntülenecektir." End Sub

“Tasarım Modu” etkin ise kapatın. Daha önce Sayfa2 içinde bulunan CommandButton1 butonuna, UserForm1 ögesini açmasını ilişkin aşağıdaki gibi bir kod yazmıştık.
Private Sub CommandButton1_Click() UserForm1.Show End Sub
Basitçe Sayfa2’de yer alan butona tıklayın. Aşağıdaki resimde görüldüğü gibi UserForm1 açılmadan hemen önce bir mesaj görüntülenecektir.

Bu mesaj butonda tanımlı bir prosedür değildi. Butonda tanımlı olan prosedür UserForm1 ögesini Show yapması, yani göstermesi şeklindeydi. Ancak UserForm1 ögesinin açılması tetiklendiğinde, UserForm1 içinde Initialize prosedüründe yer alan kod çalışarak yukarıdaki mesajın görüntülenmesini sağladı. Yukarıdaki mesajda “Tamam” butonuna tıklanırsa UserForm1 açılacaktır.

Bir sayfanın açılmasına ilişkin bir tetikleyici tanımlamak isteyelim. Project Exploper penceresinden Sayfa1 ögesine çift tıklayın ve kod alanına erişin.
Aşağıdaki resimde gösterildiği gibi önce 1 no.lu alandan “Worksheet” seçeneğini seçin. Otomatik olarak 2 no.lu alanda belirtilen tetikleyici oluşturulacaktır. 2 no.lu alanda otomatik oluşturulan tetikleyiciyi silebilirsiniz. Sonra 3 no.lu alanda “Activate” seçeneğini seçin. Bu durumda 4 no.lu alan otomatik olarak oluşturulur. “Activate” Sayfa1’in açılması, aktif olması olayını temsil eder. “Activate” prosedürü içine aşağıdaki kodu yazın.
Private Sub Worksheet_Activate() MsgBox "Sayfa1 açıldığında/aktif olduğunda bu mesaj otomatik olarak görüntülenecektir." End Sub

Eğer “Tasarım Modu” etkin ise kapatın ve Sayfa2’ye, sonra tekrar Sayfa1’e tıklayın. Başka bir sayfadan Sayfa1’e her tıkladığınızda aşağıdaki mesaj görüntülenecektir.

Sayfa1 ögesinin açılması/aktive olması tetiklendiğinde, Sayfa1 içinde Activate prosedüründe yer alan kod çalışarak yukarıdaki mesajın görüntülenmesini sağladı. Her workbook, worksheet, userform, button, combobox, textbox vb. ögenin kendine özgü çok sayıda tetikleyicisi bulunmaktadır. Bir ögenin tetikleyicilerini incelemek için kod ekranında (yukarıdaki resimde yukarı yönlü iki büyük okla gösterilen) yer alan önce soldaki alandan ilgili ögeyi, sonra da sağdaki alandan tetikleyicisini seçin. Örneğin bir butonun kendisine basılması-tıklanması (yani click olayı) dışında birçok tetikleyicisi olduğunu göreceksiniz.
7. Excel Dosyasından Makroların Tetiklenmesi/Çağrılması
Bir modülün içine yazılan kodların veya bir sayfaya yazılmış olmakla birlikte herhangi bir varsayılan tetikleyici etiketi içinde olmayan prosedürler, siz ona bir tetikleyici atamadığınız sürece tetikleyicisi yoktur. Örneğin Sayfa1’de yer alan Sub Test() prosedürünün herhangi bir tetikleyicisi yoktur. Aynı sayfada yer alan Private Sub CommandButton1_Click() prosedürünün ise tetikleyicisi, prosedürün etiketinden de anlaşılacağı üzere CommandButton1 butonunun Click olmasıdır.
Özetle herhangi bir tetikleyici içinde yazılmayan prosedürleri “Geliştirici” sekmesi altında yer alan “Makrolar” isimli ikona tıklamak suretiyle manuel olarak tetikleyebilirsiniz/başlatabilirsiniz.

Module1’de yer alan OrnekProsedur isimli prosedür çalıştırıldığında, aşağıdaki resimde gösterildiği gibi OrnekProsedur isimli prosedür, kendisine kodladığımız mesaj gösterme görevini yerine getirmek için bir mesaj görüntüleyecektir.

İshak Kutlu, VBA Notları

Türkçe excel vba notları olarak hazırlanmış çok güzel bir sayfa. Ben excel vba’da MyHeritage Notification benzeri program bile yaptım ve ailemizin hatta köyümüzün soy kütüğünü buraya kaydettim. Bu kadar bilgim var. Fakat hala kendimi çok eksik hissediyorum. İnternetteki cicili bicili İngilizce sayfaların çoğu aynı şeylerin tekrarından ibaret. bu da beni sıkıyor. Notların tamamını henüz okumadım. Bitirdiğimde ayrıca yorum yazarım. excel vba ile ilgili daha profesyonel bilgiler öğrenmek istiyorum. Çalışmalarında başarılar dilerim.
Teşekkürler.