Ünite 4: VBA Programlama Temelleri

Giriş

Makro kaydetmek için Geliştirici sekmesinden Makro Kaydet butonu tıklanarak kaydetme işlem başlatılır. Makro le gerçekleştirilmesi istenen işlemler el ile yapılarak ve sonrasında Kaydı Durdur butonu tıklanarak Makro kaydı sonlandırılır. Daha sonra bu işlemlerin tekrarı istendiğinde Makro sekmesinden ilgili makro adı le seçilerek baştan sona çalışması sağlanır. Kullanıcı açısından bakıldığında, yapılan işlemlerin sadece butonlar yardımıyla gerçekleştirilmesini sağlayan sistem, arka planda VBA kodları ile ifade edilmektedir.

VBA kodlarının en önemli özelliği, kod penceresi içerisinde yazılan kodun satır satır okunmasıdır. Kod basitçe incelenecek olursa bu yazım konusunda fikre sahip olunabilir. Sub kelimesi, alt yordam (Subroutne) kelimesinin kısaltması olarak kullanılmaktadır ve Makro1 adlı alt programın başlangıcını işaret eder. Başında “ ‘ “ işareti bulunan ve kod penceresinde yeşil renk ile görüntülenen yazılar, kod parçacığı hakkında bilgi vermek amacıyla kullanılan yorum kısımlarıdır. Bu yazılar kod çalışırken devreye girmez, sadece programcıyı bilgilendirmek amacıyla kullanılır.

ActveCell.FormulaR1C1 ifadesi, çalışma kitabı içerisinde, belirlenen çalışma sayfasında aktif olan hücreye yazılacak değerin ataması işlemini gerçekleştirir. “=” atama operatörü ile çift tırnak içerisinde yazılan değer, aktif hücreye atanır. Alt satıra inildiğinde karşılaşılan Range().Select ifadesi, aktif olan hücreyi değiştirmek/seçmek için gerçekleştirilir.

Hatırlanacak olursa Makro ile gerçekleştirilen işlem, A1 hücresine “1” sayı değerini yazmak, A2 hücresine “2”, A3 hücresine “3” ve devam eden şekilde A10 hücresine kadar ilerlemektir. Makro yenden çalıştırıldığında A1 hücresine “1” değerini yazdıktan sonra alt hücreyi aktif etmek, yeni aktif olan hücreye “2” değerini yazdıktan sonra bir alt hücreyi aktif etmek esası le çalışmaktadır. Kod – incelendiğinde de kod satırlarının işlemlerinin hücreye değer atamak ve diğer hücreyi aktif etmek şeklinde ilerlediği gözlenmektedir. Son olarak, A10 hücresine “10” değer yazıldıktan sonra bir alt hücre olan A11 hücresi aktif edilerek kodun son satır işlem de gerçekleştirilir. End Sub ifadesi, Makro1 adındaki alt yordamın sonlandığını ifade etmektedir. Kod satırları, bu iki ifadenin arasında yer almalıdır.

Makro, Geliştirici sekmesindeki butonlar kullanılarak dahi yaratılmış olsa, VBA ekranında bir kod parçacığı ile ifade edilir. Yapılan işlemler MS Excel tarafından otomatik olarak VBA kodlarına dönüştürülür ve Makro’nun tekrar çalıştırılması istendiğinde yapılan işlemler, kendisine ait Sub/End Sub arasına yazılan kodların satır satır okunması ve çalıştırılması ile gerçekleştirilir.

VBA Programlama Temelleri

