İçeriğe geç
Educora
Üniversite25 dk25 / 27

Makrolar ve VBA: tekrarlanan işi otomatikleştir

Makro kaydetme, VBA düzenleyicisinde kodu okuma ve temizleme, döngü ve koşul içeren basit bir Sub ile kendi işlevini yazma, ayrıca makro güvenliği ve .xlsm biçimi.

Kendini test et
Bu derste öğreneceklerin
  • Developer sekmesini açmak, makro kaydetmek ve çalıştırmak
  • VBA nesne modelini (Workbook › Worksheet › Range) anlamak
  • For…Next döngüsü ve If…Then koşulu içeren bir Sub yazmak, kendi işlevini oluşturmak
  • Makro güvenliğini ve dosya biçimlerini doğru yönetmek

Nigar her sabah sistemden bir rapor indiriyor ve 10 dakika aynı işi yapıyor: kalın başlık, dolgu rengi, sütun genişlikleri, ödenmemiş faturaları kırmızıyla işaretleme. Bir yılda bu 40 saati aşar. Makro bu hareketleri kaydeder ve tek tuşla tekrarlar; VBA (Visual Basic for Applications) ise makroların yazıldığı programlama dilidir.

Makro kaydetme

  1. 1
    Developer sekmesini göster

    File › Options › Customize Ribbon › sağdaki listede Developer'ı işaretle › OK.

  2. 2
    Kaydı başlat

    Developer › Code › Record Macro. Ad: FormatReport (boşluksuz), kısayol: Ctrl+Shift+R, Store macro in: This Workbook (ya da tüm dosyalar için Personal Macro Workbook) › OK.

  3. 3
    İşlemleri yap ve durdur

    Başlığı biçimlendir, sütun genişliklerini ayarla, sonra Developer › Code › Stop Recording. Her tıklama koda dönüşür; gereksiz tıklamalardan kaçın.

  4. 4
    Çalıştır

    Alt+F8 › FormatReport › Run ya da doğrudan Ctrl+Shift+R. Insert › Illustrations › Shapes ile bir düğme çizip sağ tık › Assign Macro… de yapabilirsin.

Text
Sub FormatReport()
    Range("A1:F1").Select
    Selection.Font.Bold = True
    Selection.Interior.Color = RGB(221, 235, 247)
    Columns("A:F").Select
    Selection.Columns.AutoFit
End Sub
Kaydedicinin ürettiği kod (sadeleştirilmiş): her tıklama ayrı bir Select satırına dönüşür.
Text
Sub FormatReport()
    With Range("A1:F1")
        .Font.Bold = True
        .Interior.Color = RGB(221, 235, 247)
    End With
    Columns("A:F").AutoFit
End Sub
Temizlenmiş sürüm: Select/Selection yerine nesneyle doğrudan çalışmak (With … End With) kodu hem kısaltır hem hızlandırır.

VBA düzenleyicisi ve nesne modeli

Alt+F11 VBA düzenleyicisini (VBE) açar. Solda Project Explorer (Ctrl+R) çalışma kitaplarını ve modülleri gösterir; yeni kod için Insert › Module. Alttaki Immediate penceresinde (Ctrl+G) tek satırlık komutları deneyebilirsin: ?Range("A1").Value yazıp Enter'a bas. Excel'deki her şey bir nesnedir ve nesneler bir hiyerarşi oluşturur:

Workbooks("Sales.xlsm").Worksheets("Data").Range("B2").Value = 1500
burada:
  • Workbooks(…)çalışma kitabı (dosya)
  • Worksheets(…)çalışma sayfası
  • Range(…) / Cells(row, col)hücre ya da aralık; Cells(2, 2) = B2
  • .Value, .Font, .ClearContentsözellikler (neye sahip) ve yöntemler (ne yapar)

Yol büyükten küçüğe noktalarla yazılır; etkin kitap ve sayfa kastediliyorsa yalnızca Range("B2") yeterlidir.

Gecikmiş faturaları işaretleyen makro

“Invoices” sayfası, A:D sütunları: numara, müşteri, vade, durum. Satırlar: INV-101 (15.09.2026, Paid), INV-102 (20.09.2026, Unpaid), INV-103 (30.09.2026, Unpaid), INV-104 (10.09.2026, Unpaid), INV-105 (25.09.2026, Paid), INV-106 (01.10.2026, Unpaid). Bugün 27.09.2026. Ödenmemiş ve vadesi geçmiş satırları pembeye boya ve sayılarını göster.

