6.3 VBA ile Temel Kod Yazımı

VBA Nedir?

Visual Basic for Applications ifadesinin kısaltması olan VBA, Excel’in içinde makro yazmak ve otomasyon oluşturmak için kullanılan programlama dilidir. Excel’de rutin işleri otomatikleştirmek, kullanıcı etkileşimli formlar oluşturmak ve özel işlemler gerçekleştirmek için kullanılır.

Yukarıda anlatılan makro konusunda Makro Kaydet düğmesine tıkladıktan sonra makroya ait işlemleri biz yapıyorduk, Excel arka planda bizim yaptığımız işlemlere ait VBA kodlarını kendisi otomatik olarak yazıyordu. Burada ise VBA kodlarını biz yazıp bir makro adıyla kaydedeceğiz.

VBA Editörüne Erişim

  1. Alt + F11 tuşlarına basarak VBA editörünü açın.
  2. Proje Penceresi: Excel dosyanızın yapısını gösterir. VBA editör sayfasının sol tarafında bulunur.
  3. Modül Penceresi: Kodlarınızı yazacağınız alandır. Yeni modül eklemek için Insert > Module seçeneğini kullanın.
Şekil 6.1.26:VBA Editörü Penceresi

Kodlar, Proje penceresindeki BuÇalışmaKitabı seçeneğinin altında açılan modüle, Sayfa1 adlı çalışma sayfasının altında açılan modüle veya Modül penceresinde açılan standart modül (Module) sayfasına yazılabilir.

Yalnızca bir çalışma sayfasında kullanılacak, başka sayfalarda veya genel olarak tüm çalışma kitabında bir işlevi olmayan kodlar çalışma sayfasının (Sayfa1) altındaki modüle yazılır. Eğer o çalışma sayfasını başka bir çalışma kitabına kopyaladığınızda, o sayfaya özel kodların da birlikte gitmesini istiyorsanız, kodları sayfa modülüne yazmak mantıklıdır.

Kodlarınız tüm çalışma kitabıyla ilgili olaylara tepki veriyorsa (örneğin, çalışma kitabı açıldığında, kapatılırken, kaydedilirken, yeni bir sayfa eklendiğinde vb.), bu kodlar BuÇalışmaKitabı modülüne yazılmalıdır. Örneğin Çalışma kitabı açıldığında bir karşılama mesajı göstermek istiyorsanız kodların BuÇalışmaKitabı modülüne yazılması uygundur.

Standart Modül (Module) ne zaman kullanılır?

  • Genel Amaçlı Kodlar: En yaygın kullanım alanı burasıdır. Bir modül, herhangi bir sayfaya veya çalışma kitabına özgü olmayan, tüm çalışma kitabında veya hatta diğer projelerde de tekrar kullanılabilecek işlevler (Function) ve alt yordamlar (Sub) içerir.
  • Makrolar: Çalışma sayfasındaki bir butona veya klavye kısayoluna atayarak çalıştıracağınız makrolar (prosedürler).
  • Ortak Kullanılan Kodlar: Birden fazla çalışma sayfasında veya farklı olay prosedürlerinde çağrılacak işlev veya alt yordamlar. Bu, kod tekrarını önler ve yönetimi kolaylaştırır.
  • Organize Etme: Büyük projelerde kodlarınızı mantıksal gruplara ayırmak için birden fazla standart modül kullanabilirsiniz (örn. “VeriIsleme”, “Raporlama”, “YardimciFonksiyonlar” gibi).

Temel Kod Yazımı ve Örnekler

VBA editöründe İnsert sekmesinin altından Module ögesine tıklayın. Aşağıdaki gibi bir kod yazma penceresi açılacaktır. Makro kodlarının yazımı Sub ifadesi ile başlar ve End Sub ifadesi ile sonlanır.

Şekil 6.1.27:VBA Editörü Kod Yazma Penceresi (Modül)

İlk Makro Örneği

Örnek 1:

Şekil 6.1.28: Makro Örneği

Bir makroda Sub ifadesinden sonra makronun adı yazılır ve ardından Enter’a bastığınızda Excel otomatik olarak makro adının sonuna parantezler () ve alt kısma ise End Sub ifadesini ekler. MsgBox komutu bir mesaj kutusunun açılmasını sağlar.

Dolayısıyla bu kod, makro F5 tuşuna basılarak çalıştırıldığında içerisinde

Merhaba, Excel VBA’ya hoş geldiniz!

mesajının yazılı olduğu bir mesaj kutusu gösterir.

Şekil 6.1.29: Kod Çalıştırıldıktan Sonra Açılan Mesaj Kutusu

Makro, F5 tuşuna basılarak veya Excel’de Makrolar menüsünden çalıştırabilir.

Makronun her bir satırına yazdığınız komutu ayrı ayrı çalıştırmak için tüm satırlar tamamlanana kadar F8 tuşuna basın.

Hücrelere Erişim ve Değer Atama

Hücrelere erişim için Range ve Cells fonksiyonları kullanılır. Aşağıdaki Hücreislemleri adlı makroda

Range(“A1”).Value = “Excel VBA” formülü A1 hücresine değer olarak Excel VBA ifadesini ekler.

Range(“B7”).FormulaLocal = “=TOPLA(B1:B6)” formülü B7 hücresine =TOPLA(B1:B6) formülünü ekler

ActiveCell.Value  = ”Aktif Hücre” formülü makroyu çalıştırmaya başladığınızda hangi hücredeyseniz o hücrenin içeriğine Aktif Hücre ifadesini yazar.

Formüllerdeki Range(“A1”).Value ve ActiveCell.Value  ifadelerinde yer alan .Value ifadesi değer belirtir, yazılmasa da makro çalışır.

Cells(3, 4) = 15 formülü  3.satır 4.sütunda yer alan D3 hücresine 15 sayısını yazar.

Cells(5, 6) = Cells(5, 4) + Cells(5, 5) formülü D5 ve E5 hücrelerindeki sayların toplamını F5 hücresinde döndürür.

Şekil 6.1.30: Range ve Cells Fonksiyonlarının Yazımı

Yukarıdaki makroyu çalıştırmadan önce B1:B6 aralığına sırasıyla 2, 4, 6, 8, 10 ve 12 sayıları, D5 hücresine 6 ve E5 hücresine 8 girin. A7 hücresi seçiliyken F5 tuşuna basılarak makro çalıştırılırsa Excel sayfasının görünümü aşağıdaki gibi olur.

Şekil 6.1.31: Makro Çalıştırıldıktan Sonra Excel Sayfasının Görünümü

Örnek: Dörtİşlem adlı bir makro hazırlayalım.

  1. Önce Excel’de yeni bir sayfa açıp aşağıdaki tabloyu oluşturun.
Şekil 6.1.32:Dört İşlem Tablo Örneği
  1. VBA editörünü açıp aşağıdaki makroyu yazın.
Şekil 6.1.32: Dört İşlem Makrosu için Yazılan VBA Kodu

Makroyu yazarken B2 ve B3 hücrelerine girilen Sayi1 ve Sayi2 değişkenlerini Integer (tam sayı) olarak tanımlayın.

Sayi1 = Cells(2, 2) formülündeki Cells(2, 2) ifadesi B2 hücresini göstermekte ve

Sayi2 = Cells(3, 2) formülündeki Cells(3, 2) ifadesi ise B3 hücresini göstermektedir. Burada Cells(2,2) yerine Range(“B2”) ifadesi de yazılabilir.

Makronun yazımı bitince F5 tuşuna basarak makroyu çalıştırın. Excel sayfasında dört işlemin yapıldığını göreceksiniz.

Şekil 6.1.33: Makro Çalıştırıldıktan Sonra Excel Sayfasının Görünümü

Kullanıcıdan Veri Alma (InputBox)

Örnek: Kullanıcıdan adını alarak karşılama mesajı gösteren bir makro yazalım.

