VBA|Seviye|Başlangıç
1. Makro Kaydetmek
Makro kaydetmek, özellikle bir işlemin VBA ile nasıl kodlandığını bilmiyorsanız çok yararlıdır. Söz gelimi aşağıdaki gibi bir listemiz olsun ve listede yer alan fiyatları bindelik ayraçlar ve ondalık hanelerde ifade etmek isteyelim. Geliştirici Sekmesi altında bulunan Makro Kaydet ikonuna tıklanır ve açılan pencerede Bu Çalışma Kitabı seçilir ve Tamam butonuna tıklanır.

Not: Eğer bir makro sadece belirli bir Workbook’tan çalıştırılmayacaksa, yani herhangi bir Workbook’tan çalıştırılacaksa, Bu Çalışma Kitabı (ThisWorkbook) yerine Kişisel Makro Çalışma Kitabı (Personal Macro Workbook) seçeneği seçilir.
D2 ve D9 arasındaki hücreler seçilir, sağ tık yapılır ve Hücreleri Biçimlendir (Format Cells) tıklanır ve aşağıdaki resimde gösterilen adımlar izlenir.

Daha sonra aşağıdaki resimde gösterildiği gibi Kaydı Durdur ikonuna tıklanır. Kaydedilen kodları görmek için Visual Basic ikonuna tıklanarak VBA editörüne ulaşılır.

Makro Kaydet aşamasında makrolar otomatik olarak bir modüle kaydedilir. Modules klasörü içinde birden fazla modül varsa, modülleri kontrol edebilirsiniz. Yukarıda kaydedilen makro, aşağıdaki resimde gösterildiği gibi Module1 içinde Makro1 isminde bir prosedür içine kaydedilmiş olduğunu görüyoruz.
Sub Makro1()
Range("D2:D9").Select
Selection.NumberFormat = "#,##0.00"
End Sub
Yukarıda yer alan kodu “makro çağırmak” yoluyla çalıştırabileceğiniz gibi CommandButton1 gibi bir tetikleyici içine de yuvalandırabilirsiniz. Bunun için “Tasarım Modu”nu etkinleştirin ve Örnek isimli sayfada bir buton oluşturun ve butonun üzerine çift tıklayıp VBA editörüne ulaşın. Sonra da kaydedilen makroyu aşağıdaki resimde gösterildiği gibi kopyalayıp buton prosedürünün içine yapıştırın.
Private Sub CommandButton1_Click()
Range("D2:D9").Select
Selection.NumberFormat = "#,##0.00"
End Sub
Tasarım modundan çıkın. Önce butonun doğru çalıştığını görebilmek için bir önceki aşamada D2 ve D9 arasındaki hücrelerde yapılan biçimlendirme işlemini geri alın. Bunun için D2 ve D9 arasındaki hücreleri seçin, sağ tık yapın, Hücreleri Biçimlendir seçeneğini tıklayın ve açılan pencereden Genel (General) sekmesini tıklayıp Tamam butonuna tıklayın.

Butona tıkladığınızda sonuç aşağıdaki gibi olacaktır.

D2 ve D7 arasındaki hücrelerin formatını değiştirmek için Select methodunun kullanılmasını istemiyorsanız, buton içindeki kodları aşağıdaki gibi düzenleyebilirsiniz.
Private Sub CommandButton1_Click()
Range("D2:D9").NumberFormat = "#,##0.00"
End Sub
Önce butonun doğru çalıştığını görebilmek için bir önceki aşamada D2 ve D9 arasındaki hücrelerde yapılan biçimlendirme işlemini geri alın. Bunun için D2 ve D9 arasındaki hücreleri seçin, sağ tık yapın, Hücreleri Biçimlendir seçeneğini tıklayın ve açılan pencereden Genel (General) sekmesini tıklayıp Tamam butonuna tıklayın. Örnek isimli sayfada oluşturduğunuz butonu tıkladığınızda kodlar, Select yapmadan doğrudan ilgili hücrelerin formatını aşağıdaki şekilde değiştirecektir.

2. Araç Çubuğuna Makro Kısayolu Eklemek
Bir makroyu veya prosedürü Excel’in araç çubuğuna kısayol olarak ekleyebilirsiniz. Bunun için aşağıdaki resimde gösterildiği gibi araç çubuğu üzerinde boş bir yere sağ tıklayın ve Şeridi Özelleştir… seçeneğine tıklayın.

Açılan pencerede aşağıdaki adımları izleyin. 3 no.lu adım araç çubuğuna eklemek istediğiniz çalışma kitabının (Workbook’un) adını ifade etmektedir. 4 no.lu adım ise hangi makroyu araç çubuğuna eklemek istediğinize ilişkindir. Yukarıda Makro1 isimli bir hücre biçimlendirme makrosu oluşturduğumuz için örnek olarak da Makro1 isimli makro kullanıldı.

Araç çubuğunda makronuzun nasıl bir ikon ile görüntülenmesini istiyorsanız, aşağıdaki resimde gösterildiği gibi adımları izleyiniz ve bir ikon seçiniz.

Eklediğiniz ikon aşağıdaki resimde gösterildiği gibi görüntülenecektir.

Araç çubuğuna eklediğiniz ikona tıkladığınızda Makro1 isimli makroda bulunan kodlar çalışarak kendisinden beklenen görevi yerine getirecektir. Sonuç aşağıdaki resimde gösterilmiştir.

3. VBA Projesini veya Makroları Şifrelemek
VBA projenize veya makrolarınıza ilişkin kodların erişilebilirliğini engellemek istiyorsanız projenize şifre koyabilirsiniz. Bunun için VBA editörünü açın ve aşağıdaki adımları izleyin.

Aşağıdaki resimde gösterilen adımları izleyin, 3 ve 4 no.lu alanlara şifrenizi girin.

Yukarıdaki adımları tamamladıktan sonra Excel dosyanızı (yani projenizi) kaydedip kapatın. Sonra projenizi tekrar açtığınızda yaptığınız işlem VBA projenize uygulanmış olacaktır. Aşağıdaki resimde gösterildiği gibi VBA editörüne gidip VBAProject isimli ögeye tıkladığınızda projenize ilişkin kodları görüntülemek için şifre isteyecektir.

Daha önceki aşamada oluşturduğunuz şifreyi girip OK butonuna tıklarsanız, aşağıdaki resimde gösterildiği gibi VBA projenizin kaynak kodlarına erişebilirsiniz.

4. Mesaj Kutuları-MsgBox
Mesaj kutuları, web sitelerde yer alan pop-up tipi mesajlara benzer. Belirli bir durum gerçekleştiğinde kullanıcıya bir bilgi vermek istenildiğinde ve veya işleme devam edilip edilmeyeceğinin sorulması istendiğinde vb. mesaj kutularından yararlanılır. Aşağıda basit bir mesaj kutusu için örnek verilmiştir.
Private Sub CommandButton1_Click()
MsgBox "İşleme devam edilecektir."
Range("D2:D9").NumberFormat = "#,##0.00"
End Sub
Mesaj kutusunda yazan Microsoft Excel ifadesini aşağıdaki şekilde özelleştirebilirsiniz.
Private Sub CommandButton1_Click()
MsgBox "İşleme devam edilecektir.", vbOKOnly, "www.ishakkutlu.com"
Range("D2:D9").NumberFormat = "#,##0.00"
End Sub
Aşağıdaki gibi bir kod yazarsanız da Tamam/Ok butonuna ilave olarak İptal/Cancel butonu görüntülenir.
Private Sub CommandButton1_Click()
MsgBox "İşleme devam edilecektir.", vbOK, "www.ishakkutlu.com"
Range("D2:D9").NumberFormat = "#,##0.00"
End Sub
Not: vbOK ile vbOKCancel kodu aynıdır.
Mesajın içindeki butonları aşağıdaki kodlarla çeşitlendirebilirsiniz.
Private Sub CommandButton1_Click()
MsgBox "Bu bir vbOKOnly mesajıdır.", vbOKOnly, "www.ishakkutlu.com"
MsgBox "Bu bir vbOKCancel mesajıdır.", vbOKCancel, "www.ishakkutlu.com"
MsgBox "Bu bir vbYesNo mesajıdır.", vbYesNo, "www.ishakkutlu.com"
MsgBox "Bu bir vbYesNoCancel mesajıdır.", vbYesNoCancel, "www.ishakkutlu.com"
MsgBox "Bu bir vbRetryCancel mesajıdır.", vbRetryCancel, "www.ishakkutlu.com"
MsgBox "Bu bir vbAbortRetryIgnore mesajıdır.", vbAbortRetryIgnore, "www.ishakkutlu.com"
Range("D2:D9").NumberFormat = "#,##0.00"
End SubKullanıcıya verilmek istenen mesajın önemini aşağıdaki gibi farklılaştırabiliriz.
Private Sub CommandButton1_Click()
MsgBox "Bu bir vbCritical mesajıdır.", vbOKOnly + vbCritical, "www.ishakkutlu.com"
MsgBox "Bu bir vbExclamation mesajıdır.", vbOKCancel + vbExclamation, "www.ishakkutlu.com"
MsgBox "Bu bir vbQuestion mesajıdır.", vbYesNo + vbQuestion, "www.ishakkutlu.com"
MsgBox "Bu bir vbInformation mesajıdır.", vbYesNoCancel + vbInformation, "www.ishakkutlu.com"
Range("D2:D9").NumberFormat = "#,##0.00"
End Sub



