Kod Yazmaya Giriş - M. Temel Korkmaz

Bir üst yazıda “Excel Makrolarına Giriş” başlığı altında, Makronun ne olduğunu ve ne işe yaradığını, Makroları yazacağımız ortamı kısaca anlatmış  ve bir iki küçük örnek vermiştik. Artık makroların nereye yazılacağını ve nereden kontrol edileceğini öğrenmiş oldunuz sayılır. O halde bu yazımızın konusuna geçebiliriz.

Bu yazımızda açıklamalı kod yazımını göreceğiz.

Unutmayın!

Makrolar genel olarak VBA penceresindeki modül nesnesinin sayfasına yazılır.

Örnek 1:
Makro ile yeni bir Çalışma Sayfası oluşturmak ya da Çalışma Kitabına yeni bir sayfa eklemek.

Yeni bir Excel çalışma sayfası açtığınızda ve eğer Excel 2000 kullanıyorsanız ve de varsayılan değerlerde herhangi bir değişiklik yapmadıysanız ekrana Şekil-1 deki gibi 3 adet sayfa gelecektir.


Şekil-1

Aşağıdaki kodu VBA’da açtığınız bir modül sayfasına yazın ve çalıştırın.

Sub SayfaEklemek()
   
Worksheets.Add
End Sub

Kodu çalıştırdığınızda, Şekil-2 deki gibi Sayfa4 adlı yeni bir Çalışma Sayfası’nın Çalışma Kitabı’nıza eklendiğini göreceksiniz.


Şekil-2


kodu yazarken eğer dikkat ettiyseniz, Worksheets ifadesinden sonra “.” karakterini koyduğunuzda Şekil-3 deki gibi bir görüntü ile karşılaştınız.


Şekil-3

Visual Programlama dillerini bilenler, bir anda ekrana gelen bu liste kutusunun ne olduğunu bilirler. Bilmeyenler için kısa bir açıklama yapmak zorundayız.

Siz VBA sayfasında bir kod yazarken, bazen nesnelerin özelliklerini hatırlamayabilirsiniz. “Acaba, Worksheets nesnesinin ne gibi özellikleri ya da metotları vardı?” sorusunun cevabını Visual Basic size bir liste halinde sunuyor. Siz, nesneyi yazdıktan sonra, o nesnenin özelliğini yada metodunu  belirlemek için “.” karakterini koyduğunuzda ekrana  Şekil-3'teki gibi özellik/metot hatırlatma listesi gelecektir.

Bütün özellik/metotları görmek isterseniz, kod sayfasında herhangi bir yerde iken CTRL + SPACE tuşlarına birlikte basarsanız aynı liste kutusuna benzer bir listeyi ekranda göreceksiniz.

Şimdi örneğimize tekrar dönelim.

Worksheet:
Çalışma Sayfası
Worksheets:
Çalışma Sayfaları
Add:
Ekle

Kodu kısaca açıklayalım.
“Worksheets.Add” yani “ÇalışmaSayfası.Ekle” manasına gelir.



Eğer dikkat ettiyseniz, yeni eklenen Sayfa4 adlı Çalışma Sayfa’sının en sola yani Sayfa1’inde soluna eklenmiş olduğunu görürsünüz. Amacımız ise her yeni eklenen Çalışma Sayfasının, en sağ taraftaki sayfanın sağına eklenmesi olsun.  Sayfalarınıza göz  atın, en sağda olan sayfanın Sayfa3 olduğunu göreceksiniz. O halde aşağıdaki kodu yazın.

Sub SayfaEklemek()
   
Worksheets.Add.Move After:=Worksheets("Sayfa3")
End Sub

Kodu çalıştırdığınızda Şekil-4’ü elde edeceksiniz.


Şekil-4


Hemen, aklınıza şu soru takıldı. “Kodu tekrar çalıştırdığımızda bu defa yine Sayfa3’ün sağ tarafına ve Sayfa5’in sol tarafına ekleniyor. Ama bizim istediğimiz ise her defasında yeni eklenen sayfa en sağ tarafa eklensin.”

Haklısınız. Biz burada adım adım ilerleyerek, önümüze çıkacak bir çok  soruyu da cevaplamaya çalışıyoruz. Yukarıdaki kodu açıkladıktan sonra, sorunumuzu çözeceğiz. Önce yeni kelimelere göz atalım.

Move:
Taşı
After:
-den sonra

Kodu kısaca okuyalım.

Worksheets.Add.Move After:=Worksheets("Sayfa3")

yani, “Yeni Eklenen Çalışma sayfasını Sayfa3’den sonraya taşı.”

Bu defa soruna köklü bir çözüm getirelim. Aşağıdaki kodu yazın.

Sub SayfaEklemek()
   
Worksheets.Add.Move After:=Worksheets(Worksheets.Count)
End Sub

Kodu çalıştırdığınızda Şekil-5’deki görüntüyü elde edeceksiniz.


Şekil-5

Count:
Saymak

Yukarıdaki kodun aynısı olmakla birlikte, burada Sayfa3 yerine Worksheets.Count ifadesi geldi.

Worksheets.Count ifadesi bize bir rakam döndürecektir. Çünkü bu ifade ile aktif Çalışma Kitabı’ndaki sayfalar sayılıyor. Bizim kodu çalıştırmadan evvelki Çalışma Sayfa’sı sayımız, 5 di. (Sayfa4, Sayfa1, Sayfa2, Sayfa3 ve Sayfa5) O halde yukarıdaki kod’da Worksheets.Count yerine “5” rakamı gelecektir.  Siz kodu çalıştırdığınızda, bilgisayar, önce o an aktif olan sayfaları sayacak ve daha sonra da yeni eklenecek sayfayı, bu sayı kadar sağa taşıyacaktır.

Bizim Çalışma Kitabı’mızda 5 sayfa olduğuna göre, yeni eklenecek olan sayfa, soldan sağa 6. sıraya yani en sağa yerleştirilecektir.

Örnek 2:
Çalışma Sayfa’sının adını değiştirmek.

Excel, sizin eklediğiniz her sayfayı, yeni bir isim vermediğiniz sürece sıra numarasına göre isimlendirir. Sayfa4, Sayfa5, Sayfa6 gibi. Ama bu isimler kullanıcı için genellikle uygun değildir. Kullanıcı aradığını daha rahat bulabilmek için sayfa isimlerini kendine göre değiştirir. Madem artık makro öğreniyoruz, o halde bu isimleri Çalışma Sayfası daha eklenir eklenmez değiştirelim. Bunun için önce basit bir kod yazalım.

Sub SayfaAdi()
 
Worksheets.Add
 
ActiveSheet.Name = "Yeni"
End Sub

Kodu çalıştırdığınızda Şekil-6’daki gibi bir görüntü elde edeceksiniz.


Şekil-6

ActiveSheet :
Aktif sayfa
Name :
İsim, Ad

İlk olarak Çalışma Kitabımıza yeni bir Çalışma Sayfası ekledik. Doğal olarak Excel’de buna yeni bir isim atadı. (Eğer yeni bir Çalışma Kitabı açmışsanız, muhtemelen Sayfa4 olarak atandı). Daha sonra makronun ikinci satırına geçildi. Bu satırda da Aktif olan Çalışma Sayfasına yeni bir isim verildi.

Hatırlatma!!!

Siz Çalışma Kitabı’na yeni sayfa eklediğinizde, otomatik olarak o yeni sayfa aktif sayfa olacaktır.

Yukarıdaki kodda da bu olay göz önüne alınarak, yeni eklenen sayfaya Excel otomatik olarak hangi adı atarsa atasın, biz bu sayfayı ActiveSeheet (Aktif sayfa) olarak bildiğimiz için bu sayfanın adını değiştirdik.

Kodu, iki defa üst üste çalıştırdığınızda, Şekil-7 deki hata mesajı ile karşılaşacaksınız.


Şekil-7

