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 ile üç temel şey yapabilirsiniz:
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.
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.
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.
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.
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.
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.
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.
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.
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Birim Fiyat | Tutar |
| 2 | Defter | 40 | 18,50 | 740,00 |
| 3 | Kalem | 120 | 6,25 | 750,00 |
| 4 | Dosya | 75 | 12,00 | 900,00 |
| 5 | Zımba | 15 | 45,00 | 675,00 |
| 6 | Klasör | 60 | 22,75 | 1.365,00 |
| 7 | Toplam | 4.430,00 |
SatışlarExcelDepo v1.0.0
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.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Kalem | Net Tutar | KDV Oranı | KDV'li Tutar |
| 2 | Yazılım lisansı | 12.500,00 | 20% | 15.000,00 |
| 3 | Danışmanlık hizmeti | 8.000,00 | 20% | 9.600,00 |
| 4 | Toplantı yemeği | 3.200,00 | 10% | 3.520,00 |
| 5 | Ofis malzemesi | 1.450,75 | 20% | 1.740,90 |
KDV HesabıExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Sipariş No | Durum | Not |
| 2 | SP-1001 | Hazırlanıyor | Durum güncellendi: Hazırlanıyor |
| 3 | SP-1002 | Kargoda | |
| 4 | SP-1003 | Teslim edildi |
SiparişlerExcelDepo v1.0.0
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ü