Excel'den Access'e Bağlanmak
Excel'den Early Bindig Yöntemi İle Access'e Bağlanma
Excel ile Access dosyalarımızın bir arada olması için bir klasör oluşturuyoruz.
Exceli açıp oluşturduğumuz klasörün içine Makro içerebilen excel çalışma kitabı seçeneği ile kayıt ediyoruz.
Accessi açıp oluşturduğumuz klasörün içine 2007 - 2016 veritabanı kayıt ediyoruz.
Klasörümüze makro içerebilen excel çalışma kitabı ile access veritabanı eklemiş olduk.
Access e ADO nun early binding (erken bağlanma) yöntemiyle bağlanacağımız için
Excel VBA Menüsünde sırasıyla 1-Tools / 2- References
3-Microsoft Activex Data Objects 6.1 Library referansını eklenmesi gerekiyor.
Eski Exceller de Activex Data Objects 2.0 dan 2.8 e kadar mevcut
6.1 yoksa bunlardan birini de seçebilirsiniz.
Referansımızı ekledikten sonra projemizin tamamında kullanabilmemiz için bağlantı kodlarını bir Modül içine yazıyoruz.
Not: Kod açıklamaları sayfanın alt bölümde yer alıyor.
Public cnn As ADODB.Connection
Public rst As ADODB.Recordset
Sub cnnAccessBaglan()
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
If cnn.State = adStateClosed Then
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database1.accdb"
End If
If Not rst Is Nothing Then
If rst.State = adStateOpen Then rst.Close
End If
End Sub
Sub cnnAccessKapat()
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
If Not rst Is Nothing Then
If rst.State = adStateOpen Then rst.Close
End If
Set rst = Nothing
If Not cnn Is Nothing Then
If cnn.State = adStateOpen Then cnn.Close
End If
Set cnn = Nothing
End Sub
Şimdi bir Userform açıp buton ekleyelim. Butonunun click kod kısmına aşağıdaki kodları yazalım.
Private Sub CommandButton1_Click()
Call Module1.cnnAccessBaglan
Call Module1.cnnAccessKapat
End Sub
Şimdi Module yazdığımız kodların açıklamasını yapalım
Public cnn As ADODB.Connection
Kodumuza, ADODB.Connection Bağlantı Nesnesine cnn değişkeni atayarak başlıyoruz.
Projemizin tüm userformlarında ve modülerinde kullanabilmek için Public deyimi ile değişkenimizi tanımladık.
ADODB.Connection Bağlantı Nesnesi, bir veri kaynağına açık bir bağlantı oluşturmak için kullanılır.
Bu bağlantı aracılığıyla bir veritabanına erişebilir ve veritabanını yönetebilirsiniz.
Public rst As ADODB.Recordset
ADODB.Recordset Kayıt nesnesini yine Public deyimi ile rst değişkenine atıyoruz.
ADODB.Recordset objesi data kaynağından aldığı veriyi bir dizi şeklinde bize sunar. Bu obje sayesinde ADO bize veriler üzerinde değişiklik yapmamıza, kayıtları taşımamıza ve kayıtları filtrelememize izin verir. Recordset objesi “Fields” koleksiyonunu içerir. Bu koleksiyon sayesinde veri kaynağındaki tüm alanlara (kolonlara) erişebiliriz.
ADODB.Connection bize veritabanıyla bağlantı kurar o bağlantı içinde ADODB.Recordset ile işlemlerimizi yaparız
cnn ve rst değişken adları genel olarak kullanılır. Kullanma mecburiyeti yoktur farklı isimlendirme de yapabilirsiniz.
Sub cnnAccessBaglan()
Çalıştırdığımızda accesse bağlantı kurmamızı sağlayacak, cnnAccessBaglan adında bir prosedür oluşturuyoruz.
Set cnn = New ADODB.Connection
cnn değişkenini New ADODB.Connection objesine tanımlıyoruz set ediyoruz yani cnn değişkeninden yapmasını istediğim şey yeni bir bağlantı kurması.
Set rst = New ADODB.Recordset
rst değişkenini New ADODB.Recordset objesine tanımlıyoruz set ediyoruz yani rst değişkeninden yapmasını istediğim şey yeni bir Kayıt kümesi oluşturması.
If cnn.State = adStateClosed Then
cnn değişkenimizin bağlantı durumunu kontrol ediyoruz.
State, ADODB.Connection bağlantı nesnesinin durumu için bir değer döndürür.
Bu değer, adStateClosed e eşitse yani ADODB.Connection bağlantı nesnesinin bağlantı durumu kapalıysa alttaki bağlantı kodunu çalıştır diyoruz.
Özetlersek eğer access e bağlı değilsek altaki kodu çalıştır. Bağlıysa tekrar bağlanmaya çalışması hataya sebep olur. Bu hatayı engelemek için bu şartı koyuyoruz
State nin döndürdüğü değerler konusuna burdan ulaşabilirsiniz.
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database1.accdb"
ADODB.Connection bağlantı nesnesine cnn.Open ile bağlan komutunu veriyoruz
Provider=Microsoft.ACE.OLEDB.12.0 kodu ile bağlantı sağlayıcısını tanımlıyoruz Access için Ado kısmındaki bağlantı sağlayıcı olarak Microsoft.ACE.OLEDB.12.0 yazıyoruz.
Data Source=" & ThisWorkbook.Path & "\Database1.accdb" kodu ile bağlacağımız veri tabanın yolunu yazıyoz.
ThisWorkbook.Path bu kod excel çalışma kitabımızın bulunduğu yer anlamına geliyor. Bu kodla yol yazımını kısaltmış oluyoruz. Yol olarak şunu yazmış oluyoruz Excel Çalışma Kitabımızın bulunduğu klasördeki Database1.accdb veritabanı dosyası.
Şimdi de örnek olarak farklı yerlerdeki access veritabanı dosyasının yollarını yazalım
Veritabanımız Excel çalışma kitabımızın bulunduğu klasörün içinde
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database1.accdb"
Veritabanımız Excel çalışma kitabımızın bulunduğu klasörün içindeki Data klasörünün içinde
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Data\Database1.accdb"
Veritabanımız yerel disk D de
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Database1.accdb"
Veritabanımız yerel disk D de Data klasörünün içinde
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Data\Database1.accdb"
Access veritabanımız şifreliyse
Bağlantı kodumuza Jet OLEDB:Database Password=şifremiz" kodunu ekliyoruz.
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Database1.accdb";Jet OLEDB:Database Password=şifremiz"
Accessi şifrelerken kullandığımz şifre sayı veya harf fark etmez, şifremiz yazan yere şifremizi yazarken tırnak içine almıyoruz
If Not rst Is Nothing Then
ADODB.Recordset kapalımı veya açıkmı denetimini yapmadan ADODB.Recordset var olup olmadığını kontrol ediyoruz.
Bu denetimi yapmadığımızda ADODB.Recordset kapalıysa rst.state hata veriyor.(Not rst Is Nothing rst varsa anlamına geliyor)
If rst.State = adStateOpen Then rst.Close
ADODB.Recordset açıkmı denetimini yapıyoruz. Açıksa ADODB.Recordset kapat komutunu veriyoruz.
ADODB.Recordset kapatmamızda ki amaç bulunduğumuz prosedür accesse yeni bir bağlantı açma prosedürü ADODB.Recordset i kapatmazsak bu aç prosedüründen sonraki çalışak kaydet, güncelle, listele gibi kodlarda ADODB.Recordset e bağlanacağımız için hata alıcaz bu sebepten eski kayıt kümesi varsa kapatıyoruz.
Bağlantı prosedürümüz bu kadar accesse bağlanmak istediğimiz herhangi bir prosedür de Call Module1.cnnAccessBaglan komutunu yazdığımızda Accesse sorunsuz bağlanmış olacağız.
Sub cnnAccessKapat()
Çalıştırdığımızda access bağlantımızı kapatmamızı sağlayacak, cnnAccessKapat adında bir prosedür oluşturuyoruz.
Herhangi bir prosedürde accesse bağlandıktan sonra access le olan işimiz bitiğinde ADODB.Connection nesnesini ve ADODB.Recordset nesnesini kapatıp bir sonraki bağlantı da hata almamak için değişkeni boşaltıyoruz.
Access bağlantı prosedüründe detaylı anlatım yapıldığı için kapatma prosedürnde aynı kod açıklamalrını tekrar etme gereği olmadığını düşünüyorum.
Kapatma prosedürümüz bu kadar access e olan bağlantımızı kapatmak istediğimiz herhangi bir prosedür de Call Module1.cnnAccessKapat komutunu yazdığımızda access e olan bağlantımızı sorunsuz şekilde kapatmış olacağız.









Yorumlar
Yorum Gönder