Şekil 6.1.34: Karşılama Mesajı Gösteren VBA Kodu Yazımı

Makro yazılırken önce Dim ad As String ifadesiyle ad isimli bir metin değişkeni tanımladık.

ad = InputBox(“Adınızı girin:”, “Kullanıcı Girişi”) ifadesi sayesinde başlığı Kullanıcı girişi olan bir veri girişi penceresi açılır. Bu pencereye girilen isim ad değişkenine atanır.

If ad <> “” Then ifadesi eğer ad boş bir şeye eşit değilse, yani bir ad girilmişse anlamına gelir.

MsgBox “Hoş geldiniz, ” & ad & “!” ifadesi mesaj kutusuna Hoş geldiniz ve ad ve ! yazılacağını gösterir.

Koşullu İşlemler (If-Then-Else)

Örnek 1:

If (Eğer) fonksiyonunun verilen koşula göre çıktı ürettiğini biliyorsunuz. Aşağıda A1 hücresine girilen puan 50 veya 50’den büyükse mesaj olarak “Geçti”, 50’den küçükse mesaj olarak “Kaldı” çıktısını veren bir makro yazılmıştır.

 

Şekil 6.1.35: Koşullu İşlemler (If-Then-Else)

Bu makroyu siz yazın ve A1 hücresine önce 60, sonra 40 puanlarını girerek makroyu iki kez çalıştırın.

Bir makro yazılırken içerikte kullanılacak değişkenlerin tanımlanması gerekmektedir.

  • Dim → Değişken tanımlamak için kullanılır. Dim ifadesinden sonra değişkene verilen ad yazılır.
  • As Integer, As String, As Double, As Boolean → Veri türleridir.

Kullanılan değişken; tam sayı ise As Integer, metin ise As String, ondalık sayı ise As Double ve mantıksal sonuç, yani DOĞRU veya YANLIŞ ise As Boolean değişken türü kullanılır. Yukarıdaki örnekte puan bir tam sayı olduğundan As Integer veri türüyle tanımlanmıştır.

Örnek 2:

Şimdi de alınan ders puanına karşılık gelen harf notunu belirlemek için, iç içe eğer kullanımını gerektiren bir makro hazırlayalım.

  1. Önce yeni bir Excel çalışma sayfası açın.
  2. Sayfaya aşağıdaki bilgileri girin.
Şekil 6.1.36:
  1. Makroyu düğmeye tıklayarak çalıştırmak için Ekle>Çizimler>Şekiller yoluyla sayfanın F3:H3 aralığına köşeleri yuvarlatılmış bir dikdörtgen ekleyin. İçine aşağıdaki gibi Harf Notunu Bul yazıp Giriş sekmesinden ortalayın.
Şekil 6.1.37:
  1. Hazırladığınız düğmeye sağ tıklayıp Makro Ata seçeneğine tıklayın. Aşağıdaki Makro Ata penceresi açılır.
Şekil 6.1.38:Makro Ata Penceresi
  1. Makro adını HarfNotu olarak düzenleyip Yeni düğmesine tıklayın. VBA editörü ve yeni bir modül sayfası açılır.
  2. Excel çalışma sayfanızda A1:B5 aralığındaki verilere göre puanın 90 ve üzeri olması durumunda AA, 80 ve üzeri olması durumunda BB, 70 ve üzeri olması durumunda CC, 50 ve üzeri olması durumunda DD ve aksi hâlde, yani 50’nin altında olması durumunda FF döndüren makroyu VBA editöründeki bu modül sayfasına aşağıdaki gibi yazın.
Şekil 6.1.39:
  1. Excel çalışma sayfanızda D6 hücresine örneğin 73 girin ve hazırladığınız Harf Notunu Bul düğmesine tıklayın. G6 hücresinde 73 puanın harf notu olan CC ifadesi aşağıdaki gibi görünecektir.
Şekil 6.1.40:

Döngüler

For…Next Döngüsü

Belirli sayıda tekrar eden işlemler için kullanılır. Döngü, belirttiğiniz bir başlangıç ve bitiş değeri arasında çalışır.

