Vba-Makro Öğrenmek İçin Temel Kavramlar-3

V

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 Sub

Kullanı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 Sub

Yukarı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 Sub

Her 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 ButonDöndürülen SabitDöndürülen Değer
OkvbOk1
CancelvbCancel2
AbortvbAbort3
RetryvbRetry4
IgnorevbIgnore5
YesvbYes6
NovbNo7

Ö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 Sub

Not: 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 Sub

Bir ö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ı

Yorum Yap

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube