|
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
|