Örnek 1: C sütununa 2’den 20’ye kadar olan çift sayıları yazdıran makroyu yazalım.

Şekil 6.1.41:

Bu kodu yazarken önce i tam sayısı tanımlanır. (Dim i As Integer)

For i = 1 To 10 ifadesi sayacın 1’den 10’a kadar 10 adım çalışacağını gösterir. Çünkü döngünün başlangıç değeri1, bitiş değeri 10’dur.

Cells(i, 3).Value = i * 2 ifadesi aşağıdaki işlemleri yapar:

i=1 için (1, 3) hücresinin yani 1.satır, 3.sütunda bulunan C1 hücresinin değeri, i*2=1*2=2

i=2 için (2, 3) hücresinin yani 2.satır, 3.sütunda bulunan C2 hücresinin değeri, i*2=2*2=4 şeklinde devam eder ve en son i=10 olduğunda C10 hücresinin değeri, i*2=10*2=20 olur.

Next i ifadesi döngüyü sağlamak için bir sonraki i sayısına geçilmesini sağlar.

Başlangıçta bir düğme hazırlayıp makroyu o düğmeye atayarak hazırlamış olsaydık, düğmeye tıkladığımızda makro çalışacaktı. Şimdi ise makroyu çalıştırmak için makronun yazıldığı kod penceresindeyken F5 tuşuna basarsanız makro çalışır ve Excel çalışma sayfanızın C sütununda 2’den 20’ye kadar olan sayılar üretilir.

Örnek 2: 10’dan 1’e doğru birer birer geri sayım yapıp bu sayıları B sütununa yazdıran makroyu yazalım.

Şekil 6.1.42: For Next Örnek 2

Bu makroda For i = 10 To 1 Step -1 ifadesi i değişkeninin 10’dan 1’e doğru her adımda 1’er eksilterek ilerleneceğini gösterir.

Cells(11 – i, 2).Value = i ifadesi ise aşağıdaki işlemleri yapar:

i=10 için (1, 2) hücresinin yani 1.satır, 2.sütunda bulunan B1 hücresinin değeri i=10,

i=9 için (2, 2) hücresinin yani 2.satır, 2.sütunda bulunan B2 hücresinin değeri, i=9 şeklinde devam eder ve en son i=1 olduğunda B10 hücresinin değeri, i=1 olur.

Bu makroyu dilerseniz F8 tuşuna ardışık olarak basıp çalıştırın ve her adımda sonucu Excel sayfanızdan izleyin.

Do While…Loop Döngüsü

Belirlenen koşul sağlandığı sürece döngü çalışır (koşul başta kontrol edilir).

Örnek: Aşağıda bir firmanın üretip sattığı ürünlerden elde edilen kâr ve zararları gösteren bir tablo verilmiştir.

Şekil 6.1.43: Do While…Loop Döngüsü

Kâr yapılan satırların toplamını G2 hücresinde, zarar yapılan satırların toplamını G3 hücresinde ve genel toplamı G5 hücresinde gösteren bir makro hazırlayalım.

Şekil 6.1.44: Kâr ve Zarar Hesabı

Bu makroyu yazarken önce i ve j sayaçlarını tam sayı olarak tanımladık. Kârların toplamı için toplam1 adında, zararların toplamı için toplam2 adında iki değişken tanımladık, i ve j sayaçlarının başlangıç değerini neden 1’den değil de 2’den başlattık, çünkü kâr ve zarar değerleri Excel sayfasında 2.satırdan başlıyor.

Do While Cells(i, 4).Value <> “” ifadesi 4.sütundaki değeler boşluğa eşit olmadığı sürece

If Cells(i, 4).Value > 0 ifadesi ve bu değerler sıfırdan büyükse

toplam1 = toplam1 + Cells(i, 4).Value ifadesi i.satır ve 4.sütundaki değeri toplam1’in önceki değerine ekle anlamına gelir. Böylece D sütunundaki sıfırdan büyük olan değerler (kârlar) toplam1 değerine aktarılmış olur.