Bir mesaj kutusunu, bizim tarafımızdan oluşturulan bir değişkene aşağıdaki gibi bağlayabiliriz.
Private Sub CommandButton1_Click()
Dim Bilgi As Variant
Bilgi = MsgBox("Bu bir vbCritical mesajıdır.", vbOKOnly + vbCritical, "www.ishakkutlu.com")
Bilgi = MsgBox("Bu bir vbExclamation mesajıdır.", vbOKCancel + vbExclamation, "www.ishakkutlu.com")
Bilgi = MsgBox("Bu bir vbQuestion mesajıdır.", vbYesNo + vbQuestion, "www.ishakkutlu.com")
Bilgi = MsgBox("Bu bir vbInformation mesajıdır.", vbYesNoCancel + vbInformation, "www.ishakkutlu.com")
Range("D2:D9").NumberFormat = "#,##0.00"
End SubYukarıda Bilgi isminde ve Variant tipinde bir değişken tanımladık. Bunu Dim Mesaj As Variant şeklinde kendiniz de adlandırabilirsiniz. Ancak prosedürün başında yer alan Dim … As Variant şeklinde deklarasyonu yapmalı ve takip eden kodlarda da “Bilgi” yerine başlangıçta deklare ettiğiniz (örneğin) “Mesaj” ismini kullanmalısınız. Örnek aşağıdadır.
Private Sub CommandButton1_Click()
Dim Mesaj As Variant
Mesaj = MsgBox("Bu bir vbCritical mesajıdır.", vbOKOnly + vbCritical, "www.ishakkutlu.com")
Mesaj = MsgBox("Bu bir vbExclamation mesajıdır.", vbOKCancel + vbExclamation, "www.ishakkutlu.com")
Mesaj = MsgBox("Bu bir vbQuestion mesajıdır.", vbYesNo + vbQuestion, "www.ishakkutlu.com")
Mesaj = MsgBox("Bu bir vbInformation mesajıdır.", vbYesNoCancel + vbInformation, "www.ishakkutlu.com")
Range("D2:D9").NumberFormat = "#,##0.00"
End SubHer iki prosedür de yukarıda yer alan 4 görsel ile aynı sonucu döndürecektir. Mesaj kutularına bir değişken atamanın arkasında yatan mantık, kullanıcının mesaj kutularına (Tamam, İptal, Evet, Hayır vb. butonlara tıklamak suretiyle) verdiği alternatif yanıtlara kodların alternatif tepkiler vermesinin sağlanmasıdır. Çünkü mesaj kutularında yer alan butonlara tıklandığında derleyici aşağıdaki tabloda gösterilenlerden bir değer döndürür.
| Tıklanan Buton | Döndürülen Sabit | Döndürülen Değer |
| Ok | vbOk | 1 |
| Cancel | vbCancel | 2 |
| Abort | vbAbort | 3 |
| Retry | vbRetry | 4 |
| Ignore | vbIgnore | 5 |
| Yes | vbYes | 6 |
| No | vbNo | 7 |
Örneğin kullanıcın İptal/Cancel butonuna tıkladığını aşağıdaki kodlarla anlayabiliriz.
Private Sub CommandButton1_Click()
Dim Bilgi As Variant
Bilgi = MsgBox("Kullanıcının mesaj kutusunda yer alan hangi butona tıkladığını anlamak istiyoruz.", vbOKCancel + vbExclamation, "www.ishakkutlu.com")
If Bilgi = 2 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 Sub

İptal/Cancel butonuna tıklandığının bilgisi Bilgi = 2 değeri yerine Bilgi = vbCancel olarak da elde edilebilir.
Private Sub CommandButton1_Click()
Dim Bilgi As Variant
Bilgi = MsgBox("Kullanıcının mesaj kutusunda yer alan hangi butona tıkladığını anlamak istiyoruz.", vbOKCancel + vbExclamation, "www.ishakkutlu.com")
If Bilgi = 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 SubNot: Mesaj kutusunun sağ üst köşesinde yer alan x işaretine tıklamak ile İptal/Cancel butonuna tıklamak aynı değeri, yani 2 (vbCancel) değerini döndürür.


