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 aliozen@gmail.com 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
© Copyright 2024 Paperzz