Belki de bazılarınız, “Ne diyor bu pencerede?” diye kızacaksınız. Kızmanıza gerek yok. Bir çoğunuzun anladığı gibi, sizin zaten “Yeni” adında bir sayfanız mevcuttu. Kodu tekrar çalıştırdığınızda, Excel Çalışma Kitabı’nıza yeni bir sayfa eklendi ve bu eklenen sayfaya da “Yeni” adını vermeye çalıştı. Oysa, bu isimde bir sayfayı daha önce vermiştiniz. Bir çalışma kitabında aynı isimden yeni bir sayfanın olması mümkün olmadığı için Excel sizi uyardı ve Şekil 7 deki uyarı penceresini verdi.

Bu penceredeki “End” düğmesine tıklarsanız, Makronun çalışması durdurulacaktır. (HATALAR hakkında detaylı bilgi almak için “MAKROLAR, Excel 2000 ile Programlama” adlı kitabımızdan HATA DENETİMİ bölümüne bakabilirsiniz.)

Hata penceresini kapatıp tekrar Excel Çalışma kitabına döndüğünüzde Şekil-8 deki gibi bir görüntü ile karşılaşacaksınız.


Şekil-8

Şimdi, Sayfa5’in nereden geldiğini yorumlayalım. (Kod yazmak, Mantık ve Yorumlama ile alakalıdır. Olan olayları yorumlayabiliyorsanız yada yazılan kodu okuyabiliyorsanız, iyi bir programcı olmaya adaysınız demektir.)

Bizim çalışma Kitabımızda varsayılan olarak 3 adet sayfamız vardı. “SayfaAdi” adlı makroyu çalıştırdık ve Sayfa4 adında yeni bir sayfa eklendi. Sonra da bu sayfanın adı, “Yeni” olarak değiştirildi. Daha sonra “SayfaAdi” makrosunu tekrar çalıştırdık ve Excel bize Sayfa5’i ekledi. Bu yeni eklenen sayfanın adını “Yeni” olarak değiştirmek istedi. Çalışma Kitabında “Yeni” Adlı bir sayfa bulunduğu için HATA mesajı verdi. Dolayısı ile kodun çalışmasına son verildi. Ancak Sayfa5 Çalışma Kitabı’mızda kaldı. İşte Sayfa5’in macerası bu.



Unutmayın!

Eğer  Excel’de makro yazmak istiyorsanız ve bu olayları hatasız başarmak istiyorsanız yaptıklarımızı tek tek uygulayın ve görün. Çünkü programcılık sadece bilgi yüklenmekle gerçekleşmez. Eğer çok pratik yapmıyorsanız ve bu pratikler içerisinde bir çok hatalarla karşılaşmıyorsanız ve de bu hataları çözmek için saatlerinizi harcamıyorsanız asla iyi bir programcı olamazsınız. Şunu söylememiz yerinde olacaktır. Eğer Excel makroları ile program yazmaya başlayabilirseniz, diğer programlama dilleri size çok kolay gelecektir. Çünkü şu anda okuduğunuz satırlar Visual Basic dilinin Excel’e uyarlanmış şeklidir. Sanırım ne demek istediğimi anladınız.

Bundan sonra uygulayacağımız adımlar, tamamen sizin Excel’de programcılık mantığınızı geliştirmek üzere yazılmıştır. Şekil-7’deki hata mesajı ile karşılaşmamak için kendimiz bir denetim yapacağız. Aşağıdaki kodu yazın.

Sub SayfaAdi()
 
For i = 1 To Worksheets.Count
   
If Worksheets(i).Name = "Yeni" Then
        MsgBox "Bu isimde bir sayfa bulundu"
       
Exit Sub
    End If
  Next i
 
Worksheets.Add
 
ActiveSheet.Name = "Yeni"
End Sub

Yeni bir Çalışma Kitabı’nda kodu çalıştırdığınızda, Çalışma Kitabı’na “Yeni” adında bir sayfa eklenecektir. Kodu ikinci defa çalıştırdığınızda ise ekrana Şekil 9 daki gibi  bir mesaj penceresi çıkacaktır.

Neler oldu?


For i = 1 To Worksheets.Count

Makro kodunu çalıştırdığınızda ilk olarak O anda çalışmakta olduğunuz, katapta bulunan bütün sayfaları tek tek denetlemek üzere bir For...Next döngüsü açtık.

If Worksheets(i).Name = "Yeni" Then

İkinci satırda ise bir şart ileri sürdük. Şartımız şu: Eğer “i” numaralı sayfanın adı “Yeni” ise.

İşte şartımız bu. Yani bilgisayar, bu iki satırda, Çalışma Kitabı’ndaki bütün sayfaları kontrol etmeye başlayacak. Eğer, sayfalardan herhangi bir tanesinin adı, “Yeni” ise bir sonraki satırdaki kodu çalıştıracak.

MsgBox "Bu isimde bir sayfa bulundu"

Bu satıra gelindiğinde, Şekil-9 ekrana gelecek. Siz “Tamam” düğmesine tıklayana kadar bu şekil ekranda durur ve Excel sayfaları üzerinde herhangi bir işlem yapamazsınız. Tamam düğmesine tıkladığınızda, Mesaj penceresi kapanır ve bir sonraki satır çalışır.


Şekil-9

Exit Sub

Bu kod çalıştığında, “SayfaAdi” makro kodu sonlanır. Kendinden sonraki hiçbir kod okunmaz ve makro durdurulur. Bunun nedenini anladınız sanırım. Ama ben yine de açıklayayım. Eğer bu satırı yazmasaydık. Kitapta “Yeni” adlı bir sayfa bulunduğu halde, tekrar aşağıdaki iki satır çalışacak ve hata penceresi ile karşılaşılacaktı.

Worksheets.Add
ActiveSheet.Name = "Yeni"

Eğer, kitabımızda “Yeni” adlı bir sayfa yoksa For ile başlayan ve Next ile biten satırlar arasında herhangi bir işlem yapılmayacak ve sadece yukarıdaki iki satır dikkate alınarak “Yeni” adında bir sayfa açılacaktır.

Genelde, sayfaları isimlendirmede, kod içerisindeki Name  özelliği bu şekilde kullanılmaz. Şimdi, size bu olayın nasıl kullanıldığını basit bir programlama örneği yaparak anlatmaya çalışacağım.  Öncelikle Excel, Çalışma sayfasını Şekil-10'daki gibi düzenleyin.


Şekil-10


C2 hücresine Müşteri firmanın unvanını, C3 hücresine Müşteri firmanın yetkili kişisinin adını, C4 hücresine de Müşteri firmanın Telefonunu gireceğiz. Daha sonra, KAYDET düğmesine tıklayacağız ve Excel bize C2 hücresindeki firma adına ait bir çalışma sayfası açacak.

Öncelikle, çalışma kitabınızda bulunan sayfaları silin ve sadece Şekil-10'da görülen sayfa kalsın ve bu sayfanın da  adını “AnaSayfa” olarak değiştirin. Şekil-11.


Şekil-11


Modül sayfasına aşağıdaki kodu yazın ve çalıştırın.

Sub SayfaAdi()
 
Worksheets.Add
 
ActiveSheet.Name = Worksheets("AnaSayfa").Range("C2").Value
End Sub

Bu yazdığınız kodu, AnaSayfa’da bulunan kaydet düğmesine atayın. Bunu yazmak için aşağıdaki adımları takip edin.

Fare ile “Kaydet”  düğmesi üzerine gelin ve sağ fare tuşuna tıklayın

Açılan menüden “Makro Ata” komutunu seçin.

“Makro Ata” penceresi ekrana gelecektir. Bu pencereden sizin yazdığınız Makro adını fare ile tıklayın.

Makro Adı kutusunda makronuzun ismi görününce “Tamam” düğmesine tıklayın.

“SayfaAdi” makrosunu “KAYDET” düğmesine atamış oldunuz.

Şimdi, C2 hücresine herhangi bir şey yazmadan, “Kaydet” düğmesine bir defa tıklayın. 1004 numaralı hata mesajı ile karşılaşacaksınız. Bu hata mesajının anlamı şu: “Tanımlanmamış uygulama ve tanımlanmamış nesne hatası”