Çözümü göster
Aşağıdaki kod son dolu satırı bulur, For…Next ile 2. satırdan sona kadar ilerler ve If … And … Then ile iki koşulu kontrol eder.
İki koşul birlikte yalnızca INV-102 (20.09 < 27.09) ve INV-104 (10.09 < 27.09) için doğrudur; INV-103 ile INV-106'nın vadesi henüz gelmedi.
Sonuç: iki satır boyanır ve ileti kutusunda “2 overdue invoice(s)” görünür.
Else kısmı eski rengi temizler; bu yüzden makro her gün yeniden çalıştırılabilir.
Text
Sub HighlightOverdue()
    Dim ws As Worksheet
    Dim lastRow As Long, r As Long, overdue As Long
    Set ws = ThisWorkbook.Worksheets("Invoices")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    For r = 2 To lastRow
        If ws.Cells(r, "D").Value = "Unpaid" And ws.Cells(r, "C").Value < Date Then
            ws.Cells(r, "A").Resize(1, 4).Interior.Color = RGB(255, 199, 206)
            overdue = overdue + 1
        Else
            ws.Cells(r, "A").Resize(1, 4).Interior.Pattern = xlNone
        End If
    Next r
    MsgBox overdue & " overdue invoice(s)", vbInformation
End Sub
Beklenen çıktı
2 overdue invoice(s)
Dim değişkenleri bildirir, Date bugünün tarihidir, End(xlUp) ise Ctrl+↑ gibi son dolu hücreye atlar. Adım adım izlemek için imleci Sub'ın içine koy ve F8'e bas.
TürNe tutarÖrnek
Longtam sayı (satır numaraları, sayaçlar)Dim r As Long
Doubleondalıklı sayı (tutarlar, oranlar)Dim rate As Double
StringmetinDim client As String
Datetarih ve saatDim due As Date
Worksheet, Rangenesne — Set ile atanırSet ws = ActiveSheet
Modülün en üstüne Option Explicit yaz: bildirilmemiş bir değişken (örneğin overdue yerine overdeu) hemen hata olarak gösterilir.

Bir aralığın her hücresini dolaşmak için For Each daha kısadır: For Each c In Range("C2:C7") … Next c. Büyük tablolarda makroyu hızlandırmak için başta Application.ScreenUpdating = False yaz, sonda yeniden True yap; ekran her değişiklikten sonra yeniden çizilmez.

Kendi işlevin: KDV'li fiyat

Sayfada =WithVAT(100) ve =WithVAT(250,0.1) olarak kullanılan, varsayılan oranı %18 olan bir işlev oluştur. Sonuçlar ne olur?

Çözümü göster
Bir modüle Function yaz (Sub'dan farklı olarak değer döndürür):
Function WithVAT(price As Double, Optional rate As Double = 0.18) As Double
WithVAT = price * (1 + rate)
End Function
=WithVAT(100) → 100 · 1,18 = 118; =WithVAT(250,0.1) → 250 · 1,1 = 275.
İşlev, Insert Function listesinde User Defined kategorisinde görünür.

Güvenlik ve .xlsm

BiçimMakro saklar mı?Not
.xlsxhayırböyle kaydedersen Excel uyarır ve kod silinir
.xlsmevetmakro içerebilen çalışma kitabı — standart seçim
.xlsbevetikili biçim: büyük dosyalar için daha küçük ve hızlı
PERSONAL.XLSBevetkişisel makrolar — Excel her açıldığında gizlice yüklenir
VBA düzenleyicisini aç/kapatAlt+F11
Macros penceresi: seç ve çalıştırAlt+F8
VBE'de: imlecin bulunduğu Sub'ı çalıştırF5
VBE'de: satır satır ilerleF8
VBE'de: kesme noktası koy/kaldırF9
VBE'de: Immediate penceresiCtrl+G

Önemli noktalar

  • Makro işlemleri VBA kodu olarak saklar; Developer › Record Macro ile başla, Alt+F8 ile çalıştır.
  • Nesne hiyerarşisi: Workbook › Worksheet › Range; Select yerine nesnelerle doğrudan çalış.
  • For…Next satırları dolaşır, If…Then…Else karar verir; Function sayfada kullanılan kendi işlevini oluşturur.
  • Ctrl+Z bir makroyu geri almaz; kopyada dene.
  • Makrolar yalnızca .xlsm/.xlsb'de saklanır; güvenmediğin dosyada makroları etkinleştirme.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Makrolu bir çalışma kitabını .xlsx olarak kaydedersen ne olur?