Buradaki içerik Northwind 2.0 Developer Edition ve Starter Edition için geçerli olabilir.
VBA (Visual Basic for Applications), tüm Office Ürünlerinde kullanılan programlama dilidir. VBA öğrenme, tüm Office ürünleriyle (yalnızca Access'le değil) çalışmanıza olanak tanır.
"Nasıl yapılır" araması yaparken Access'e özgü örnekleri aradığınızdan ve aramaya Microsoft Access'i eklediğinizden emin olun. Genellikle diğer Office ürünlerine yönelik çözümler işe yarayacaktır ancak bunun garantisi yoktur. Microsoft Access olgun bir üründür; bu, dışarıda çok sayıda örnek olduğu anlamına gelir; bu sizin için harika!Ayrıca, Access programlamadaki eski kitapların hala bakabileceğiniz anlamına gelir. Eski kitapların çoğu, orijinal maliyetlerinin bir bölümüyle kullanılmış kitap sitelerinde hala mevcuttur. Access'in hangi sürümlerinin hala desteklendiğini belirlemek için Microsoft web sitesine bakın ve bu sürümlerle devam edin.
Office için destek sonu kaynakları - Office'i dağıtma | Microsoft Learn
Aşağıda, Microsoft'taki Access belgelerinin bazı bağlantıları yer almaktadır.
Microsoft Access dosyaları Office dosyalarıdır. Office dosyalarının "Güvenilen Konum" içinde olması veya "içeriğinin etkin" olması gerekir. Bu öğeler, oluşturduğunuz veya güvenilir bir kaynaktan geldiği için "güvenli" olarak kabul edilir. Herhangi bir Office Dosyasını her açtığınızda Güvenilen Konumlar'ı denetleyin. Bundan sonra bunu Güvenilir/Etkin olarak adlandıracağız. NOT: Uygulamanın yeni bir sürümü yayımlanıp güvenilir olmayan bir konumdan açılırsa, içeriği etkinleştirme işlemi yinelenir.
Güvenilen Konumlar hakkında daha fazla bilgi edinin.:
Makrolar, İşlevler ve Alt Öğeler, Access veritabanınıza iş mantığı uygulama yönteminizdir. Başlamadan önce Kapsam ve Görünürlüğü anlamanız önemlidir.
Formdaki Denetimler üzerindeki olaylar (örn. düğmeler, metin kutuları, etiketler vb.) kayıt ekleme, silme veya form açma gibi diğer işlemleri tetikler. Bu işlemler makrolar veya VBA kullanılarak uygulanabilir. Northwind Starter Edition çoğunlukla makroları ve makroların gerekli işlevleri gerçekleştiremediği bazı VBA'ları kullanır. Northwind Developer Edition öncelikle VBA kullanır.
Bazı denetim türlerinde otomatik olarak makro oluşturmak için yerleşik sihirbazlar bulunur. Örneğin, forma komut düğmesi eklemek, düğme için çeşitli işlev seçenekleri sunan bir sihirbaz açar. Birleşik giriş kutusu eklemek, formda belirli bir kaydı bulmak için yapılandırılabilir bir sihirbaz açar.
Gezinti Bölmesi, tüm veritabanı nesnelerinizi görüntülemenizin ve erişmenizin ana yoludur ve varsayılan olarak Access penceresinin sol tarafında görüntülenir.
Northwind Gezinti Bölmesi özelleştirildi. Northwind Starter 2.0 adlı özel bir kategori oluşturduk. Bu, nesneleri işlevsel alana göre düzenlememizi sağlar.Access/Office içinde Kapsam ve Görünürlük hakkında bilgi edinmek önemlidir. Buradan başlayabilirsiniz:
Bazen, onu oluşturan nesne kapsam dışına çıktıktan sonra bir değişkenin var olması gerekir. Yukarıdaki Kapsam ve Görünürlük bölümüne bakın. Bunu yapmanın üç birincil yolu vardır: Genel Değişkenler, TempVars ve Değerleri yerel tabloda depolama. Birçok geliştirici bunların bir karışımını kullanır. Her bir değerin artıları ve eksileri vardır. Burada her bir konu hakkında daha fazla bilgi bulabilirsiniz:
VBA Modülü Genel Değişkeni:
TempVars:
Değerleri yerel tabloda depolama
-
Geçerli oturum için ortak değişkenler ve TempVars var ve uygulama kapatıldığında kapsam dışına çıkıyor. Peki kullanıcıya özgü değişkenleri oturumlar arasında tutmak istiyorsanız ne olacak? Bu tür değerleri yerel tabloda depolayabilirsiniz. Northwind 2.0'da böyle bir değişken SystemSettings adlı bir tabloya kaydedilir. Tablodaki değer ShowWelcome değeridir. Bu değer, Access'e her oturum açışınızda Hoş Geldiniz ekranını görmek isteyip istemediğinizi bildirir.
Geliştiricilerin genellikle parametreleri bir formdan diğerine veya bir formdan rapora geçirmesi gerekir. Bu parametreler, çağrılan işlevin kendisini yapılandırmak için kullanacağı önemli bilgileri iletir. İkinci formun veya raporun ilk formdan bilgi alması için çeşitli yollar vardır. İşte bu yollardan birkaçı:
-
İkinci form, görünür veya görünmez denetimde bazı değerleri almak için ilk forma "geri bakabilir". Örneğin: lngCustomerID = Forms!FirstForm!cboCustomerID
-
İlk form değerleri genel değişkenlere veya TempVars'a kaydedebilir. Örneğin: g_lngUserID = Me.cboUserID TempVars.Add "UserID", Me.cboUserID
Hem Northwind Developer Edition'da hem de profesyonel yaşamlarımızda sıklıkla kullanılan yöntem, DoCmd.OpenForm veya OpenReport'un OpenArgs bağımsız değişkenini kullanmaktır. Örneğin: DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
Burada iki tekniği birleştiriyoruz: (1) VendorID ve VendorType'ı geçirmek için OpenArgs kullanımı ve (2) oluşturmak için StringFormat() işlevinin kullanılması, örneğin bu dize:
CompanyID=5&CompanyTypeID=2
Bu dize, tarayıcıda kullanılan sorgu dizesine çok benzer. Ve karakteriyle ayrılmış bir veya daha fazla "ad/değer çifti" içerir:
name1=value1&name2=value2
Böyle bir dizenin avantajı, her değerin bir ada sahip olmasıdır. Bunu, OpenArgs'i yalnızca "5,2" olarak ayarladığınız daha basit bir yaklaşımla karşılaştırın. Böyle bir durumda, her değerin neyi işaret edeceğini bulmak için çaba sarf etmek gerekir. Her değeri adlandırmak, sorgu dizesini iyi bir programlama uygulaması olan "kendini açıklayan" yapar.
DoCmd.OpenForm dosyasının alıcı ucunda genellikle Form_Open veya Form_Load olayındayız ve OpenArgs dizesini bileşenlerine ayrıştırmak istiyoruz.
Northwind'te bunu StringToDictionary işleviyle yapabilirsiniz. Querystring benzeri bir işlevi alır ve bileşenlerine ayrıştırır. Bu bileşenler daha sonra bir Scripting.Dictionary nesnesinde depolanır. Bunu yaptığınızda Araçlar > Başvuruları kullanmanız ve Microsoft Betik Çalışma Zamanı'na (scrrun.dll) başvuru ayarlamanız gerektiğini unutmayın.
Sözlük nesnesinin özellikleri ve avantajları şunlardır:
-
Öğelerin sırası önemli değildir
-
Koleksiyonun öğelerini eklemek ve kaldırmak için basit işlevler
-
Koleksiyonda ne olduğunu öğrenebilmeniz için döngüye alınabilecek işlevler
-
Belirli bir öğenin kullanılabilir olup olmadığını test edebilmeniz için Bir Exists işlevi
Sözlük nesnesinin kullanımı Northwind'in her tarafında görünür. Örneğin frmGenericDialog içindeki Form_Load olayı.
Access'te Denetim Sihirbazları ile oluşturulan makrolar nadiren hata işlemeyi içerir; Denetim Sihirbazları ile oluşturulan VBA, genel bir MsgBox Err.Description ile sınırlı olabilir.
Northwind 2.0'da VBA kodunu kullanırken bunu nasıl daha iyi yapacağınızı gösteriyoruz. Genel Hata İşleyicisi olarak adlandırılan şeyi uyguladık. Herhangi bir yordamda oluşan hatalar, genel düzeyde bir işlevi çağırarak hatayı gösterir. Buradaki en büyük avantaj, hata işlemenin tutarlı olmasıdır. Ayrıca iletinin değiştirilmesi gerekiyorsa (örneğin, hata numarasını göstermek veya hatayı bir dosyaya kaydetmek için) yalnızca tek bir yerde yapılmalıdır.
clsErrorHandler , hata işleme kodunu uygulayan Sınıf Modülüdür. Sınıf modülü tüm ana ve yardımcı işlevlerini tek bir ünitede bir arada tutarak kodu kapsüller.
AutoExec makrosunda modStartup içindeki Startup işlevi çağrılır. Starter Edition'da işlev bir clsErrorHandler örneği oluşturur ve bunu uygulama genelinde kullanılabilecek genel bir değişken olarak kaydeder. Dev sürümünde statik bir sınıf kullanılır; sınıf modülünün en üstündeki açıklamalara bakın.
Aslında, yordamlardaki hata işleme kodu o kadar tutarlıdır ki, her yordamı uygun hata işleyicisiyle oluşturan belirli VBA kodunu kullanarak beş dakikadan kısa bir süre içinde tümünü oluşturabildik. (Kod şablona dahil değildir). Hem Northwind 2.0 Starter hem de Developer şablon sürümleri başlangıçta bu hata işleme yaklaşımıyla donatılmıştı.
'GELIŞTIRILMIŞ HATA IŞLEME
Northwind Developer Edition'ın 2.2 sürümünden başlayarak, Access topluluğundan gelen geri bildirimler sayesinde hata işleyici geliştirildi. Starter sürümü değişmemiştir.
Temelde, önceki sürümdeki (2.0 - Nisan 2023'te yayımlanan) hata işleyicisi:
Public Sub HandleError(…) MsgBox Err.DescriptionEnd Sub
Sürüm 2.2'de şu sürüme yükseltilir:
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False) If Not IsEventProcedure Then Err.Raise lngError, strErrSource End If MsgBox Err.DescriptionEnd Sub
Bu değişikliğin neden yapıldığını anlamak için öncelikle kodun çalışmasını neyin sağladığını anlayalım:
-
AutoExec makro, ilk formu açmadan önce bazı başlatmalar gerçekleştiren Başlangıç yordamını çağırır.
-
Kullanıcı, form açma veya düğmeye tıklama gibi uygulamayla etkileşim kurar ve Form_Load ve cmdPrintInvoice_Click gibi olay yordamlarının tetiklenmesine neden olur.
'
Olay yordamlarına ek olarak, uygulamaların çoğu modüllerde olmak üzere alt yordamları ve işlevleri vardır ve bu kod olay yordamlarından çağrılır. Bunlara "standart" yordamlar denir.
Northwind'in 2.0 sürümünde, standart yordamlar iletilerle ilgili kendi hatalarını işleyebilir, ancak bir şekilde çağıran olay yordamına bir hata oluştuğu konusunda bildirimde bulunmaz. Olay yordamı, çağrılan yordam tarafından işlenen önceki hatadan bağımsız olarak çalışması gereken sonraki koda sahipse bu kötü olabilir. Elbette, alt yordamı başarı veya başarısızlık döndüren bir işlevle değiştirebilir ve olay yordamını buna göre kodlayabiliriz, ancak bu her zaman bir seçenek değildir.
Northwind sürüm 2.2'de standart yordamlar hata iletilerini işlemez, bunun yerine Err.Raise kullanarak bunları çağıran olay yordamına geri bildirir. Ardından çağıran olay yordamı, tetiklenen hatayı görüntüler ve Exit_Handler'de devam eder. Bu daha iyidir, çünkü çağırma yordamının düzgün bir şekilde sonuçlanmasını sağlar.
Northwind sürüm 2.2 kodunu kullanmak için olay yordamlarının HandleError'a çağıranın bir olay yordamı olduğunu belirten üçüncü bir bağımsız değişken geçirmesi gerekir. Northwind Dev Edition bunu yapacak şekilde güncelleştirildi.
Daha da güçlü bir hata işleyici modülü bir "yığın" (dizi) üzerinde "gönderme ve alma" yordamlarını destekler. İlk öğe her zaman olay yordamı olacaktır, bu nedenle ek bağımsız değişken gerekli değildir. Bu uygulama Northwind Dev Edition hedeflerinin ötesindedir.
MRU veya En Son Kullanılanlar , son kullanılan Siparişler ve Satınalma Siparişlerinin listesidir. Bunları bir sonraki Duruma getirmek için bunlara sık sık dönmek isteyebilirsiniz. MRU listeleri genellikle Office ürünlerinde yeniden açmak isteyebileceğiniz son kullanılan dosyaların listesi olarak görülür.
Northwind Dev sürümünde, MRU özelliğini (Starter sürümünde mevcut olmayan) uygulamak için önce aşağıdaki öğeleri oluşturmanız gerekir:
-
MRU bilgilerini depolamak için bir tablo.
-
Bir sipariş veya satınalma siparişi (PO) açıldığında tabloyu güncelleştirme kodu.
-
Şeritteki MRU açılan listesini güncelleştirmek için kod.
-
Şeritten bir MRU öğesi seçildiğinde öğeyi yüklemek için kod.
Şimdi bunların her birine daha ayrıntılı bir şekilde bakalım.
1. MRU bilgilerini depolamak için tablo.
MRU tablosunun tasarımı, özellikle dizinlerini gözden geçirmeye değer. Şerit açılan listesindeki MRU öğelerinin hızlı sıralanmasında yardımcı olacak yinelenen bir SortIdx dizininin yanı sıra her kullanıcı için bir öğenin yalnızca bir kez gerçekleşebileceği iş kuralını zorlamak için benzersiz bir dizin olduğunu unutmayın. Örneğin, aynı sırayı iki kez açmak MRU tablosunda iki kayıt oluşturmaz.
Tablo, veritabanındaki MRU ile ilgili tüm PK (birincil anahtar) alanlarının Otomatik Sayı olmasından yararlanır, bu nedenle PkValue için Uzun Tamsayı veri türü kullanılabilir.
2. Sipariş veya posta kutusu açıldığında tabloyu güncelleştirme kodu.
NW2'de MRU listesine yalnızca yeni bir kayıt oluşturulduğunda eklemeyi seçtik, mevcut kayıt yeniden güncelleştirildiğinde değil. Bunu desteklemek için AddToMRU çağrısını Form_AfterInsert'den Form_AfterUpdate taşıyabiliriz.
AddToMRU ve DeleteFromMRU yordamları, genel yordamları herhangi bir biçimden görülebilen standart bir Modül olan modGlobal'da uygulanır.
AddToMRU (adından da anlaşılacağı gibi) yeni öğeyi MRU tablosuna ekler ve sonra isteğe bağlı olarak en eski kaydı silerek en büyük boyutun (MAX_MRU_COUNT) ötesine geçtiyse geri kırpılır. Son adım muhtemelen Access geliştiricileri tarafından en az bilinen adımdır: şerit açılan listesinin yenilenmesi gerekir ve bu, InvalidateControl çağrılarak gerçekleştirilir. Bu, başlatma işlemini yeniden çalıştırmak için şeritteki bir sinyaldir.
3. Şeritteki MRU açılan listesini güncelleştirmek için kod.
Başlangıç zamanında ve InvalidateControl çağrıldıktan sonra, şeridi doldurmak için karmaşık bir işlev kümesi yürütülür. Bu yordamlar , kısmen yazan uSysRibbons tablosundaki Şerit XML'i tarafından çağrılır:
<group id="gCurrentStatus" label="MRU">
<box id="bxMRU" boxStyle="vertical">
<dropDown id="ddMRU"
getItemCount="ddMRU_GetItemCount"
getItemLabel="ddMRU_GetItemLabel"
getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
getItemID="ddMRU_GetItemID"
onAction="ddMRU_OnAction"
screentip="Most Recently Used Objects">
</dropDown>
</box>
</group>
Bu dört geri çağırma işlevi açılan listeyi doldurur. Bunun burada standart birleşik giriş kutuları için açıklandığı gibi çok aynı fikir olduğunu unutmayın.
modRibbonCallback'te Debug.Print satırlarını açar ve uygulamayı yeniden başlatırsanız, Anlık Pencere aşağıdakine benzer bir dizi gösterir:
ddMRU_GetItemCount ddMRU 6
ddMRU_GetItemLabel ddMRU 0 Order 60, Proseware, Inc.
ddMRU_GetItemID ddMRU 0 2
ddMRU_GetItemLabel ddMRU 1 Order 62, Best For You Organics Company
ddMRU_GetItemID ddMRU 1 4
ddMRU_GetItemLabel ddMRU 2 Order 63, Wide World Importers
ddMRU_GetItemID ddMRU 2 5
ddMRU_GetItemLabel ddMRU 3 Order 66, Proseware, Inc.
ddMRU_GetItemID ddMRU 3 8
ddMRU_GetItemLabel ddMRU 4 Order 67, Best For You Organics Company
ddMRU_GetItemID ddMRU 4 9
ddMRU_GetItemLabel ddMRU 5 Order 68, Adatum Corporation
ddMRU_GetItemID ddMRU 5 10
ddMRU_GetSelectedItemIndex ddMRU 0
Burada Access'in ilk olarak ddMRU_GetItemCount ByRef bağımsız değişkeninde yükleyebileceğiniz öğe sayısını döndüren bir yordam çağırdığını görebiliriz. Bu aynı zamanda sorguyu MRU tablosunda açıp önbelleğe aldığımız zamandır çünkü birkaç kez kullanılmak üzeredir.
Ardından şerit, iki sütunlu açılan liste için kimlik ve Etiket değerlerini almak için iki yordamı tekrar tekrar çağırır.
Son olarak, hangi öğenin seçilmesi gerektiğini devre dışı bırakma yordamını çağırır. (Bizim örneğimizde, ilkidir.)
4. Şeritten MRU öğesi seçildiğinde öğe yükleme kodu.
Diğer tüm şerit öğelerinde olduğu gibi Şerit XML'sindeki OnAction özelliği de eylemi gerçekleştirmek için kullanılacak bir geri çağırma işlevi belirtir:
onAction="ddMRU_OnAction"
Bu yordam modRibbonCallback içinde uygulanır. Seçili öğeye sahip kaydı bulmak için zaten açık olan kayıt kümesini yeniden kullanır, ardından gerekli TableName'e bağlı olarak ilgili formu açar ve yüklenecek PK değerini geçirir.
-
Northwind 2.0 Developer Edition: Template-Tutorial
-
Northwind 2.0 Developer Edition: Tüm konular