Sanırım bunun nedenini hemen anladınız. Yazılan makroda sayfa ismi, AnaSayfa’nın C2 hücresinden alınacaktı. Oysa yukarıda C2 hücresine herhangi bir şey yazmadık. Excel’de sayfa adı olarak boşluğu kabul etmediği için bu uyarı penceresini aldık. Şimdi buna bir önlem yazalım ve Makromuzu tekrar çalıştıralım.

Sub SayfaAdi()
 
If Worksheets("AnaSayfa").Range("C2").Value = "" Then Exit Sub
  Worksheets.Add
 
ActiveSheet.Name = Worksheets("AnaSayfa").Range("C2").Value
End Sub

İlk satıra IF..THEN koşulunu ekledik. Yani şunu dedik: “Eğer AnaSayda’daki C2 hücresi boş ise makroyu sonlandır.” Siz isterseniz bir mesaj satırı ekleyebilirsiniz.

Şimdi C2 hücresine Müşteri firmasının adını yazın ve KAYDET düğmesine tıklayın. Şekil-12


Şekil-12


Son olarak kodu aşağıdaki gibi düzenleyin.

Sub SayfaAdi()
   
Dim i As Integer
    If Worksheets("AnaSayfa").Range("C2").Value = "" Then Exit Sub
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = Worksheets("AnaSayfa").Range("C2").Value
Then
            MsgBox "Bu isimde bir sayfa bulundu"
        Exit Sub
        End If
    Next i
 
Worksheets.Add
 
ActiveSheet.Name = Worksheets("AnaSayfa").Range("C2").Value
End Sub

Yapmış olduğumuz bu basit örnekte, her müşteri adına yeni bir sayfa nasıl açılır bunu öğrendik. Şimdi de var olan bir sayfayı nasıl makro komutu ile sileriz bunu öğrenelim.

Sub SayfaSil()
    Sheets("Sayfa1").Delete
End Sub

Yukarıdaki makroyu çalıştırdığınızda “Sayfa1” Çalışma Kitabı’nızdan silinecektir.

Unutmayın!!!

Eğer Çalışma Kitabı’nızda Sayfa1 adında Çalışma Sayfası yoksa  9 numaralı hata mesajını alacaksınız.

Varolan bir Çalışma sayfasını silmek için makroyu çalıştırdığınızda, silinmesi gereken sayfa silinmeden önce Şekil-13'teki gibi bir uyarı penceresi ekrana gelir.


Şekil-13


Bu Excel’in size bir uyarısıdır. Yukarıdaki gibi bir makroyu her çalıştırdığınızda istisnasız olarak bu mesajı alacaksınız. Ama siz illa ki bu mesajı almak istemiyorsanız, kodu aşağıdaki gibi değiştirin.

Sub SayfaSil()
    Application.DisplayAlerts = False
    Sheets("Sayfa1").Delete
    Application.DisplayAlerts = True
End Sub

Ne oldu diye merak edenlere hemen açıklayalım.

Application.DisplayAlerts = False

Satırı ile Excel’in sayfa silme uyarısını kaldırdık. Daha sonra aynı özelliği True olarak değiştirdik ve eski haline getirdik. Çünkü, sadece bu makroda bu uyarıyı almak istemediğinizi düşündük. Bu özelliği False yaptığınızda Excel bunu otomatik olarak tekrar True yapmayacağı için, makronun sonunda işimiz bittiğinde bu özelliği True yaptık.

Bir adım daha ilerleyelim ve yukarıda yaptığımız, program örneğine bu kodu ekleyelim. Bunun için de, SİL düğmesini, KAYDET düğmesinin altına ekledik. “SayfaSil” makrosunu da  aşağıdaki gibi düzenledik.

Sub SayfaSil()
    If Range("C2").Value = "" Then Exit Sub
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name <> Worksheets("AnaSayfa").Range("C2").Value Then
            MsgBox "Bu isimde bir sayfa bulunamadı"
        Exit Sub
        End If
    Next i
    Application.DisplayAlerts = False
    Sheets(Range("C2").Value).Delete
    Application.DisplayAlerts = True
End Sub