Özellik ikonu

VBA

İndirme izni yok

Genel Bakış

VBA (Visual Basic for Applications), Excel ve diğer Office uygulamalarının içinde çalışan programlama dilidir. Tekrarlayan işleri makrolarla otomatikleştirmenizi, kendi işlevlerinizi yazmanızı ve hücre değişikliği gibi olaylara tepki veren çözümler kurmanızı sağlar. Kod çalışma kitabının içinde saklanır ve hücre, sayfa, çalışma kitabı gibi Excel nesnelerini doğrudan yönetir.

VBA nedir ve ne işe yarar​

VBA, Excel'e yerleşik gelen bir dildir; ayrıca bir program kurmanız gerekmez. Yazdığınız komutlar makro adı verilen prosedürler halinde çalışma kitabına kaydedilir. Bir makro; veri temizleme, rapor hazırlama, birden çok dosyayı birleştirme, hesaplama ve biçimlendirme gibi elle dakikalar süren işleri saniyelere indirebilir.

VBA ile üç temel şey yapabilirsiniz:
  • Makro (Sub): Bir işlem dizisini çalıştırır, değer döndürmez.
  • Özel işlev (Function): Değer döndürür; başka koddan ya da hücre formülünden çağrılabilir.
  • Olay yordamı: Bir hücre değiştiğinde, kitap açıldığında ya da sayfa etkinleştiğinde otomatik çalışır.