MS Excel sayfası sütun ve satırların kesişimi ile oluşan hücrelerden meydana gelmektedir. Yapılan işlemlerin neredeyse hepsi hücre içi değerlere işlemler uygulanması ile gerçekleştirilmektedir. Tekrar eden işlemleri kolaylaştırmak için oluşturulan makrolar için de asıl öge hücrelerdir. Hücre işlemleri eğer MS Excel ana ekranında bulunan özellikler ve gerekiyorsa makrolar ile gerçekleştirilebilir işlemlerse, VBA ortamına ihtiyaç duyulmayabilir. Gerekli durumlarda ise oluşturulan kodlar, bir önceki bölümde bahsedilen şekilde görüntülenebilir ve/veya üzerlerinde değişiklik yapılabilir. Hücre işlemleri dışında nesnelere bağlı işlemler gerçekleştirmek için ise VBA kod penceresinden yararlanmak gereklidir. Geliştirici sekmesi içerisinde denetimler menüsünde bulunan Ekle butonu, sayfa üzerine eklenebilecek nesneleri barındırmaktadır. Bu buton sayesinde açılan nesnelerden herhangi birisi seçilip sayfa üzerine eklendiğinde, bu nesneye uygun kod yazarak nesneye işlev kazandırmak, Makro ile kaydetmekten daha işlevsel olabilir. Nesnenin üzerine gerekli eylem uygulandığında istenilen işlemleri yerine getirmesi için öncelikle bir makro ile bağlantılı olması gereklidir. Bu sebeple, bazı nesneler sayfa üzerine eklendiğinde otomatik olarak Makro Ata penceresi açılarak bir makro oluşturulması istenir. Form denetimleri altındaki buton ekleme durumunda sıkça kullanılan bu işlem, Buton_Tıklat makrosu olarak karşımıza çıkar. Bir önceki üniteden hatırlanacak olursa VBA penceresinde yazılan kodların aktif hâle gelmesi yani çalışması için nesne kullanımı gerektiği durumlarda, nesneadı_eylem ikilisinin kullanılması gerekmektedir. Aynı esas ile sayfa üzerine bir buton eklendiğinde, makro adı otomatik olan butonun adı ve buton için en sık kullanılan eylem olan tıklama ikilisinden oluşacaktır. S:72, Resim 4.3’te boş MS Excel sayfası üzerine düğme eklendiğinde açılan Makro Ata penceresi görünmektedir. Makro yeri olarak, oluşturulacak makronun kullanılacağı yer belirtilmelidir. Bu yerler, Tüm Açık Çalışma Kitapları , Bu Çalışma Kitabı ya da Kitap1 olabilir. Dügme1_Tıklat Makrosu kaydedildiğinde gerekli kodlamaların yapılabileceği kod sayfası da Modül altında hazır hâle gelmiştir. Makro kaydedildikten sonra yapılması gereken VBA ekranını açmak, proje penceresinden Modülü tıklamak olacaktır. Modül tıklandığında çıkan kod penceresi S:73, Resim 4.4’te gösterilmiştir.

Sub Dügme1_Tıklat() / End Sub daha önce de ifade edildiği gibi kod yazılacak olan satırların başlangıç ve bitişini ifade eder. Sub kodunun yanında yazılı olanlar, nesne adı ve eyleme karşılık gelmektedir. VBA ortamında yazılan kodun çalışması için bir nesneye, bir eylem uygulanmalıdır.

Sub satırının altında ve satır başında üst apostrof işareti ile simgelenen satırlar bilgi amaçlıdır ve kod penceresinde yeşil renkli olarak yazılacaktır. Bu satırlar çalıştırıcı kod içermezler fakat hem kullanıcıya hem de daha sonra kodu incelemek ya da üzerinde değişiklik yapmak isteyen programcıya yardımcı bilgiler içerirler.

Makro atama dışında kod penceresi ile işlem yapılmak istendiğinde, VBA ortamının programlama kısmından daha fazla yararlanmak mümkündür. Bu durumda Geliştirici Sekmesi altındaki Ekle kısmından Form Nesneleri değil de ActiveX Nesneleri eklemek gereklidir. ActiveX Nesneleri ile çalışmayı öğrenmek VBA programlama becerilerini geliştirmek açısından önemlidir.

