Excel için VBA - 16 Dakikada VBA Öğreniyorum El Kitabı

Excel için VBA
16 Dakikada Excel için VBA Öğreniyorum
El Kitabı
Hazırlayan: Gemi İnş. ve Gemi Mak.Y.Müh.Ali ÖZEN
[email protected]
Excel için VBA
Sayfa No. 1
1. Excel için VBA – Giriş
1.1 Giriş ve Genel Kabuller
Bu el kitabı Excel programının öğrenilmesinden ziyade temel Excel bilgisinin
varolduğunun kabulüyle, Excel içerisinde VBA (Visual Basic for Applications) ile
Macro ve işlev (Function) tanımlamanın öğrenilmesine katkı sağlamak için
yazılmıştır. Formüller, Excel programında dilden dile farklılık gösteriyor olup, örnekler
ingilizce Excel üzerinde gösterilmiştir. VBA, uygulamalar için Visual Basic
programlama dilinin kolaylaştırılmış bir şekli olup, çok az seviyede programlama
bilgisiyle dahi kullanılabilen özelliklere sahiptir.
Bu el kitabı içerisinde iki konu işlenecek olup, bunların ilki Excel’de kendi
Function’ımızı tanımlamak, diğeri ise, Macro’lar kaydedip, bunları çalıştırmaktır.
1.2 Excel’in Programlamaya Ayarlanması
Herşeyden önce Excel içerisinde VBA işlemleri yapabilmek için üst kısımda
Developer sekmesinin hazır olması gerekmektedir. Daha önce hiç programlama
yapılmamış Excel’de bu sekme kapalı olup, açmak için herhangi bir sekmenin boşluk
bir yerine sağ tıklamak suretiyle “Customize the Ribbon...” düğmesine tıklanır.
Karşımıza çıkan aşağıdaki ayarlar menüsünde, sağ tarafta hangi sekmelerin açık
olacağı seçilen “Main Tabs” başlığı altında “Developer” sekmesinin seçili olması
gerekmektedir.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 2
Unutulmaması gereken bir konu, Excel güvenlik ayarları yüksek ise, daha sonra
içerisine Macro kaydedilmiş Excel dosyaları açılırken, ekranın üst kısmında
yukarıdaki gibi bir uyarı belirecektir. Güvenliğinden emin olduğunuz Macro’ları içeren
Excel dosyalarını açarken “Enable Content” (İçeriği Etkinleştir) e tıklayarak Macro’ları
aktif hale getirmek gerekmekte, aksi taktirde kullanılamaz olmaktadırlar.
2. Özel İşlev Yaratma
2.1 Genel Bilgiler
İşlevler (Function) Excel’de en basit toplama çıkarma işleminden, en zorlu istatistik
analizlerin yapılmasına kadar olanak sağlayan bir özelliktir. Örneğin A1 ve A2
hücrelerindeki sayıların toplamını görüntülemek istediğimiz bir hücreye
“=SUM(A1;A2)” şeklinde yazdığımızda bu hücrede toplam görüntülenecek olup, işlev
yoluyla yazıldığı için, bundan sonra A1 veya A2 hücrelerinde bir değişiklik olduğunda
bu toplamın içerisinde yazdığı hücre de otomatik olarak güncellenecektir.
Özel işlev yaratmak, gereksinimlere göre, kullanıcının sıklıkla kullandığı ancak
Excel’in kendi içerisinde hazır bulunmayan bazı özel işlevler yaratmaktır. Böylelikle
tekrar eden uzun formüllerin önüne geçilmiş olur ve ileride birbirinden referans alan
çok sayıda hücre olduğunda hata olasılığını azaltmaya yardımcı olur.
Herhangi bir VBA işlemi yapmak istediğimizde daha önce ayarladığımız “Developer”
sekmesine gelerek buradaki “Visual Basic” düğmesine tıklanır. Kısaca Alt+F11 tuş
kombinasyonuyla da aynı ekrana ulaşabiliriz.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 3
Karşımıza aşağıdaki gibi bir ekran gelecek olup, bu aşamada, yeni işlevi içine
tanımlayacağımız bir modül (Module) oluşturmak için, aşağıda göründüğü gibi
“Insert” Tabakasından “Module”a tıklanır.
Karşımıza çıkacak olan yeni boş Module içerisine aşağıdaki metni kopyalayarak,
daha ileriki kısımda ayrı ayrı açıklanacak olan iki örnek yeni işlevi Excel’e tanıtmış
olacağız.
Function YASKAC(DT As Date)
YASKAC = Int((Date - DT) / 365.25)
End Function
Function INTPL(A As Variant, B As Variant, C As Variant, D As Variant, E As Variant)
INTPL = ((E - A) / (B - A)) * (D - C) + C
End Function
2.2 İnterpolasyon İşlevi Örneği
İlk örneğimiz matematiksel (cebir) bir örnek olup, Excel’de halihazırda
tanımlanmamış olan ve mühendislerin sık ihtiyaç duyduğu bir işlev olan interpolasyon
olacaktır. Örnekteki kabulümüz iki eksende, X ve Y değerlerini bildiğimiz iki noktadan
yola çıkarak, X koordinatını bildiğimiz üçüncü bir noktanın Y değerinin
hesaplanmasıdır. Formüle hangi sırayla yazacağımızı gösteren aşağıdaki tabloyu
incelersek, birinci noktanın X değeri (yani A değişkeni) 10, Y değeri (C) 30, ikinci
noktanın X koordinatı (B) 15, Y koordinatı (D) 40 ve Y değeri bilinmeyen üçüncü
noktanın X değeri 12’dir.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 4
Doğru orantı ile interpolasyon yapılırsa, bu noktanın Y değeri;
Y3 = ((X3-X1)/(X2-X1))*(Y2-Y1)+Y1
yani
Y3 = ((E-A)/(B-A))*(D-C)+C
olacaktır.
Bu işlemi yapacak INTPL adında bir işlev tanımlamak için aşağıdaki gibi
hazırladığımız VBA kodunu satır satır inceleyeceğiz.
Function INTPL(A As Variant, B As Variant, C As Variant, D As Variant, E As Variant)
Öncelikle tüm yeni işlevler Function ISLEVIN_ADI(Degiskenler) şeklinde tanımlanır.
İşlevin kullanıcıdan kaç farklı değişken talep ettiği ve bu değişkenlerin ne formatta
olacağı bu kısımda belirlenmiş olur. Bizim örneğimizde, INTPL adında bir fonksiyon
yaratıyor ve kullanıcıdan A, B, C, D ve E adında beş farklı değişken talep ediyoruz.
Bu değişkenlerin tam sayı mı, rasyonel sayı mı, metin mi, tarih mi yoksa
FARKETMEYECEK ŞEKİLDE HERHANGİ BİRİ mi olduğunu da sonuna “as Variant”
şeklinde yazarak belirtiyoruz. Bu örnekte farketmeyecek şekilde “Variant” olarak
seçilmiştir.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 5
INTPL = ((E - A) / (B - A)) * (D - C) + C
İkinci kısımda ise, sırasıyla A,B,C,D ve E olarak talep ettiğimiz değişkenleri nasıl bir
işleme tabi tutup, işlevin yazıldığı hücreye sonuç olarak yazılacak değerin
hesaplanması gerçekleştirilir. Bu örnekte, sayıları seçerken X1, X2, Y1, Y2 ve X3
yani A, B, C, D ve E sırasıyla seçtiğimiz taktirde işlev doğru sonuç verecektir.
End Function
Tüm işlevler End Function komutuyla tamamlanır.
Hazırlık tamam olduğuna göre çalışıp çalışmadığını kontrol edebiliriz. Yukarıdaki
resimdeki örnekte, B5, C5, B6, C6 ve D5’e sırasıyla A, B, C, D ve E değerleri girilmiş
olup, interpolasyon sonucu olan değeri hesaplamak için D6 hücresine =INTPL(
yazdıktan sonra sırasıyla B5, C5, B6, C6 ve D5 hücrelerine aralarında noktalı virgül
(;) bırakarak tıklayıp, Enter tuşuna basmak suretiyle işlem sonuçlandırılır.
İşlevleri çalıştırmanın bir diğer kolay yolu ise, onları hemen içerik doldurulan kısmın
solundaki “fx” düğmesine basarak seçmektir.
İşlevler listesi açıldığında burada kullanıcı tarafından tanımlanmış olan işlevler “User
Defined” başlığı altında listelenir.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 6
INTPL olarak isimlendirdiğimiz fonksiyonuna bu ekranda çift tıklayarak, bu işlevle
çalışmak istediğimizi seçtiğimizde Excel, bu işlevi tanımlarken kullanıcıdan talep
ettiğimiz değişkenleri sıralayarak onları mevcut hücrelerle eşleştirmemizi isteyecektir.
Aşağıdaki gibi eşleştirmeyi tamamlayıp, “OK” düğmesine basmak suretiyle de işlemi
yapabiliriz.
Her iki durumda da beklendiği gibi interpolasyon sonucu olarak “34” sonucunu
verecektir. Bu işlevi tanımlamak ile bir kere tanımlama kadar zaman kaybederek
bundan sonraki her interpolasyon yapılacağında, o işlemi hücreye ayrı ayrı
“=((D5-B5)/(C5-B5))*(C6-B6)+B6”
gibi
yazıp
hata
riskini
artırmamış,
“=INTPL(B5;C5;B6;C6;D5)” gibi sırasını bildiğimiz bir şekilde yazarak kolaylık
sağlamış olacağız.
2.3 Yaş Hesabı İşlevi Örneği
İkinci örnekte daha kolay bir işlev tanımlanacak olup, hedeflediğimiz değişkenin
“Variant” değil özel bir giriş şekli olması durumunda ne olacağını incelemek. Burada
örnek olarak tarihler dikkate alınmıştır. İki farklı tarihi çıkarma işlemine tabi tutarsanız,
Excel bu tarihler arasındaki gün farkını bulacaktır. Gün sayısını, 365 gün 6 saate
bölüp, sonucu da tam sayıya çevirdiğimiz taktirde, farkın yıl cinsinden tamamladığı
kısmını hesaplamış oluruz.
Bu örnekteki işlevde kullanıcının doğum tarihini tek değişken olarak talep eden, buna
istinaden yaş hesaplayan bir işlev tanımlayacağız. Her satırın ayrı ayrı açıklamalarını
inceleyerek, işlevi daha kolay anlayabiliriz.
Function YASKAC(DT As Date)
Bu kısımda YASKAC adında bir işlev tanımlıyoruz. Bu işlev DT adında tek bir
değişken talep ediyor olup, bu değişkenin seçildiği hücrenin biçiminin TARİH (Date)
olması gerekmektedir.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 7
YASKAC = Int((Date - DT) / 365.25)
Bu kısımda Date olarak yazan değişken, global geçerli Visual Basic sisteminin
algıladığı içinde bulunulan günü veren değişken olup, yapılan işlem yukarıda
bahsettiğimiz hesabın kağıda dökülmüş halidir. Basitçe bugünden, girilen doğum
tarihi çıkarılıyor olup, bu sayı 365.25’e bölünmekte ve Excel’in kendi içinde kayıtlı
olan INT işleviyle tamsayıya dönüştürülmektedir.
End Function
Tüm işlevlerde olduğu gibi bu işlev de bu komutla kapatılmaktadır.
Module içerisine yazdığımız bu metni kaydettikten sonra kaydedip, Visual Basic
ekranından Excel’e dönerek yukarıdaki gibi çalışıp çalışmadığını kontrol edebiliriz. A1
hücresine herhangi bir tarih yazdıktan sonra, her hangi bir hücreye =YASKAC(A1)
işlevini yazarak A1 hücresine yazdığımız doğum tarihinin bugün itibariyle kaç yaşında
olduğunu gösterecektir.
3. Macro’lar
Macrolar, Excel vb. Microsoft Office ürünlerinde bir çok kolaylık sağlayan
programcıklardır. Bu programların hazırlanması için çok kompleks VB kodları
yazılabileceği gibi, hiçbir kodlama yapmadan da program hazırlanabilir. Macro
konusunda bir örneği iki aşamada işleyeceğiz. Bu aşamaların ilki hiç bir programlama
gereksinimi duymaksızın, bir macro’yu kaydetmek ve Excel’in bundan sonraki
seferlerde ona öğreteceğimiz bu görevi kendi kendine yapmasını sağlamak olacaktır.
İkinci aşamada ise, bu durumu nasıl biraz kodla destekleyebilir ve biraz programlama
yardımıyla neler yapabiliriz onu inceleyeceğiz.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 8
3.1 Macro’ların Kaydedilmesi
Bu kitabın dijital ekinde bulunan deneme2.xls dosyası içeriğinde de bulunan basit
arayüzü aşağıdaki gibi oluşturabiliriz. Bu arayüz ile, 1’den başlayarak sonsuza yahut
tanımlayacağımız bir sayıya kadar çıkan açıların sinüs değerlerinin grafikte hareketini
izlemeyi hedefliyoruz.
Öncelikle 1 sayısını yazdığımız hücrenin altına, bir sonraki aşamada alacağı değer
olan 2 sayısını, toplama işlemi sonucu olacak şekilde =B3+1 şeklinde yazıyoruz.
Böylelikle, bir sonraki işlem için aşağıdan yukarıya 2 sayısını “Values Only” (Yalnızca
değer) olarak kopyaladığımızda, bundan da sonraki adım için orasının kendisini 3
olarak hesaplayabilmesini sağlayacağız.
Bir yandaki kısıma, sinüs hesabına hazırlık olarak, derece girilmiş sayıyı radyan
cinsine çevirecek basit bir formül yazacağız. Sayıyı 180’e bölüp PI() (pi sayısının
Excel’e tanımlı yazılış şekli) ile çarpmak suretiyle hesaplanacaktır.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 9
Sonraki adımda, bir önceki hücrenin sinüs değerini hesaplayan Excel içine
halihazırda tanımlı SIN işlevini kullanacağız.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 10
X sayısı olarak düşündüğümüz sayı birer arttığında sinüs değerinin hareketini
izleyebilmek amacıyla tek noktayı tek eksende gösterecek basit bir grafik
hazırlayabiliriz.
Şimdi sıra macro’nun kaydedilmesine geldi. Bu aşamada, daha önceki kısımlarda
öğrendiğimiz şekilde Developer sekmesini görünür vaziyete getirip, bu sekmede sol
üstte yer alan Record Macro tuşuna basacağız.
Karşımıza yukarıdaki gibi bir form çıkacaktır. Burada daha sonra aynı görevi Excel’e
yaptırabilmek üzere, oluşturacağımız Macro’ya bir isim ve kısayol tuşu atamaktayız.
Description kısmına opsiyonel olarak bir tanım yazılabilir. ARTIR ismini ve Ctrl + r
kısayol kombinasyonunu yazdıktan sonra OK tuşuna basarak Excel ekranına
dönüyoruz. Bundan sonra yapacağımız her adım, Excel tarafından kaydediliyor olup,
daha sonra Ctrl+r tuşlarını kullandığımızda aynıları tekrar edilecektir. Biz kendi
programımızın amacına uygun olarak, BİR SONRAKİ X yazan kısmın yanındaki “2”
sayısına sağla tıklayıp “Kopyala” (Copy) diyoruz ve sonrasında şu anda “1” yazan bir
üstteki hücreye sağ tuşla tıklayarak “Yapıştır” yazısının hemen altındaki
sembollerden “123” şeklinde görünen “yalnızca değer olarak yapıştırma” şeklinde alt
satırdaki sayıyı yukarıya yapıştırıyoruz. Böylelikle yukarıda “2” yazıyor ve bir alt hücre
kendini otomatik güncellediği için burada “3” yazıyor.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 11
Bu kopyala-yapıştır işini tamamladıktan sonra, daha önce Record Macro yazan yerde
şimdi bulunan Stop Recording tuşuna basarak, bu Macro’nun kaydedilmesini
sonlandırıyoruz.
Böylelikle ARTIR adında, Ctrl+r kısayol tuşlarına bastığımızda çalışan ve her
çalıştığında BİR SONRAKİ X değerini yukarıya kopyalayıp yapıştıran bir programımız
olmuş oluyor.
Programın çalışıp çalışmadığını kontrol etmek üzere, Ctrl+r tuşlarına birkaç defa
basarak, hem sayıların güncellendiğini, hem de grafikte sinüs değerinin yukarıya (1’e
ulaşana kadar) hareket ettiğini gözlemleyebiliriz.
3.2 Macro’ların Programlanması
Bu kısıma kadar, hiç bir programlama yapmadan Macro’yu oluşturmuş olduk, ancak
Excel bize bir iyilik yaparak, aslında bizim ona el yardımıyla tarif ettiğimiz işi program
dili olarak hazırladı. Daha önceki kısımlarda öğrendiğimiz, Developer sekmesinden
Visual Basic düğmesine tıklayarak Excel’in arkaplanındaki programlama bölümüne
geçeceğiz. Burada Modules kısmına çift tıkladığımızda aşağıdaki gibi bir ekran
çıkacaktır.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 12
Buradaki yazan kodu satır satır incelersek,
Sub ARTIR()
Tüm alt programlar Sub PROGRAM_ADI() şeklinde başlar.
'
' ARTIR Macro
' Sayilari bir artirma makrosu
'
' Keyboard Shortcut: Ctrl+r
'
Başında ‘ konan satırlar açıklama amaçlıdır, Excel tarafından dikkate alınmaz. Excel
bu kısımda programın ismini, kısayol tuşlarını ve açıklamasını bizim verdiğimiz
bilgiler ışığında buraya yazmıştır.
Range("B4").Select
Burada B4 hücresini seçme komutu yazmaktadır.
Selection.Copy
Seçili olan hücrenin kopyalanması komutu yazmaktadır.
Range("B3").Select
Burada B3 hücresini seçme komutu yazmaktadır.
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Burada ise yalnızca değerler olarak yapıştırma komutunu yazmaktadır.
End Sub
Programlar End Sub komutu ile sonlanır.
Son olarak yapacağımız, bu komuta el ile ufak müdahale ederek, kullanıcıdan ek bilgi
sorma ekranı çıkarmasını ve bu bilgiye yönelik döngü oluşturmasını sağlayacağız.
Bunu yapmak için öncelikle End Sub ile biten kodun altına birkaç Enter tuşuyla
indikten sonra aşağıdaki kodu kopyalayacağız. Bu kodun içeriğini daha sonra satır
satır inceleyeceğiz. Bu yeni eklemeyle, defalarca Ctrl+r tuşuna basarak adım adım
ilerlemek yerine, tek seferde kullanıcının talep ettiği adım kadar aynı kodu tekrar
edecek bir döngü tanımlayacağız.
Sub COKLUARTIR()
TOPLAMHAREKETMIKTARI = InputBox("UYARI", "Toplam kac hareket olacak?",
360)
For i = 1 To TOPLAMHAREKETMIKTARI
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 13
Range("B4").Select
Selection.Copy
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Next i
End Sub
Satır satır incelersek eğer,
Sub COKLUARTIR()
Burada sadece programın adını farklı olarak yazıyoruz.
TOPLAMHAREKETMIKTARI = InputBox("UYARI", "Toplam kac hareket?", 360)
TOPLAMHAREKETMIKTARI adlı değişkenin değerini InputBox komutunu kullanarak,
kullanıcının el ile girmesini sağlıyoruz. Ekranda karşımıza tek satırlık bir form olarak
çıkacak bu kutucuğun başlığında, içeriğinde ve varsayılan değerinde yazacak
metinleri/değerleri sırasıyla tanıtıyoruz.
For i = 1 To TOPLAMHAREKETMIKTARI
VB dilindeki döngü komutu i sayısı 1’den başlayıp herhangi bir sayıya ulaşana kadar
tekrar et anlamına gelecek şekilde, bu örnekte i sayısının son sayısı olarak bir üst
satırda kullanıcıya sorup belirlettiğimiz değere kadar işaretlenmiştir. Böylelikle
program çalıştığında kullanıcının karşısına çıkacak kutuya kullanıcı hangi sayıyı
yazıp Tamam derse, o kadar miktarda aşağıdaki kod tekrar edilecektir.
Range("B4").Select
Selection.Copy
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Bu kısımlarda hiçbir değişiklik olmayıp, Excel’in B4’ten alıp B3’e kopyaladığı hazır
koddur.
Next i
Son eklenti yukarıdaki gibi olup, döngünü devam etmesini sağlamak üzere bir sonraki
i sayısına hareket etmesine yol açan komuttur. Örneğin i 1’den
TOPLAMHAREKETMIKTARI değişkenine kadar hareket edecekse, ve bu değişkene
yine örneğin 20 seçilmişse; i sayısını 20’ye ulaşana kadar 1 artırarak For i... diye
başlayan satıra programın dönmesini sağlamaktadır.
End Sub
Burada herhangi bir değişiklik olmayıp, yeni kod kapanmaktadır.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 14
Son aşamada daha önce otomatik olarak yaptığımız Macro’ya kısayol atama işini bu
sefer, Developer sekmesindeki Macros düğmesine basarak gerçekleştireceğiz.
Karşımıza çıkan bu ekranda, halihazırda mevcut Excel dosyası içerisinde
tanımlanmış Macro’lar görünmektedir. Bunlardan aşağıdaki olan yeni eklediğimiz
COKLUARTIR programının özelliklerini üzerine tıkladıktan sonra Options...
düğmesine basarak değiştireceğiz. Karşımıza çıkan aşağıdaki kutuya kısayol tuşu
olarak Ctrl + t seçtikten ve tanım kısmını (opsiyonel) doldurduktan sonra, Tamam
diyerek ekranı kapatabiliriz.
Böylelikle Ctrl+t tuş kombinasyonu artık bu programı devreye sokacaktır. Denemek
için tekrar Excel’e dönüp Ctrl+t tuşlarına bastığımızda, programın devreye girmesiyle,
en başında kodladığımız, kullanıcıdan tekrar miktarını soran kutucuk görünecektir. Bu
kutucuğa 50 yazıp Enter’a bastığımız taktirde, program 50 kere kendini tekrar edecek
ve X değerini 1’den 51’e kadar adım adım artıracaktır. Bu kısımda grafikte sin(x)
değerinin yavaş yavaş yükselişini izleyebiliriz.
Hazırlayan: Ali Özen - 2014
Excel için VBA
Sayfa No. 15
Önemli Not:
Bu notlarda, bahsi geçen deneme.xls ve deneme2.xls dosyaları CD içeriğinde
mevcuttur.
Bu notlar amatörce hazırlanmış olup, izinsizce kullanımı, kopyalanması, hatta içinden
bilgi araklanıp, kaynak göstermeden kullanılmasında hiçbir sakınca yoktur. Faydalı
olması dileğiyle.
Hazırlayan: Ali Özen - 2014