Makale Özeti

VBA Kodlarını VB.NET’e taşımak yazı dizisinin bu bölümde VBA’den VB.NET’e geçirilirken, varsayılan özellikler, atamalar, TypeOf ve TypeName fonksiyonlarının kullanımı, akış kontrol yapıları, hata yönetimi, geç bağlama (late binding), erken bağlama (early binding) ve çoklu değişken ilanlarında dikkat edilmesi gereken noktalara değineceğiz.

Makale

VBA Kodlarını VB.NET’e Taşımak – Bölüm 2


VBA Kodlarını VB.NET’e taşımak yazı dizisinin bu bölümde VBA’den VB.NET’e geçirilirken, varsayılan özellikler, atamalar, TypeOf ve TypeName fonksiyonlarının kullanımı, akış kontrol yapıları, hata yönetimi, geç bağlama (late binding), erken bağlama (early binding) ve çoklu değişken ilanlarında dikkat edilmesi gereken noktalara değineceğiz.

Varsayılan Özelliklerler

VBA’de belirli nesnelerin varsayılan özellikleri vardır. Bu nedenle kod yazarken, örneğin bir atama sırasında nesnenin hiçbir özelliğini belirtmezseniz, nesnenin varsayılan özelliği atamaya dahil edilir. Ancak, VB.NET’te varsayılan özellikler sadece parametreleri olan özellikler için geçerlidir. Bu problem, erken bağlama kullanılan ve atama yapılan nesnenin tipi bilindiği her durumda, uygun özelliğin belirtilmesi yoluyla çözülebilir. Atamanın yapıldığı tip bilinirse, ona karşılık gelecek varsayılan özellik de büyük ihtimalle belirlenebilecektir. Aşağıdaki örnekte, Excel içerisinde GenelToplam adlı bir alanın (range) değeri okunmaktadır. “Range”lerin varsayılan özellikleri, “Value” özellikleridir:



Atamalar

VBA’de atama yapılırken, atanan değerin belirtilen nesnenin kendisi mi, yoksa varsayılan özelliği mi olduğu “Set” ifadesi ile belirlenir. VB.NET varsayılan özellikleri desteklemediğinden, “Set” ifadesini kullanmaya gerek yoktur. Bu nedenle kodlar VBA’den VB.NET’e geçirilirken VBA’deki “Set” ifadelerinin silinmesi gerekir. Buna ek olarak, VB.NET artık “Let” ifadesini de desteklememektedir. Örneğin:



TypeOf Fonksiyonu

VBA’de refereans edilen bir nesnenin belirli bir tipte olup olmadığı TypeOf fonksiyonu kullanılarak belirlenir. VB.NET aynı şekilde TypeOf fonksiyonunu desteklemektedir. Ancak, VB.NET’te VBA’de olmayan, kullanıcı tanımlı tipler olan “structure” adında yapılar mevcuttur. “Structure” yapıları nesne tipinde olmadıkları için TypeOf fonksiyonu ile tipleri sorgulanamaz.



TypeName Fonksiyonu

TypeName fonksiyonu TypeOf fonksiyonuna benzer şekilde, kendisine argüman olarak verien nesnenin tipini tip olarak değilde metin olarak vermektedir. VB.NET TypeName fonksiyonunu desteklemektedir; ancak sonuç olarak döndürdüğü metinde farklılıklar vardır. Öneğin, aşağıdaki VBA kodu çalıştırıldığında, açılan mesaj kutusunda TypeName olarak “WorkBook” yazarken, VB.NET kodu çalıştırıldığında , açılan mesaj kutusunda TypeName olarak “MyWorkbook” yazar:



Akış Kontrol Yapıları

VB.NET’teki akış kontrol yapıları ile VBA akış kontrol yapıları arasında While döngüsü dışında pek bir değişiklik yoktur. VBA’de While ifadesi, WEnd anahtar kelimesi ile biter. VB.NET’te ise, bir While ifadesi End While anahtar kelimesi ile bitmektedir. VB.NET no GoSub. . .Return ve On. . .GoSub ifadelerini artık desteklememektedir. Bu nedenle bu ifadelerin kullanıldığı fonksyionları genellikle tamamen baştan yazmak gerekecektir. VB.NET de VBA gibi GoTo ifadesi desteklemektedir; ve sözkonusu fonksiyon iki dildede aynı şekilde çalışmaktadır. Burada dikkat edilmesi gereken nokta, VB.NET’te Error kelimesinin bir anahtar kelime olmasından dolayı GoTo etiketi olamayacağıdır. VBA kodlarında GoTo kullanıldığı durumlarda çoğunlukla görünen Error etiketlerini kodları VB.NET’e taşırken değiştirmek gerekecektir. Aşağıda GoTo ifadesindeki değişiklik ile ilgili örnek bulunmaktadır:



Hata Yönetimi

VB.NET’in “exception handling” denilen tamamen yeni bir hata yönetim mekanizması vardır. Bu yapıda Try, Catch ve Finally anahtar kelimeleri kullanılır. VB.NET dahilinde tüm hatalar bu yolla kontrol edilir. Örneğin:



Bu kod örneğinde ortalama fiyat hesaplanmaya çalışılmakta, her hangi bir nedenle hata olduğu zaman ise ortalama fiyatın değeri Sıfır (0) olarak belirlenmektedir. Buradaki örnekte “catch” bloğu oluşan tüm hataları toplamaktadır. Böylesi bir yaklaşım gerçek hayatta çok tercih edilmemelidir. Bunun yerine daha uygun olanı oluşabilecek hataların tanımlanarak “catch” bloğunun sadece o tipteki hataları yakalamasını sağlamaktır. Bu durumda, beklenmeyen bir hata oluştuğunda, kodun daha üst seviyelerindeki hata blokları hatayı daha iyi kontrol edebilecektir. “Finally” ifadesi altında yer alan kodlar hata olsa da olmasa da her zaman işletilir.

Geç Bağlama ve Erken Bağlama

VBA içerisinde bir değişkenin ilanını tipini belirtmeden yapabilirsiniz. Böyle ilan edilen değişkenlerin tipi Variant olarak kabul edilir. Örneğin:



Yukarıdaki örnekte, paragrafSayisi01 değişkeni VariantLong tipine geç bağlanmıştır. paragrafSayisi01 değişkeni ilek ilan edildiğinde tipi Variant iken, kendisine Application.ActiveDocument.Paragraphs.Count değeri atandığı zaman VariantLong tipi geç bağlanmış olmaktadır. paragrafSayisi02 değişkeni ise Long tipine erken bağlanmıştır, çünkü, paragrafSayisi02 değişkeninin ilanı sırasında tipi belirtilmiştir. Teknik olarak, VB.NET dahilinde geç bağlama yapılamamaktadır.



Yukarıdaki kodu derlediğinizde, öncelikle paragrafSayisi01 değişkeni Object tipinde ilan edilir. Me.Paragraphs.Count değeri paragrafSayisi değerine atandığı zaman, atanan değer “stack” üzerine değil, “heap” içerisindeki bir nesnenin içerisine konur. paragrafSayisi değişkeni ise sözkonusu nesnenin heap’deki adresine referans tutar.

paragrafSayisi02 ise ilan edildiği anda Long tipi ile ilişkilendirilir. Daha sonra Me.Paragraphs.Count değeri paragrafSayisi02 değerine atandığında, sözkonusu değer “stack” üzerinde paragrafSayisi02 değişkenin olduğu yere yazılır. Sonuç olarak paragrafSayisi01 değişleni ile ilgili işlemler paragrafSayisi02 değişkeni ile ilgili işlemlerden daha yavaş çalışır. Bu nedenle, VBA içerisinde geç bağalama yapılan kodlar, VB.NET’e geçirilirken, değişken ilanı sırasında tiplerinin belirlenmesi performans açısından avantaj getirecektir. İster VBA ister VB.NET ile çalışın, değişkenleri erken bağlamak her zaman performans açısından size avantaj sağlayacaktır.

Çoklu Değişken İlanı

VBA’de değişik tipteki değişkenleri aynı ifade içerisinde ilan etme şansınız vardır. Burada her değişkenin tipinin ayrı ayrı belirtilmesi gerekir, belirtmediğiniz taktirde değişkenin tipi Variant olarak algılanacaktır. Aşağıdaki örnekte çoklu değişken ilanı sonucu değişkenlerin tipleri ifade edilmektedir:



VB.NET de çoklu değişken ilanını desteklemektedir, ancak küçük bir nüansla birlikte. Yukarıda vermiş olduğumuz VBA örneğini VB.NET’te aşağıdaki gibi taşımak uygun olacaktır:



Sonuç

Bu makalede VBA’den VB.NET’e geçerken dikkat edilmesi gereken noktların üzerinde durduk, ancak kalan birkaç konu daha var. Onları da bu dizinin son makalesinde sizlerle paylaşacağız.