Günlük Kullanım Örnekleri

Veri Filtreleme ve Kopyalama

Örnek: Aşağıdaki tabloda bazı ürünlerin satış fiyatları, satış tarihleri ve satış sorumluları verilmiştir.

Şekil 6.1.45:

Bu veriler içinden satış fiyatı 1000 TL üzerinde olanları filtreleyen ve filtrelediği verileri Filtrelenmiş_Veri adlı bir sayfa açıp oraya kopyalayan bir makro yazalım.

Şekil 6.1.46:

Burada Range(“A1:D100″).AutoFilter Field:=2, Criteria1:=”>1000″ ifadesi, A1:D100 aralığında olan verilerden 2.sütunda yani B sütununda olanlara bakıp 1000’den büyük olma kriterine uyanları filtreler.

Range(“A1:D100”).SpecialCells(xlCellTypeVisible).Copy ifadesi filtrelenen verileri hafızaya kopyalar.

Sheets.Add.Name = “Filtrelenmiş_Veri” ifadesi Filtrelenmiş_Veri adlı yeni bir çalışma sayfası açar.

Range(“A1”).PasteSpecial ifadesi hafızadaki verileri yeni çalışma sayfasına A1 hücresinden başlayarak kopyalar.

Grafik Oluşturma

Örnek: Excel sayfasında aşağıda A1:B10 aralığında verilen verilere uygun bir sütun grafik üreten bir makro oluşturalım.

Şekil 6.1.47:
  1. Excel’de Geliştirici sekmesinin altındaki Visual Basic düğmesine tıklayın.
  2. Açılan VBA editöründe İnsert sekmesinin altından yeni bir modül ekleyin.
  3. Modüle sayfasına aşağıdaki kodları girin.
Şekil 6.1.48:
  1. Bu makroyu çalıştırdığınızda Excel sayfanızda soldan 100pt=3.5 cm içeride üstten 100pt=3.5 cm aşağıda, 300pt=10.5 cm genişliğinde ve 200pt=7 cm yüksekliğinde bir sütun grafik oluşur.

Bu makroda kullanılan With … End With yapısı, bir nesne üzerinde ardışık işlemler yapmak için kullanılır.

Böylece her satırda grafik.Chart. yazmak yerine . ile devam edilir.

.ChartType = xlColumnClustered ifadesi grafik türünün sütun grafik olacağını belirtir.

.SetSourceData Source:=Range(“A1:B10”) ifadesi veri kaynağını belirler.

.HasTitle = True ifadesi grafiğe başlık eklenip eklenmeyeceğini belirler. True olması ekleneceğini gösterir.

.ChartTitle.Text = “Satış Grafiği” ifadesi grafik başlığının Satış Grafiği olacağını belirler.

Makro çalıştırıldığında Excel sayfanıza aşağıdaki gibi bir sütun grafik eklenir.

 

Şekil 6.1.49:

Önemli İpuçları

  1. Değişken Tanımlama: Dim ile değişkenleri tanımlayın.
    • Örnek: Dim sayi As Integer, Dim metin As String
  2. Yorum Satırları: ‘ ile açıklama ekleyin.
  3. Fonksiyonlar: Function ile özel fonksiyonlar yazabilirsiniz.

Function KareAl(sayi As Double) As Double

KareAl = sayi * sayi

End Function

    4. Hızlı Erişim: Makroları butonlara atayarak kolayca çalıştırabilirsiniz.

Sonuç

Excel VBA, tekrarlanan işlemleri otomatikleştirmek ve Excel’i özelleştirmek için güçlü bir araçtır. Yukarıdaki örneklerle temel seviyede VBA kodlamaya başlayabilirsiniz. Pratik yaparak daha karmaşık senaryoları çözebilirsiniz.

Lisans

İleri Seviye Excel 365 Eğitimi ©Telif sahibi Dilanur KAYA; Salman Özdemir; ve Rafet Özdemir. Tüm hakları saklıdır.

Bu Kitabı Paylaş