Excel'i VBA'dan yönetirken nesne modeli kullanılır: en üstte Application (Excel'in kendisi), onun altında Workbook (çalışma kitabı), Worksheet (sayfa) ve Range (hücre ya da hücre aralığı) bulunur.

VBA düzenleyicisini açmak​

Kod yazmak için Visual Basic Düzenleyicisi'ni kullanırsınız. Açmanın yolları şunlardır:
  • Klavye: Alt+F11 tuşlarına basın; aynı tuşlar düzenleyiciden Excel'e geri döndürür.
  • Şerit: Geliştirici > Visual Basic (Developer > Visual Basic) komutunu seçin.
  • Geliştirici sekmesi görünmüyorsa: Dosya > Seçenekler > Şeridi Özelleştir (File > Options > Customize Ribbon) bölümünde Geliştirici (Developer) kutusunu işaretleyin.
Düzenleyicide sık kullanılan bölümler: Proje Gezgini (Project Explorer) açık kitapları, sayfa modüllerini ve modülleri listeler; Kod penceresi kodun yazıldığı yerdir; Hemen Penceresi (Immediate Window, Ctrl+G) tek satırlık komutları denemek için uygundur.

Makroları genellikle standart modüle yazarsınız: Ekle > Modül (Insert > Module). Olay yordamları ise ilgili sayfanın kod modülüne ya da ThisWorkbook modülüne yazılır. Kodu çalıştırmak için imleci Sub içine koyup F5 tuşuna basın ya da Excel'de Geliştirici > Makrolar (Developer > Macros) penceresinden seçin.

Temel yapı ve söz dizimi​

Her VBA kodu bir prosedürün içinde yer alır. İki temel prosedür türünün söz dizimi şöyledir:
VBA 7 satır
Sub ProsedurAdi()
    ' komutlar buraya yazılır
End Sub

Function IslevAdi(parametre As Tur) As DonusTuru
    IslevAdi = deger
End Function
  • Sub ... End Sub: Makro tanımlar; parametre almayabilir ve değer döndürmez.
  • Function ... End Function: Değer döndüren prosedürdür; dönüş değeri, işlevin kendi adına atanır.
  • Dim: Değişken tanımlar; örneğin Dim i As Long. İsteğe bağlıdır ancak önerilir.
  • Option Explicit: Modülün başına yazılır; tanımlanmamış değişken kullanımını hata olarak yakalar.
  • Apostrof (') : Satırın geri kalanını yorum yapar; Excel bu kısmı çalıştırmaz.
  • Set: Nesne değişkenine atama yaparken kullanılır; örneğin bir Worksheet değişkeni için.
Bir hücreye değer yazmak için Range ya da Cells kullanılır. Cells(satır, sütun) sayısal adresleme sunduğu için döngülerde kolaylık sağlar.

Makro güvenliği ve dosya biçimi​

Makro içeren kitaplar Excel Makro Etkin Çalışma Kitabı (*.xlsm) biçiminde kaydedilmelidir. Normal .xlsx biçimi makro saklamaz; makrolu kitabı bu biçimde kaydederseniz kodlar silinir.

Güvenlik ayarlarına Geliştirici > Makro Güvenliği (Developer > Macro Security) komutuyla ulaşırsınız. Varsayılan ayarda internetten gelen ya da bilinmeyen kaynaklı dosyalardaki makrolar engellenir ve sarı bir güvenlik uyarısı görürsünüz. Yalnızca güvendiğiniz kaynaklardaki makroları etkinleştirin; güvendiğiniz klasörleri Güvenilir Konumlar (Trusted Locations) olarak tanımlayabilirsiniz.

Kod yazmadan başlamak için Geliştirici > Makro Kaydet (Developer > Record Macro) komutuyla adımlarınızı kaydedebilir, ardından oluşan kodu düzenleyicide inceleyip sadeleştirebilirsiniz. Tüm kitaplarda kullanmak istediğiniz makroları Kişisel Makro Çalışma Kitabı (Personal Macro Workbook) içinde saklayabilirsiniz.

1. Satır satır hesaplayan ilk makro​

Aşağıdaki sayfada Adet ve Birim Fiyat sütunları dolu, Tutar sütunu boştur. Kodu Alt+F11 ile açtığınız düzenleyicide Ekle > Modül ile eklediğiniz standart modüle yapıştırın. Makro her satırın tutarını hesaplar, ardından son veri satırının altına genel toplamı yazar.
VBA 23 satır
Option Explicit

Sub TutarHesapla()
    Dim ws As Worksheet
    Dim i As Long
    Dim sonSatir As Long

    Set ws = ThisWorkbook.Worksheets("Satışlar")

    ' A sütunundaki son dolu satırı bul
    sonSatir = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' Her satırda Adet x Birim Fiyat işlemini yap
    For i = 2 To sonSatir
        ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value
    Next i

    ' Toplam satırını yaz
    ws.Cells(sonSatir + 1, 1).Value = "Toplam"
    ws.Cells(sonSatir + 1, 4).Value = Application.WorksheetFunction.Sum(ws.Range(ws.Cells(2, 4), ws.Cells(sonSatir, 4)))

    ws.Range("D2:D7").NumberFormat = "#,##0.00"
End Sub
VBA
Formülünü incelemek için bir hücre seçin.
ABCD
1ÜrünAdetBirim FiyatTutar
2Defter4018,50740,00
3Kalem1206,25750,00
4Dosya7512,00900,00
5Zımba1545,00675,00
6Klasör6022,751.365,00
7Toplam4.430,00
SatışlarExcelDepo v1.0.0
Makro, döngüyle ikinci satırdan son veri satırına kadar Adet ile Birim Fiyat değerlerini çarpar. İlk ürünün tutarı 740,00, son ürünün tutarı 1.365,00 hücresine yazılır. Son satırın altına etiket olarak Toplam yazılır ve genel toplam 4.430,00 hücresinde görünür. Son satır End(xlUp) ile bulunduğu için listeye satır eklenirse kodu değiştirmeniz gerekmez; ancak Toplam satırı için biçim aralığını (D2:D7) güncellemeniz gerekir.

2. Özel işlev yazmak ve makrodan çağırmak​

Bu örnekte Function ile KDV'li tutarı hesaplayan bir özel işlev yazılır; Sub ise bu işlevi her satır için çağırıp sonucu D sütununa yazar. Her iki prosedürü de aynı standart modüle yapıştırın.
VBA 20 satır
Option Explicit

' Net tutara KDV oranını ekleyip 2 basamağa yuvarlayan özel işlev
Function KdvliTutar(ByVal net As Double, ByVal oran As Double) As Double
    KdvliTutar = Round(net * (1 + oran), 2)
End Function

' Her satır için işlevi çağırıp sonucu D sütununa yazan makro
Sub KdvEkle()
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets("KDV Hesabı")

    For i = 2 To 5
        ws.Cells(i, 4).Value = KdvliTutar(ws.Cells(i, 2).Value, ws.Cells(i, 3).Value)
    Next i

    ws.Range("D2:D5").NumberFormat = "#,##0.00"
End Sub
VBA
Formülünü incelemek için bir hücre seçin.
ABCD
1KalemNet TutarKDV OranıKDV'li Tutar
2Yazılım lisansı12.500,0020%15.000,00
3Danışmanlık hizmeti8.000,0020%9.600,00
4Toplantı yemeği3.200,0010%3.520,00
5Ofis malzemesi1.450,7520%1.740,90
KDV HesabıExcelDepo v1.0.0
KdvliTutar işlevi iki sayı alır ve Round ile yuvarlanmış sonucu döndürür; dönüş değeri işlevin kendi adına atanmıştır. KdvEkle makrosu işlevi her satır için çağırır: ilk satırın KDV'li tutarı 15.000,00, üçüncü satırınki 3.520,00 hücresine yazılır. Ayrıca işlev standart modülde ve Function olarak tanımlandığı için hücrede de KdvliTutar adıyla formül gibi kullanılabilir.

3. Olaya tepki veren kod​

Bu örnekte sayfa modülüne yazılan bir olay yordamı, B sütunundaki durum değiştiğinde C sütununa otomatik not düşer. Olay kodunu Proje Gezgini'nde Siparişler sayfasına çift tıklayıp açılan sayfa kod modülüne yapıştırın. Olayı denemek için gereken DurumDegistir makrosu, B2 hücresine yeni bir durum yazarak olayı tetikler; siz elle B sütununda bir değeri değiştirseniz de aynı sonuç oluşur.
VBA 17 satır
Option Explicit

' Sayfadaki bir hücre değiştiğinde otomatik çalışır
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Birden çok hücre değiştiyse işlem yapma
    If Target.Cells.Count > 1 Then Exit Sub
    ' Yalnızca B sütunundaki veri satırlarını izle
    If Target.Column <> 2 Or Target.Row < 2 Then Exit Sub

    On Error GoTo Temizle
    ' Kendi yazdığımız değişiklik olayı yeniden tetiklemesin
    Application.EnableEvents = False
    Cells(Target.Row, 3).Value = "Durum güncellendi: " & Target.Value
Temizle:
    ' Hata olsa da olay izlemesini mutlaka geri aç
    Application.EnableEvents = True
End Sub
VBA
Formülünü incelemek için bir hücre seçin.
ABC
1Sipariş NoDurumNot
2SP-1001HazırlanıyorDurum güncellendi: Hazırlanıyor
3SP-1002Kargoda
4SP-1003Teslim edildi
SiparişlerExcelDepo v1.0.0
DurumDegistir makrosu B2 hücresine yeni bir durum yazar. Bu değişiklik Worksheet_Change olayını tetikler ve olay yordamı aynı satırın C hücresine otomatik bir not ekler. Diğer satırlarda değişiklik olmadığı için C3 ve C4 boş kalır. Application.EnableEvents özelliği kapatılmasaydı, yordamın C hücresine yazması da yeniden olay doğurabilirdi; bu yüzden olay önce kapatılır, sonunda mutlaka açılır.

Kullanırken dikkat edin​

  • Makrolu kitabı xlsm olarak kaydedin: Kodlu bir kitabı Excel Çalışma Kitabı (*.xlsx) biçiminde kaydederseniz Excel makroları silmeyi önerir ve onaylarsanız kodlar kaybolur. Kitabı Dosya > Farklı Kaydet (File > Save As) ile Excel Makro Etkin Çalışma Kitabı (*.xlsm) biçiminde saklayın.
  • Option Explicit kullanın: Modülün başına Option Explicit yazmak, değişken adındaki yazım hatalarını çalışma anında değil, derleme sırasında yakalar. Düzenleyicide Araçlar > Seçenekler > Değişken bildirimi gerekli (Tools > Options > Require Variable Declaration) seçeneğini açarsanız yeni modüllere bu satır otomatik eklenir.
  • Select ve Activate kullanımını azaltın: Makro kaydedicinin ürettiği kodda sık görülen Select ve Activate komutları kodu yavaşlatır ve hataya açık hale getirir. Hücreye doğrudan başvurmak (örneğin ws.Cells(2, 4).Value) hem daha hızlı hem daha güvenilirdir. Uzun işlemlerde Application.ScreenUpdating özelliğini False yapıp işlem sonunda True olarak geri almak da hızı artırır.
  • Geri Al yığını temizlenir: Bir makro sayfada değişiklik yaptıktan sonra Excel'in Geri Al (Undo) geçmişi sıfırlanır; makronun yaptığı işlemi Ctrl+Z ile geri alamazsınız. Önemli verilerde makroyu denemeden önce kitabın bir kopyasını alın.
  • Olay izlemesini her zaman geri açın: Olay yordamında Application.EnableEvents özelliğini False yaparsanız, hata olsa bile True değerine döndürmeyi garanti edin; aksi halde Excel kapanana kadar olaylar çalışmaz. Hata yakalama için On Error GoTo etiketi kullanın.
  • Sürüm ve platform farkları: VBA, Excel for the web'de (tarayıcı sürümü) çalışmaz; orada Office Komut Dosyaları (Office Scripts) kullanılır. Mac sürümünde dosya yolları, bazı ActiveX denetimleri ve Windows'a özgü işlevler desteklenmez. 64 bit Office'te dış kitaplık çağıran eski kodlarda PtrSafe anahtar sözcüğü gerekebilir.
  • İlgili konular:
    • Sub ve Function deyimleri: Makro ve özel işlev tanımlama
    • Dim ve Option Explicit: Değişken tanımlama
    • Range ve Cells: Hücrelere başvurma
    • Worksheet ve Workbook nesneleri: Sayfa ve kitap yönetimi
    • Application nesnesi: ScreenUpdating, EnableEvents gibi Excel ayarları
    • Worksheet_Change ve Workbook_Open olayları
    • MsgBox ve InputBox: Kullanıcıyla iletişim
    • Makro Kaydedici (Macro Recorder) ve Geliştirici sekmesi
    • TOPLA, EĞER ve DÜŞEYARA işlevleri: Aynı işlerin formülle çözümü
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
21
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst