ACCESS VBA OTOMASYONU

Access kırmızı anahtar logo yanında Sub ve End Sub bracket VBA kod kapsülü otomasyon metaforu

Microsoft Access yıllar içinde "modası geçmiş" yaftası alsa da küçük ve orta ölçekli kurumsal süreçlerde hâlâ en pratik veri tabanı çözümlerinden biridir. Bir muhasebe bölümünde fatura takibi, bir bakım ekibinde ekipman kaydı, bir İK biriminde başvuru süreci — bunların hepsi Access ile birkaç günde ayağa kalkar. Otomasyon kısmı ise Access'i sıradan bir veri tutma aracından dinamik bir iş aracına çeviren şeydir; VBA bu otomasyonun ana dilidir.

Form Olayları

Access formları kullanıcıyla etkileşim noktasıdır ve her formun bir dizi olayı vardır. Doğru olayda doğru iş yapılması iyi otomasyonun temelidir; her olay VBA kodu için ayrı bir kanca noktasıdır:

  • Form_Open / Form_Load: Form ilk açıldığında tetiklenir, başlangıç değerleri ve filtre kurulumu için uygundur.
  • Form_Current: Kullanıcı kayıt değiştirdiğinde çalışır, mevcut kayda bağlı UI güncellemeleri burada yapılır.
  • AfterUpdate: Bir alanın değeri değiştikten sonra çalışır, bağlı alan hesapları bu olaya yerleştirilir.
  • Form_BeforeUpdate: Kayıt kaydedilmeden önce çalışır; iş kuralı doğrulamaları ve Cancel = True ile iptal mantığı buradadır.
  • Form_AfterInsert: Yeni kayıt eklendikten sonra çalışır, e-posta bildirimi gibi tetikleyici akışları için tipiktir.

Tipik bir hata her iş için Form_Open olayını kullanmaktır. Form ilk açıldığında değişen kayıt yoktur; o yüzden mevcut kayıt bilgisine bağlı bir iş yapılacaksa Form_Current daha doğrudur. Olayları doğru seçmek kodun gereksiz yere her seferde çalışmasını engeller ve performansı korur.

İş Kuralları

Veritabanı tasarımında iş kuralları (business rules) genelde iki katmanda uygulanır: tablo düzeyinde geçerlilik kuralları ve form düzeyinde VBA. Tablo düzeyinde "tutar negatif olamaz" gibi sabit kurallar tanımlanır; bunlar her zaman geçerlidir, hangi formla veri girilirse girilsin uygulanır. VBA katmanında ise koşullu kurallar yer alır: "fatura tipi 'İade' ise iade nedeni boş olamaz" gibi.

İş kuralları formun BeforeUpdate olayında kontrol edilir. Bu olayda Cancel = True yapılırsa kayıt kaydedilmez ve kullanıcı uyarılır. Kullanıcı uyarısı için MsgBox yeterlidir ama kullanıcı deneyimi için Label kontrolüne kırmızı bir uyarı yazmak daha az kesintilidir.

Beş form olayı Open Load Current BeforeUpdate AfterUpdate sıralı yatay zincir akış diyagramı

DoCmd Komutları

VBA'da Access ile etkileşimin büyük kısmı DoCmd nesnesi üzerinden yapılır. DoCmd.OpenForm bir form açar, DoCmd.RunSQL bir SQL ifadesini çalıştırır, DoCmd.SendObject e-posta gönderir. Bu komutlar makro arayüzünden de erişilebilen şeylerin VBA karşılığıdır ve makrolardan çok daha esnek kullanılır.

DoCmd.SetWarnings False komutu çoğu zaman SQL çalıştırma öncesinde Access'in onay penceresini kapatmak için kullanılır; ama bu komut hata mesajlarını da bastırır, bu yüzden hata yakalama mantığı VBA'da elle yapılmalıdır. İşlem bittikten sonra mutlaka DoCmd.SetWarnings True ile geri açılır.

Recordset ile Veriye Erişim

Tek bir kayıt veya bir kayıt kümesiyle çalışmak gerektiğinde Recordset nesnesi kullanılır. DAO.Recordset veya ADODB.Recordset olarak iki sürümü vardır; Access içinde DAO daha hızlı ve doğal tercihtir. Bir Recordset açılır, üzerinde dönülür, gerekli güncellemeler yapılır, sonra kapatılır. Bu döngü tasarım gerektirir; özellikle binlerce kaydın işleneceği durumlarda performans için DAO ile direkt çalışmak SQL ile yapılabilen işlerden daha yavaş olabilir, o yüzden mümkün olduğunda toplu UPDATE veya INSERT SQL ifadeleri tercih edilir.

Recordset açtıktan sonra Close ve Set rs = Nothing yapmak her zaman zorunludur. Bu konunun güncel ayrıntıları Microsoft'un Access destek sayfasında yer alır. Aksi halde bellek yavaşça dolar ve uzun çalışan makrolarda Access kararsız hale gelir.

Hata Yakalama

Üretim ortamında çalışan VBA kodunun hatasız davranması beklenir. On Error GoTo yapısıyla her prosedürün başında hata yakalama etiketine yönlendirilir, prosedürün sonunda Exit Sub denir ve etiket altında hata işlenir. Bu yapı kodun beklenmedik durumlarda kullanıcıya anlamlı bir mesaj göstermesini sağlar, Access'in genel hata penceresinin açılmasını önler.

Hata mesajları kullanıcıya gösterilirken teknik detaylar (Err.Number, Err.Description) tek başına yetersizdir; "Müşteri kaydı güncellenemedi, sistem yöneticisine başvurun" gibi anlamlı bir mesaj eklemek deneyimi iyileştirir. Teknik detaylar log dosyasına yazılır, ileride sorun çözümü için kaynaktır.

Sub MusteriGuncelle()
 On Error GoTo HataYakala

 Dim rs As DAO.Recordset
 Set rs = CurrentDb.OpenRecordset("tbl_Musteri", dbOpenDynaset)
 rs.Edit
 rs!Durum = "Aktif"
 rs.Update
 rs.Close
 Set rs = Nothing
 Exit Sub

HataYakala:
 Call HataLogla(Err.Number, Err.Description, "MusteriGuncelle")
 MsgBox "Müşteri kaydı güncellenemedi, sistem yöneticisine başvurun.", vbCritical
End Sub

Tetikleyiciye Bağlı Akışlar

Access'te tetikleyici denilen şey genelde form olayları veya zamanlanmış makrolardır. Bir kayıt eklendiğinde otomatik olarak e-posta gönderilmesi, bir tutar belli eşiği aştığında yöneticinin haberdar edilmesi, gece geç saatlerde otomatik raporun e-postaya gönderilmesi tipik senaryolardır. Form_AfterInsert olayında DoCmd.SendObject ile e-posta tetiklemek bunun klasik uygulamasıdır.

Zamanlanmış işler Windows Görev Zamanlayıcısı ile Access dosyasını belirli bir saatte açıp ana makroyu çalıştıracak şekilde kurgulanır. Access dosyası açıldığında AutoExec adlı makro otomatik çalışır; bu makro VBA'daki ana prosedürü çağırır, iş bittikten sonra Access'i kapatır. Bu yapı küçük ölçekli zamanlanmış raporlama için yeterli ve düşük maliyetli bir çözümdür.

Görev Zamanlayıcı saat ikonu AutoExec makro Access dosyası ve e-posta gönderim üç adımlı zincir

Excel ile Entegrasyon

Access otomasyonları çoğunlukla Excel ile birlikte yaşar; veri Access'te durur, raporlama Excel'de yapılır. VBA ile Access'ten Excel'e veri aktarmak için DoCmd.TransferSpreadsheet komutu kullanılır. Bu komut bir tabloyu veya sorguyu doğrudan bir Excel dosyasına yazar. Tersine, Excel'den Access'e veri almak için aynı komutun acImport modu kullanılır.

Daha karmaşık aktarımlar için Excel.Application nesnesi VBA içinde başlatılıp Excel programatik olarak yönetilebilir. Bu yaklaşım Excel'in tüm yeteneklerini Access kodundan kullanmayı mümkün kılar — pivot oluşturma, biçim verme, makro tetikleme.

Çoklu Kullanıcı Senaryosu

Access dosyası ağ sürücüsünde birden çok kullanıcıya açıkken kilitleme yönetimi önem kazanır. Front-end (form ve sorguların bulunduğu) ve back-end (tablonun bulunduğu) ayrımı bu durumlarda klasik tercihtir; her kullanıcının kendi front-end kopyası olur, hepsi ortak back-end'e bağlanır. VBA'da bu yapı yedeklemeyi, sürüm geçişini ve performansı kolaylaştırır.

Access otomasyonu kurumsal süreçlerde basit, hızlı ve pratik bir araçtır. Doğru tasarımla küçük ekipler büyük süreçleri yönetebilir hale gelir. Access VBA eğitimi bu otomasyonu gerçek senaryolar üzerinden uygulamalı olarak ele alır.

Sıkça Sorulan Sorular

Access VBA mı yoksa makro mu kullanmalı?

Basit otomasyonlar için makro yeterlidir ve daha güvenlidir. Karmaşık <strong>iş kuralları</strong>, döngü ve hata yönetimi gerektiğinde VBA tercih edilir. İkisini birleştirmek de yaygın bir yaklaşımdır.

Access dosyasını web üzerinden erişilebilir yapabilir miyim?

Access Web Apps artık desteklenmiyor. Web erişimi için Power Apps ve Dataverse yapısına geçiş daha kalıcı bir çözümdür.

VBA kodunda hata günlüğü nasıl tutulur?

Her hata yakalama bloğunda hata bilgileri (Err.Number, Err.Description, Now, prosedür adı) bir Hatalar tablosuna INSERT ile kaydedilir. Bu kayıt sonradan sorun çözümü için temel kaynaktır.

DoCmd.SetWarnings False kullanmak doğru mu?

Tek seferlik onay penceresini bastırmak için kullanışlıdır ama hata mesajlarını da bastırdığı için tehlikelidir. Yalnızca kısa bir blok için açıp hemen kapatmak güvenli yaklaşımdır.

Access dosyasının boyutu zamanla şişiyor, çözüm nedir?

Compact and Repair komutu dosyayı yeniden optimize eder. Düzenli aralıklarla çalıştırılması iyi pratiktir; özellikle çok güncelleme yapılan dosyalarda boyut hızlı büyür.

Front-end / back-end ayrımı zorunlu mu?

Tek kullanıcılı ortamda gerekmez, ama birden çok kullanıcı veya bakım esnekliği için kesinlikle önerilir. Bu yapı sayesinde kullanıcılar veri kaybetmeden form güncellemesi alabilir.