Başlangıç olarak, Ekle butonu tıklanarak ActiveX Nesneleri altından bir buton nesnesi seçilsin. Komut Butonu olarak da adlandırılan butonu seçerek MS Excel sayfası üzerinde istenilen bir yere istenilen boyutta bir nesne oluşturulsun. Nesne üzerinde isim olarak Buton yerine CommandButton1 yazısı çıkacaktır. VBA kod sayfası açıldığında, Modül altında Buton bağlantısı çıkmadığına ya da bir makro kaydedilmesi veya bir makro atanmasının istenmediğine dikkat etmek gereklidir. ActiveX nesneleri ile çalışma işlemleri, proje penceresinde bulunan Sayfa1 üzerinden yapılacaktır. Sayfa1 çift tıklandığında açılan kod penceresi, boş bir yapı olarak açılır ve bu pencerenin üst tarafında iki adet açılır menü bulunmaktadır. Genel (General) yazılı açılır menü nesneleri, Deklarasyon (Declarations) yazılı menü ise eylemleri göstermektedir. Genel sekmesi açıldığında üzerinde işlem yapılabilecek iki nesne olan CommandButton ve Worksheet nesneleri görülecektir.

CommandButton seçildiginde en sık kullanılan eylemi olan tıklatma (Click) eylemi otomatik olarak atanır ve bir özel alt yordam (Private Sub) açılır. Tıklamadan farklı bir eylem kullanılması gerektiği durumlarda eylemi değiştirmek için sağ üst kısımda bulunan açılır menüden faydalanmak gereklidir. S:74, Resim 4.6’da farklı eylemler görünmektedir.

Farklı bir eylem seçildiğinde, ilk eylemle birlikte oluşturulan Private Sub/End Sub tanımlarından farklı bir özel altyordam grubu oluşturulur. İçerisine kod yazılmayan özel altyordam grubu, kodun çalıştırılması esnasında kendiliğinden silinecektir. S:75, Resim 4.7’de tıklatma eylemi yerine çift tıklatma (DblClick) eyleminin kod grubunun aktif hâle getirilmiş şekli görünmektedir.

VBA Temel Kod Yapıları

Eğer kalıpları, programlama ortamında sıkça faydalanılan karar verme kalıplarıdır. Bir koşul ve o koşulun sağlanması (doğru) ya da sağlanmaması (yanlış) durumlarına göre iki farklı işlem dizisinin gerçeklenmesi mantığı ile çalışır. Koşulun doğru olması durumunda yapılacaklar ve Koşulun yanlış olması durumunda yapılacaklar olmak üzere iki farklı işlem seti tanımlanabilir. Genel yazım şekli aşağıda gösterilmiştir.

If ien

………… (Koşul sağlanıyorken yapılacaklar)
Else

………… (Koşul sağlanmazken yapılacaklar)
End If

If ile Then kelimeleri arasında bir koşul bulunur. Bu koşulun sağlanması yani doğru olması durumunda Then ile Else arasına yazılan kod parçaları, sağlanmaması yani yanlış olması durumunda ise Else ile End If arasına yazılan kod parçaları çalıştırılır (S:76, Resim 4.8).

Bilgisayarlar, yazılan kodları mantıksal hatalara bakmaksızın uygulamak esasına göre tasarlanmıştır. Mantıksal olarak hatalı çalışmaları, programcıların tasarımında hata olduğunun işaretidir.

S:76, Resim 4.9’da görüntülenen koda göre, Eğer kalıpları iç içe de kullanılabilir. Else ifadesine bitişik olarak oluşturulan yeni bir If yapısı ile sayısız If yapısı iç içe kullanılabilir. Bu durumda ilk sağlanan koşul için Then ile Else arasındaki işlemler yapılır, sağlanmıyorsa Else kısmına atlanarak diğer If yapısının Koşulu araştırılır. Koşul sağlandığı durumda altında yazılan kodlar uygulanır, sağlanmadığı durumda ise bir alttaki Else kısmına atlanır ve kodun Çalışması bu şekilde devam eder.

Bir değişkenin değişik durumlarının Koşul olarak kullanıldığı If kalıplarında, Koşulların sayısının arttığı durumlarda kullanım kolaylığı sağlayabilecek Select Case yapısı kullanılabilir. Case olarak ilgili değişkenin alacağı farklı değerler belirlenir ve bu farklı durumlarda yapılacaklar, yapı içerisinde tanımlanır. If yapısına göre anlaşılması daha kolay olan yapı, If yapısı kadar sık kullanıma sahip değildir.

Select Case yapısını kullanmak için, öncelikle Case seçiminde kullanılacak koşulun belirlenmesi gerektiğini görebilirsiniz. Bu Koşul, A1 adresli hücrede yazan değerdir. Bu tanımlamadan sonra artık A1 hücresinin değeri Case olarak nitelendirilecek ve 0’dan büyük, 0’a eşit ve 0’dan küçük olma durumları test edilecektir. Her bir Case için yapılması gerekenleri Case Is ile başlayan kod satırının devamına yazmak gereklidir. Select Case yapısı da tıpkı eğer yapısında olduğu gibi End ifadesi ve yapının adı ile son bulmalıdır. End Select ifadesi, yapının son bulduğuna işaret etmektedir.

Kodlama aşamasında bazı durumlarda aynı işlemi tekrar etmek için, üzerine kod yazılan butona defalarca tıklamak gerekebilir. Böyle durumlardan kurtulmak ve kodun tekrar edilmesi işleminin programcıdan/kullanıcıdan alınarak bilgisayar tarafından tekrarlanması için döngüsel yapılara başvurulur.

For-Next döngüsel yapısını kullanmak için değişkenlere ihtiyaç duyulur. For–Next döngüsel yapısı da bir değişkenin başlangıç değerinden bitiş değerine kadar değerleri sıra ile alması ve tüm değerler için tanımlanan işlemleri tekrar yapması şeklinde tanımlanabilir.

For Değişken_Adı = Başlangıç_Değeri To Bitiş_Değeri

Yapılması İstenilen İşlemler

Next Değişken_Adı

For döngülerinin özel durumlarda durdurulması ve döngü dışına çıkılması gerektiğinde, Exit For kod satırı gerekli yere konmalıdır. Exit For ifadesi kullanımı konusunda dikkatli olunması gereken bir ifadedir. Yanlış yerde kullanımı, sebepsiz yere kodun döngüden çıkmasına ve işlemlerin yarıda kalmasına sebep olabilir.

For döngüleri bazı durumlarda sadece belirli yinelemeler için atlanabilir ve diğer yinelemeler için işlemlerin yapılması istenebilir. Bu durumda Continue For kalıbı kullanılmaktadır. For döngüleri de gerekli durumlarda iç içe kullanılabilir döngülerdir.

For-Next döngüsel yapısının kullanımında, döngünün başlangıç ve bitiş değerleri programcı tarafından belirlenir. Bu sayede, döngünün tekrarlanma sayısı belirlenmiş olur. Örnek vermek gerekirse For x=1 To 5 şeklinde kodlanan bir döngünün, x değişkeninin değerleri sırasıyla 1, 2, 3, 4 ve 5 olacak şekilde 5 kez çalışacağı söylenebilir. Kodlama aşamasında bazı durumlarda, belirlenen koşul sağlandığı sürece, döngü değişkenine bağlı kalmaksızın döngünün tekrarlanması istenebilir. Bu tür durumlarda For-Next döngüsel yapısı kullanmak yerine Do-Loop olarak adlandırılan döngüsel yapılar içerisinden Do While döngüsü kolaylık sağlayacaktır.

Do While

Y apılması İstenilen İşlemler

Loop

Genel yazım Şekli incelenecek olursa Do While Yapısı, koşul gerçekleştiği sürece döngü içerisinde kalan ve işlemleri tekrar tekrar gerçekleştiren bir döngüsel yapıdır. Döngünün sonlanması, Koşulun sağlanmamasına bağlıdır.

Her ne kadar döngü sayısının belli olmadığı durumlarda kullanıldığı belirtilse de belirli örneklerde Do While yapısı, For Next yapısı yerine, aynı işlemleri gerçekleştirmek için kullanılabilir. S:80, Resim 4.13’te, yukarıda For-Next döngüsel yapısı için kullanılan 1’den 10’a kadar sayıların toplam sonucunu bulan örneğin, Do While döngüsel yapısı ile kodlanmış hâli görülmektedir.

Do yapılarının yazınsal olarak farklı bir şekli daha mevcuttur. Bu şekil, While ifadesinin Do yanına değil de Loop yanına yazılması ile oluşturulur. Aşağıda genel yazım şekli görülen yazım şeklinde Do sadece döngüye girme emri olarak döngü içerisindeki tüm işlemlerin en az bir kere gerçeklemesini sağlar. Bir kere gerçeklendikten sonra döngü işleminin yapılması ya da yapılmaması ise Loop While ifadesinin sorumluluğundadır.

Do

Yapılması İstenilen İşlemler

Loop While

While kod parçacığının yazım yerinin Do ya da Loop ifadesinden sonra olması çoğu örnek için fark oluşturmasa da bazı sınır değer problemlerinde, değişiklik yapılması, programın hata vermesine ve Çalışmasının kesilmesine yol açabilir. S:81, Resim 4.14’te bu şekilde bir örnek kod verilmiştir.

Do while döngüsel yapısını, benzer şekilde While-Wend yapısı ile de görmek mümkündür. Bu yapıda da Koşul sağlandığı sürece döngü içerisinde kalınarak, Koşulun sağlanmadığı durumlarda döngü sonlandırılmaktadır. Döngü oluşturma terimi olarak Loop ifadesi yerine Wend ifadesi kullanılmaktadır.

Do While döngüsel yapısı ile yazım şekli olarak bire bir aynı olan Do Until döngüsel yapısı, çalışma mantığı açısından bakıldığında Do While ile taban tabana zıt işlemler yapar. Hatırlanacak olursa Do While döngüsel yapısında döngü içerisindeki kodların okunması ve çalıştırılması için koşulun sağlanıyor olması gerekir. Koşul sağlanmadığı durumlarda ise döngü içerisindeki kodlar çalıştırılmaz. Do Until yapısında ise döngü içerisindeki kodların çalıştırılması için koşulun sağlanamıyor olması gereklidir. Döngü içerisindeki kodlar, koşul sağlanana kadar tekrar tekrar çalıştırılır, koşul sağlandığı anda ise döngü durdurulur. Do Until döngüsel yapısının genel yazım şekli aşağıda verilmiştir.

Do Until

Yapılması İstenilen İşlemler

Loop

Bu yapıda da Until kısmı, diğer Do döngüsünde olduğu gibi Loop ifadesi yanında da yer alabilir.

Do

Yapılması İstenilen İşlemler

Loop Until

Karşılaştırma yapmanın kolay olması açısından daha önceki yapılarda da gerçekleşen 1’den 10’a kadar sayıların toplamını bulan kod parçacığını, Do Until yapısı ile S:82, Resim 4.15’te görebilirsiniz.

Do Until sayac = 10 ifadesi, sayaç değişkeninin başlangıç değerinin “0” olduğu hatırlanırsa daha anlamlı olacaktır. Until ifadesi Do ifadesinin ya da Loop ifadesinin yanına yazıldığında kod okunurken yapılacak değişiklikler, Do While döngüsel yapısı ile aynıdır. Döngünün içerisinde gerekli durumlarda sürdürülmesi ya da sonlandırılması için ise sırasıyla Continue Do ve Exit Do ifadeleri kullanılmaktadır.

Go To ifadesinden sonra gidilmesi istenilen satır numarası belirtilerek, o satıra ulaşmak amaçlanmaktadır. Bu sayede kod sayfasını satır satır yukarıdan aşağıya doğru okumak mecburiyeti ortadan kalkarak, istenilen sıçramalara imkân tanınmış olur. Ancak bu sıçramalar programın okunurluğunu azaltacak ve ne yapılmak istendiğini kavramayı zorlaştıracaktır.

Hata Bulma ve Düzeltme

