ACCESS VBA OTOMASYONU

OfisData7 dk okuma
Access logosu ile kod satırları ve otomatik işleyen veritabanı görevlerini simgeleyen kompozisyon

Her pazartesi aynı ritüel: Siparisler tablosunu aç, durumu "Beklemede" olan kayıtları filtrele, tek tek "Onaylandi" yap, sonra listeyi Excel'e kopyalayıp muhasebeye gönder. Yirmi dakika, her hafta, aynı tıklamalar. Bu işin doğru adresi bir insan değil, dört satırlık bir döngüdür — ve Access, o döngüyü yazacağınız dili içinde taşır: VBA.

Bu yazının örnek dosyası gerçek bir otomasyon modülü içeriyor: modOtomasyon adlı modülde, bekleyen siparişleri topluca onaylayan ve onaylıları Excel'e aktaran iki prosedür. Kod ekran görüntüleri ve makaledeki kod blokları dosyadakiyle birebir aynı; indirip Alt+F11 ile kendiniz inceleyebilirsiniz.

VBA örneğini indir (.accdb) — hazır otomasyon kodu içinde

1. VBA Editörü ve Modül Yapısı

Access'te kod, veritabanının içinde modüllerde yaşar. Alt+F11 tuşuyla açılan Visual Basic editörü, soldaki proje ağacında dosyanın modüllerini listeler; örnek dosyada tek modül var: modOtomasyon.

VBA editöründe modOtomasyon modülü: proje ağacı ve renklendirilmiş BekleyenleriOnayla prosedür kodu

Modülün tepesindeki iki satır alışkanlık edinilmesi gereken türden: Option Compare Database metin karşılaştırma davranışını belirler, Option Explicit ise tanımlanmamış değişken kullanımını derleyici hatasına çevirir. İkincisi özellikle değerlidir — değişken adındaki yazım hatasını çalışma anında sessiz bir mantık hatası olarak değil, daha yazarken kırmızı uyarı olarak yakalarsınız.

2. Recordset ile Toplu Güncelleme

Modülün ilk prosedürü, pazartesi ritüelini bitiren kod. Dosyadaki hâliyle:

' Bekleyen siparisleri topluca onaylar ve sonucu raporlar
Public Sub BekleyenleriOnayla()
    On Error GoTo Hata

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim sayac As Long

    Set db = CurrentDb()
    Set rs = db.OpenRecordset("SELECT * FROM Siparisler WHERE Durum = 'Beklemede'")

    Do While Not rs.EOF
        rs.Edit
        rs!Durum = "Onaylandi"
        rs.Update
        sayac = sayac + 1
        rs.MoveNext
    Loop

    rs.Close
    MsgBox sayac & " siparis onaylandi.", vbInformation
    Exit Sub

Hata:
    MsgBox "Hata " & Err.Number & ": " & Err.Description, vbCritical
End Sub

Akış dört hamlede okunur: OpenRecordset, SQL süzgeciyle yalnızca bekleyen kayıtları getirir; Do While Not rs.EOF döngüsü kayıt kalmayana kadar döner; her turda Edit → alan değişikliği → Update üçlüsü bir kaydı günceller ve MoveNext sonrakine geçer. Sayaç değişkeni ise işin raporudur — prosedür bitince "5 siparis onaylandi." gibi net bir mesaj verir. Kaç kaydın etkilendiğini söylemeyen otomasyon, güven vermez.

Bir ayrıntı: koddaki metin değerleri ("Onaylandi" gibi) bilinçli olarak Türkçe karaktersiz tutuldu ve tablodaki durum alanı da aynı yazımı kullanır. Kod ile veri aynı yazımı paylaşmalıdır; "Onaylandı" arayan sorgu "Onaylandi" kayıtlarını bulamaz.

3. Hata Yakalama: On Error GoTo

Prosedürün ilk satırı On Error GoTo Hata, profesyonel kodu amatör koddan ayıran satırdır. Bir şey ters gittiğinde — tablo adı değişmiş, alan silinmiş, dosya kilitli — akış Hata etiketine atlar ve kullanıcı anlaşılır bir mesaj görür: hata numarası ve açıklaması. Hata yakalama olmayan kod ise ya sessizce yarım iş bırakır ya da kullanıcıyı hata ayıklama penceresine düşürür.

Kalıbın iki inceliğine dikkat edin: başarılı akışın sonundaki Exit Sub, normal bitişte hata bloğuna girilmesini engeller; Err.Number ve Err.Description ise sorunu tahmin ettirmek yerine söyler. DAO nesnelerinin ve hata modelinin tam başvurusu için VBA başvuru dokümantasyonu ana kaynaktır.

4. DoCmd ile Excel'e Aktarım

Modülün ikinci prosedürü ExceleAktar, onaylı siparişleri muhasebeye giden Excel dosyasına çevirir. İşin kalbi tek komuttur:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, ...

DoCmd, Access'in menüyle yapılan işlerini koda açan nesnedir: aktarım, rapor açma, sorgu çalıştırma. TransferSpreadsheet ise dışa aktarımın atıdır — ilk parametre yönü (acExport), ikincisi biçimi (güncel .xlsx), devamı tablo/sorgu adını ve hedef dosya yolunu alır. Elle "kopyala-yapıştır-biçimlendir" turunun yerini, her seferinde aynı düzende çıkan tek komut alır.

Pratik desen şudur: aktarılacak veriyi önce bir sorguda hazırlayın (filtre, sıralama, kolon seçimi sorguda dursun), TransferSpreadsheet'e sorgunun adını verin. Kod sade kalır, düzen değişiklikleri sorgudan yönetilir.

5. Sonucu Veride Görmek

Otomasyonun kanıtı tablodadır. Örnek dosyanın Siparisler tablosunda durum kolonu iki değer taşır — Onaylandi ve Beklemede:

Siparisler tablosunda durum kolonu: onaylanmış ve beklemede sipariş kayıtları bir arada

BekleyenleriOnayla'yı çalıştırdığınızda (editörde imleci prosedüre bırakıp F5) bekleyenlerin duruma göre değiştiğini ve sayaç mesajını görürsünüz. Aynı prosedürü bir form düğmesine bağlamak da tek satırdır: düğmenin Tıklandığında olayına BekleyenleriOnayla çağrısı yazılır — kullanıcı VBA'nın varlığını bilmeden otomasyonu kullanır.

6. Örneği İndirin

VBA örneğini indir (.accdb) — hazır otomasyon kodu içinde

Önemli: dosyayı ilk açtığınızda Access, kod içerdiği için sarı güvenlik bandı gösterir — İçeriği Etkinleştir düğmesine tıklamadan VBA çalışmaz. Etkinleştirdikten sonra Alt+F11 ile editörü açın, BekleyenleriOnayla'yı F5 ile çalıştırın, tabloya dönüp sonucu izleyin. Kodu bozmaktan çekinmeyin; dosya alıştırma içindir.

Recordset döngüleri ve DoCmd komutları, Access otomasyonunun iki taşıyıcı kolonudur; form olayları, parametreli prosedürler ve dış veri senaryolarıyla birleştiğinde tam bir uygulama iskeletine dönüşür. Bu katmanı sistemli kurmak isteyenler için Access VBA eğitimi tam bu zinciri izliyor; VBA öncesi tablo-sorgu-form temelini sağlamlaştırmak isteyenlere ise Access eğitimi uygun başlangıçtır.

Sıkça Sorulan Sorular

Şirkette hangi Access işleri VBA otomasyonuna ilk aday olmalı?

Üç ölçütü birden taşıyanlar: düzenli tekrarlanan (günlük/haftalık), kuralı net olan (koşul tarif edilebiliyor) ve elle yapıldığında hata üreten işler. Toplu durum güncellemeleri, periyodik Excel aktarımları ve rapor üretimi klasik ilk adaylardır. Kuralı tarif edilemeyen işler otomasyona değil, önce süreç netleştirmeye ihtiyaç duyar.

VBA'lı veritabanını ekibe dağıtırken güvenlik uyarısını her kullanıcı görecek mi?

Varsayılan olarak evet: kod içeren her .accdb ilk açılışta güvenlik bandı gösterir ve kullanıcı İçeriği Etkinleştir demeden kod çalışmaz. Kurum içinde standart çözüm, dosyanın bulunduğu klasörü Access'in Güven Merkezi'nde güvenilir konum olarak tanımlamaktır; o klasörden açılan dosyalarda bant çıkmaz.

Otomasyon kodu yanlış kayıtları güncellerse nasıl geri döneriz?

Access'te geri al düğmesi VBA güncellemelerini kapsamaz; sigortanız yedektir. Toplu güncelleme yapan her prosedürü çalıştırmadan önce dosyanın kopyasını alın — kurumsal kullanımda bunu koda da yazabilirsiniz: prosedür başında tabloyu yedek tabloya kopyalayan bir adım. Ayrıca SQL süzgecini önce SELECT sorgusu olarak deneyip kaç kaydın etkileneceğini görmek sağlıklı bir alışkanlıktır.

Excel makrolarını biliyorum; Access VBA öğrenmek ne kadar farklı?

Dil aynı (VBA), nesne modeli farklı. Excel'de hücre ve sayfayla çalışırsınız; Access'te Recordset, DoCmd ve form nesneleriyle. Döngü, koşul ve hata yakalama bilginiz aynen taşınır — öğreneceğiniz yeni katman DAO ile kayıt işleme ve SQL süzgeçleridir. Örnek dosyadaki iki prosedür, bu geçişin ilk dersi olarak birebir uygundur.