- 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
- 1Developer sekmesini göster
File › Options › Customize Ribbon› sağdaki listedeDeveloper'ı işaretle ›OK. - 2Kaydı 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çinPersonal Macro Workbook) ›OK. - 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Çalıştır
Alt+F8›FormatReport›Runya da doğrudanCtrl+Shift+R.Insert › Illustrations › Shapesile bir düğme çizip sağ tık ›Assign Macro…de yapabilirsin.
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 SubSelect satırına dönüşür.Sub FormatReport()
With Range("A1:F1")
.Font.Bold = True
.Interior.Color = RGB(221, 235, 247)
End With
Columns("A:F").AutoFit
End SubSelect/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(…)ç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.
“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Çözümü gizle
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.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 Sub2 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ür | Ne tutar | Örnek |
|---|---|---|
Long | tam sayı (satır numaraları, sayaçlar) | Dim r As Long |
Double | ondalıklı sayı (tutarlar, oranlar) | Dim rate As Double |
String | metin | Dim client As String |
Date | tarih ve saat | Dim due As Date |
Worksheet, Range | nesne — Set ile atanır | Set ws = ActiveSheet |
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.
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Çözümü gizle
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çim | Makro saklar mı? | Not |
|---|---|---|
| .xlsx | hayır | böyle kaydedersen Excel uyarır ve kod silinir |
| .xlsm | evet | makro içerebilen çalışma kitabı — standart seçim |
| .xlsb | evet | ikili biçim: büyük dosyalar için daha küçük ve hızlı |
| PERSONAL.XLSB | evet | kişisel makrolar — Excel her açıldığında gizlice yüklenir |
Macros penceresi: seç ve çalıştırAlt+F8Immediate penceresiCtrl+GÖnemli noktalar
- Makro işlemleri VBA kodu olarak saklar;
Developer › Record Macroile başla,Alt+F8ile çalıştır. - Nesne hiyerarşisi: Workbook › Worksheet › Range;
Selectyerine nesnelerle doğrudan çalış. For…Nextsatırları dolaşır,If…Then…Elsekarar verir;Functionsayfada 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.
.xlsx olarak kaydedersen ne olur?