VBA ortamında yazılan kodların, mantıksal hatalar nedeniyle istenilen sonuçları vermeyebileceği daha önce açıklanmıştır. Algoritma kurulması aşamasında yapılan hataların sonucu olarak programda mantıksal hataların bulunması, program kodlarının doğru çalışmasına rağmen istenen işlemleri gerçekleştirmemesine yol açar. Mantıksal hataların düzeltilmesi, kodun tekrar gözden geçirilmesi ile sağlanabileceği gibi her şeyin başa dönülerek tekrar yapılandırılması ya da yeniden tasarlanmasına kadar giden zorlu bir süreçtir. Mantıksal hatalar dışında, programın çalışmasını engelleyen, özellikle yazım hataları ya da programın çalışırken kesilmesine yol açan çalışma zamanı hatalarından da bahsetmek mümkündür. Yazım ve çalışma zamanı hatalarının düzeltilmesi için kod üzerinde kodlamayı gerçekleştirdiğimiz VBA Editöründen yardım alınabilir.

Mantıksal hatalar, hiç uyarı vermeksizin yanlış sonuçlar çıkartabileceği gibi bazı durumlarda derleyici tarafından da algılanarak düzeltilmesi sağlanabilen hata türlerindendir.

Yazılan tüm kodların işlemcinin anlayabileceği şekle dönüştürülmeden çalıştırılması mümkün değildir. VBA ortamı tarafından Editör üzerine yazılan kodlar da otomatik olarak işlemci tarafından anlaşılır hâle dönüştürülmektedir. Bu işleme kod derleme, bu işlemi gerçekleştiren ortama da derleyici adı verilmektedir. VBA derleyicisi, yazılan kodları derlerken yazım hatası bulunan kısımları hata mesajı ile bildirir. Genellikle derleme işlemi yarıda kesilir. Bir mesaj yardımıyla hatanın türü programcıya bildirilir. Eğer programcı isterse Debug (Hata Ayıklama) butonunu tıklatarak, hatalı olduğu düşünülen satır ya da alt yordam, sarı renk ile çizilerek düzeltilmesi için tasarım zamanına geri dönülmesi sağlanır. Bu işaretlemenin amacı, kod sayfasında hata bulunan yerin işaret edilerek programcıya kolaylık sağlanmasıdır. Programcı gerekli satırları inceleyerek hatayı giderir ve derleyiciyi tekrar çalıştırır.

Bazı durumlarda ise hata, yazım hatası değil de eksik tanımlanmış ya da tanımlanmamış bir değişken ya da nesne olabilir. Hata esnasında derleyici tarafından iletilen mesaj, hata tipini de öğrenmeye yardımcı olur. Eksik nesne ya da tanımlanmamış değişken gibi hatalarda ise gerekli tanımlamaları kod sayfasına ilave etmek hatanın giderilmesini sağlayacaktır.

Bazı durumlarda ise değişken değerleri ya da işlemler istenilen sonuçları vermez. Bir anlamda mantıksal hataların yakalanması için de kullanılabilecek iki farklı yöntem ile program kodlarının gözden geçirilmesi gerekebilir. Bu yöntemlerden ilki, F8 tuşuna basılarak program kodlarının birer birer okunarak ilerletilmesi ve bu sırada gerekli ise VBA pencerelerinden birisi olan İzleme Penceresi ile değerlerin incelenmesidir. Bu sayede programın çalışma mantığı daha iyi kavranır ve belirlenen hatalar giderilebilir.

İkinci bir yöntem ise program kodlarının arasında belirli noktalara Kesme Noktası (Break Point) yerleştirmektir. Program çalışırken kodun Kesme Noktasına kadar olan kısmı çalıştırıldıktan sonra, tasarım zamanına geri dönülerek program kesilir ve o andaki program verileri incelenir. Kesme noktası farklı yerlerde oluşturularak program hatalarının yakalanması ve düzeltilmesi sağlanır.

S:84, Resim 4.17’de kesme noktası oluşturulmuş bir kod çalıştırıldıktan sonra kesme noktasına gelince durması ve kod penceresi görüntülenmektedir. Hataların düzeltilmesi sayesinde, oluşturulan program istenilen sonuçları vermek üzere tamamlanmıştır. Nesne-Eylem ikilisi kullanılarak defalarca çalıştırılabilir. VBA kullanımı, MS Excel için birçok kolaylığı da beraberinde getirmektedir. MS Visual Basic ortamında tanımlanan kodlamalarla işlemler baştan sona kadar istenilen şekilde otomatik biçimde gerçekleştirilebilir.