Yukarıda dikkat edilirse mesaj kutularında ilk buton varsayılan olarak seçili gelir. Örneğin Tamam ve İptal butonunun görüntülendiği bir mesaj kutusunda ilk buton Tamam olduğu için Tamam butonu seçilidir. Diğer bir ifadeyle mesaj kutusu açıldığında klavyenin Enter tuşuna basarsanız, seçili buton olan Tamam butonuna tıklamış olursunuz. Ancak açılan mesaj kutularında seçili butonu kendiniz belirleyebilirsiniz.
Private Sub CommandButton1_Click()
Dim Bilgi As Variant
Bilgi = MsgBox("Mesaj kutusu açıldığında seçili butonun Hayır butonu olmasını istiyoruz.", vbYesNoCancel + vbDefaultButton2 + vbExclamation, "www.ishakkutlu.com")
If Bilgi = vbNo Then
MsgBox "Bir önceki görüntülenen mesaj kutusunda, klavyenin enter tuşuna bastığınız için Hayır butonuna tıklamış oldunuz.", vbOKOnly, "www.ishakkutlu.com"
ElseIf Bilgi = vbYes Then
MsgBox "Bir önceki görüntülenen mesaj kutusunda Evet butonuna tıkladınız.", vbOKOnly, "www.ishakkutlu.com"
ElseIf Bilgi = vbCancel Then
MsgBox "Bir önceki görüntülenen mesaj kutusunda İptal butonuna tıkladınız.", vbOKOnly, "www.ishakkutlu.com"
End If
End Sub

Mesaj kutuları ile ilgili daha fazla bilgi için aşağıdaki bağlantıları inceleyebilirsiniz.
https://analysistabs.com/vba/msgbox/
https://trumpexcel.com/vba-msgbox/
5. Girdi Kutuları-InputBox
Girdi kutuları (InputBox) kullanıcının bir değer girebildiği özelleştirilmiş mesaj kutularıdır. Söz gelimi şifre ile çalıştırılacak ve şifresi de 1234 olan bir görev varsa, bu görevi basitçe aşağıdaki kodlarla kurgulayabiliriz.
Private Sub CommandButton1_Click()
Dim Sifre As Variant
Sifre = InputBox("Lütfen işleme devame etmek için şifreyi giriniz.", Title:="www.ishakkutlu.com")
If Sifre = "1234" Then
MsgBox "Doğru şifre girildi.", vbOKOnly, "www.ishakkutlu.com"
GoTo IslemeDevamEt
ElseIf Sifre <> "" And Sifre <> "1234" Then 'Şifre alanı boş değil, ancak 1234 değerine de eşit değil; yani şifre yanlış girildi.
MsgBox "Şifre hatalı girildi.", vbOKOnly, "www.ishakkutlu.com"
GoTo Son
Else
MsgBox "Şifre boş bırakıldı veya İptal butonuna tıklandı veya InputBox sağ üst köşede yer alan x işaretinden kapatıldı.", vbOKOnly, "www.ishakkutlu.com"
GoTo Son
End If
IslemeDevamEt:
'Şifre doğru girildiğinde çalışacak kodları buraya yazabiliriz.
'
'
Son:
'Şifre boş bırakıldığında, şifre iptal edildiğinde veya yanlış girildiğinde derleyici yukarıdaki kodları atlayıp doğrudan buradan sonraki kodları okuyacaktır.
'
'
End SubŞifre doğru girilir ve Tamam butonuna tıklanırsa aşağıdaki gibi bir sonuç gerçekleşecektir.


Şifre boş bırakılıp Tamam butonuna tıklanırsa, İptal butonuna tıklanırsa veya pencere sağ üst köşede yer alan x işaretinden kapatılırsa aşağıdaki gibi bir sonuç gerçekleşecektir.

Hatalı şifre girilmesi durumunda sonuç aşağıdaki gibi olacaktır.


Yukarıdaki kurgu alternatif olarak aşağıdaki kodlarla da yapılabilir.
Private Sub CommandButton1_Click()
Dim Sifre As Variant
Sifre = InputBox("Lütfen işleme devam etmek için şifreyi giriniz.", Title:="www.ishakkutlu.com")
Select Case StrPtr(Sifre)
Case 0
MsgBox "İptal butonuna tıklandı veya InputBox sağ üst köşede yer alan x işaretinden kapatıldı.", vbOKOnly, "www.ishakkutlu.com"
GoTo Son
Case Else
If Sifre = "1234" Then
MsgBox "Doğru şifre girildi.", vbOKOnly, "www.ishakkutlu.com"
GoTo IslemeDevamEt
ElseIf Sifre <> "" And Sifre <> "1234" Then
MsgBox "Şifre hatalı girildi.", vbOKOnly, "www.ishakkutlu.com"
GoTo Son
ElseIf Sifre = "" Then
MsgBox "Şifre boş bırakıldı.", vbOKOnly, "www.ishakkutlu.com"
GoTo Son
End If
End Select
IslemeDevamEt:
'Şifre doğru girildiğinde çalışacak kodları buraya yazabiliriz.
'
'
Son:
'Şifre boş bırakıldığında, şifre iptal edildiğinde veya yanlış girildiğinde derleyici yukarıdaki kodları atlayıp doğrudan buradan sonraki kodları okuyacaktır.
'
'
End SubBir önceki kurguya ilave olarak bu kurguda, Şifre alanının boş bırakılması ve Tamam butonuna tıklanması senaryosu ayrı bir koşula bağlanmıştır.


İshak Kutlu, VBA Notları
