Bu makalemizde VBA kodunuza bir Excel fonksiyonu nasıl uygulayabileceğimizi anlatacağım. Makro yazarken bazı durumlarda Excel’in yerleşik fonksiyonlarından birini kullanmak isteyebiliriz. Bu durum makro yazarken mümkündür. Örneğin Düşeyara fonksiyonunu makro kodu içinde Excel’de olduğu şekliyle kullanabiliriz.
VBA’da bulunmayan pek çok fonksiyon vardır ama yerleşik Excel fonksiyonlarından VLookup, Max, Min ve daha birçok Excel işlevini doğrudan VBA makronuzdan çağırmak için Application.WorksheetFunction uygulamasını kullanırız.
Aşağıdaki Excel tablosunda standart bir Excel fonksiyonunu kullanmak isteyelim.
Yukardaki örnekte Oya adlı personelin maaşını VLookup’u kullanarak bulmak istiyoruz . Makro ile bunu aşağıdaki gibi yazarız:
Vlookup yazmaya başladığımızda altındaki etikette sadece Arg1,Arg2,Arg3,[arg4] yazdığını göreceksiniz. Haliyle Excel’deki gibi çok açıklayıcı bir etiket olmadığı göze çarpıyor ve pek kullanıcı dostu olmayan bir bilgi çıkıyor.
Bu çok kullanışlı değil, ancak sadece WorksheetFunction fonksiyonlarının argümanlarının standart Excel fonksiyonlarının argümanlarıyla aynı olduğunu bilin. Ancak sözdizimi farklı olabilir.
Excel’de formülü nasıl kullanacağınızı biliyorsanız, VBA WorksheetFunction yöntemini kullanarak formülün nasıl kullanılacağını bildiğinizden emin olabilirsiniz.
Application.WorksheetFunction kullanarak arayabileceğiniz düzinelerce işlevin sadece birine değindim . Tam bir liste için VBA Düzenleyicinizi açın ve kod yazmaya başlayın Application.WorksheetFunction. dediğinizde “Sözcük tamamlama” etkinse (Ctrl-Space), VBA makrolarınızda kullanabileceğiniz düzinelerce yerleşik Excel fonksiyonu arasında gezinebilirsiniz!
Yukardaki örnek deki gibi birçok fonksiyonu kod kısmında rahatlıkla kullanabilirsiniz. Bunun birkaç avantajı var bunlardan birisi kodlar çok kısalacaktır ikincisi yerleşik fonksiyonlar çok hızlı çalışırlar.
Özellikle topla, ortalama, mak, min tarzında fonksiyonlar çok sık kullanıldığı için yazdığımız kodlarda büyük avantaj sağlarlar.
Sonuçta var olan bir yapı mevcutsa kısa zamanda etkin kodlar yazmak isteniyorsa Application.WorksheetFunction nesnesi oldukça işe yarar biryapıdır. Bunların yanı sıra bazı fonksiyonlarda bu nesneyi kullanmayız örneğin left ,right gibi metinsel fonksiyonları Exceldeki gibi doğrudan yazarız bu fonksiyonlar için Application.WorksheetFunction nesnesi kullanılmaz.
Aşağıdaki örnekteki fonksiyonlar VBA yerleşik fonksiyonları olduğu için Application.WorksheetFunction yapısı kullanılmaz doğrudan yazılırlar.
Sub MetinselFonksiyonlar()
Dim isim as string
isim = “Cihan Doğan”
buyukharf = UCase(isim)
kucukharf = LCase(isim)
ilk2karakter = Left(isim, 2)
End Sub
Burada dikkat edilmesi gereken konu Excel’de ki fonksiyon adı ile her zaman aynı olmayabilir. Örneğin Büyükharf fonksiyonu Excel’de Upper diye yazılır VBA kısmında ise Ucase olarak yazılır bu farklara dikkat etmek gerekir.
Excel belgelerinde eğer çok fazla sayfa var ise ve bu sayfaları silmek bir noktadan sonra zorlaşıyor ise bu makromuz, bu iş için tam biçilmiş kaftan…
Bu makalemizde bir veya daha çok sayfayı hızlıca silebileceğimiz bir makro uygulamasını form ara yüzü kullanarak nasıl silebileceğimizi göstereceğim. Uygulamanın çalışan son hali aşağıdaki gibidir. Silmek istediğimiz sayfaları seçerek, tarayarak, arama yaparak veya tümünü seç gibi işlemleri yaparak seçebilir ve silebiliriz. Çoklu seçim için Ctrl tuşuna basarak seçim yapmak oldukça kolay ve pratiktir.
Uygulamamız için ilk etapta yukarda görülen form’u tasarlıyoruz.
Daha sonra Tümünü Seç, Tümünü Kaldır ve Sil düğmeleri için kodlar yazıyoruz. Form arayüzünü açmak için Crtl+j kısayolu ile formu çağırabiliriz.
Form yüklendiğinde yani aktif olduğunda o Excel belgesinde normalde kaç tane sayfa var ise otomatik olarak listeye eklenmesini istiyoruz.
Bunun için aşağıdaki kod bloğunu kullanırız:
Private Sub UserForm_Activate()
‘Form önyükleme
For Each k In Sheets
ListBox1.AddItem k.Name
Next k
End Sub
Form açıldıktan sonra istediğimiz sayfaları tek tek seçerek, taratarak veya arama yaparak seçip Sil düğmesine tıkladığımızda otomatik olarak silebiliriz.
Tümünü seçmek için aşağıdaki kodu kullanırız. Bu kod çalıştığında form içinde kaç tane sayfa var ise hepsinin onay düğmesi seçili hale gelecektir.
Private Sub CommandButton2_Click()
‘Tümünü seç
For i = 0 To ListBox1.ListCount – 1
ListBox1.Selected(i) = True
Next i
End Sub
Seçili olan tüm sayfalarda Tümünü Kaldır düğmesine tıkladığımızda ne kadar seçili sayfa var ise hepsininde seçimleri iptal olur bunun için aşağıdaki kod bloğunu kullanırız.
Private Sub CommandButton3_Click()
‘Tümünü Kaldır
For i = 0 To ListBox1.ListCount – 1
ListBox1.Selected(i) = False
Next i
End Sub
Eğer arama kutucuğunu kullanarak silme yapmak istersek istediğimiz sayfa adını yazarak listbox içinden arama işlemini yaptırıp seçili olan sayfa veya sayfaları silebiliriz. Bu işlem için aşağıdaki kod bloğunu kullanırız.
Private Sub TextBox1_Change()
‘Arama
Dim i As Integer
Dim j As Integer
With ListBox1
.MultiSelect = fmMultiSelectSingle
.ListIndex = -1
.MultiSelect = fmMultiSelectMulti
For i = 0 To .ListCount – 1
For j = 0 To .ColumnCount – 1
If LCase(InStr(1, .Column(j, i), TextBox1.Text, vbTextCompare)) Then
.ListIndex = i
.Selected(i) = True
End If
Next j
Next i
End With
End Sub
Ve son olarak silmek istediğimiz sayfaları seçtikten sonra Sil düğmesine tıklayarak seçili sayfaları kolaylıkla silebiliriz. Bunun için Sil düğmesinin çift tıkladıktan sonra açılan sayfaya aşağıdaki kodu yazmamız yeterlidir. Böylece ne kadar seçili sayfa var ise silinecektir.
Private Sub CommandButton1_Click()
‘Sayfa veya Sayfaları Silme
On Error Resume Next
Application.DisplayAlerts = False
For k = ListBox1.ListCount – 1 To 0 Step -1
If ListBox1.Selected(k) Then
Worksheets(ListBox1.List(k, 0)).Delete
ListBox1.RemoveItem (k)
End If
Next k
Application.DisplayAlerts = False
End Sub
Yukardaki makro kodları ile işlemimizi çok kolaylaştıracağız. Tabi bu formu çağırmak içinde bir kısayol atamamız gerekir. Diğer türlü sayfa içinden bir düğme koyup onu tıklayarak çağırmak çok mantıklı olmayacaktır. Ama kendimize özel bir makro sekmesi yapıp bu makroyu oraya bir ikon aracılığı ile yerleştirip kullanabiliriz. Tüm bunların yanı sıra kısayol işlemi oldukça basit ve daha kullanışlıdır. Formları çağırmak için modül ekleyim ilgili formu çağırmamız gerekmektedir. Bunun için makromuza bir modül ekliyor ve içerisine aşağıdaki kodu yazıyoruz.
Kodda Forma verdiğimiz ismi Show ederek görüntüleyebiliyoruz.
Aynı şekilde Hide ederek de gizleyebiliriz. Ama bunun için formdaki varsayılan çıkış düğmesinden kapatmayı daha uygun gördüm.
Bu makalemizde Excel’de işinize yaracak en temel 10 Makro kodunun ne işe yaradıklarını ele alacağız.
Excel de makro kullanarak çok zor ve zaman işlemlerinizi çok kısa sürelerde yapabilirsiniz. Bu süreler o kadar kısadır ki bir örnek vermek gerekirse 3-5 günlük bir iş 3-5 dk’ya kadar düşebilir diyebiliriz. Hal böyle olunca makroların önemi daha da artıyor. Karmaşık, düzensiz verilerinizi normalleştirirken ya da farklı tablo yapıları oluştururken makrolar olmazsa olmazımızdır.
Makrolar geliştirilirken bazen benzer mantıkta işlemler çok fazla karşımıza çıkar her defasında bu kodları yazmak yerine bu kodları arşivleyerek gerektiği yerlerde birkaç ufak değişiklikle kolaylıkla uygulayabilirsiniz.
Bu makalemizde 1o Temel makro kodunu sizlere ne iş yaptıklarını açıklayarak sunuyoruz. Çalışmanızda daha üretken olmanıza yardımcı olacak bu örnekler oldukça basit ve kullanışlıdırlar. Bu hayat kurtaran temel kodları uygulamak da oldukça basittir. Bundan önce VBA kullanmamış olsanız bile bu kodları kullanabilirsiniz. Tek yapmanız gereken bu kodları VBA editörünüze yapıştırmak.
Bu kodları kullanmadan önce, VB editörüne erişmek için Excel şeridinizde geliştirici sekmenize sahip olmamız gerekiyor veya tüm Office paketlerinde Alt+F11 kısayol tuşu ile (Excel, Word, PowerPoint vb.) ulaşabilirsiniz.
Geliştirici sekmenize gidin ve “Visual Basic” üzerine tıklayın.
“Proje Penceresi” n de sol tarafta, çalışma kitabınızın adını sağ tıklayın ve yeni bir modül ekleyin.
Sadece kodlarınızı modüle yapıştırın ve kapatın. Dilerseniz F5 kısa yolu ile de kodlarınızı çalıştırabilirsiniz.
Şimdi geliştirici sekmenize gidin ve makro düğmesine tıklayın.
Dosyanızda bulunan makroların listesini içeren bir pencere gösterecektir ve bu listeden seçtiğiniz bir makroyu çalıştırabilirsiniz.
Şimdi kodlarımızı inceleyelim.
Seçtiğiniz hücreden itibaren istediğiniz kadar sayıda sağa doğru boş sütun ekler ve diğer sütunları da öteler.
Sub CokluSutunEkle()
Dim i As Integer
Dim j As Integer
ActiveCell.EntireColumn.Select
On Error GoTo Son
i = InputBox(“Eklemek istediğiniz sütun sayısını giriniz”, “Sütun Ekle”)
Seçtiğiniz hücreden itibaren girdiğimiz sayı kadar otomatik doldurma yapar. Örneğin F7 hücresi seçili iken çalıştırdığımızda açılan giriş kutusuna 5 yazarsak F7 hücresinden aşağı doğru 1’den 5’e kadar sayı birer artan sayıları yazdırır.
Sub OtomatikSeriDoldurma()
Dim i As Integer
On Error GoTo Son
i = InputBox(“Değer giriniz”)
For i = 1 To i
ActiveCell.Value = i
ActiveCell.Offset(1, 0).Activate
Next i
Son: Exit Sub
End Sub
Seçtiğiniz hücrelerin sütun genişliklerini sütunun içindeki en uzun metne göre otomatik olarak ayarlar.
Sub SutunlariOtomatikAyarla()
Cells.Select
Cells.EntireColumn.AutoFit
End Sub
Seçtiğiniz hücrelerin satır genişliklerini satırın içindeki metne göre otomatik olarak ayarlar.
Sub AutoFitRows()
Cells.Select
Cells.EntireRow.AutoFit
End Sub
Excel’in tüm hücrelerini çözdükten sonra metni kaydır özelliğini çözer ve satır, sütun genişliklerini otomatik olarak ayarlar.
Sub MetniKaydirTemizle()
Cells.Select
Selection.WrapText = False
Cells.EntireRow.AutoFit
Cells.EntireColumn.AutoFit
End Sub
Birleştirilmiş seçili hücreleri eski haline geri döndürür.
Sub UnmergeCells ()
Selection.UnMerge
End Sub
Durum çubuğunda makro kodunun işlenmesi sırasındaki ilerlemenin yüzdesini görmek için aşağıdaki kodu kullanabiliriz.
İlgili sayfanın sağ üst köşesine o günün tarihini yazdırır. Üst ortada Satış Raporu ve üst solda ise ABC şirketi yazar.
Sub UstBilgiyeTarihEkleme()
With ActiveSheet.PageSetup
.LeftHeader = “ABC Şirketi”
.CenterHeader = “Satış Raporu”
.RightHeader = “&D”
.LeftFooter = “”
.CenterFooter = “”
.RightFooter = “”
End With
ActiveWindow.View = xlNormalView
End Sub
Makro ile Excel dosyasında çalışırken PowerPoint programını açmak için aşağıdaki kodu kullanabiliriz. Index değerini 0 yazarsak Hesap Makinası, 1 yazarsak Word, 3 yazarsak Outlook açılır.
Sub PowerPointAc()
Application.ActivateMicrosoftApp Index:=2
End Sub
Yukardaki kod blokları tek başlarına doğrudan bir anlam ifade etmeyebilir. Bizler yazdığımız kodlarda bu pratik kod bloklarını kullanarak daha hızlı uygulama geliştirebiliyoruz. En azından bir kere çalıştırıp sonucunu gördüğünüz zaman kafanızda yer edecek ve böyle bir durum ile karşılaşırsanız uygulamanız kolay olacaktır.
Bu makalemizde VBA eğitimlerimizde de çok üstünde durduğumuz bir konu olan Makrolar (VBA) ile Excel’de Fonksiyon Yazmak konusunu inceleyeceğiz.
Makrolar (VBA) ile Excel’de Fonksiyon Yazmaya Giriş
Excel’de yerleşik olarak birçok farklı kategoride toplamda 467 tane hazır fonksiyon bulunuyor. Bu fonksiyonlar ile mevcut işlemlerimizi yapmak istediğimizde formülleri kullanıyoruz.
Fakat bazı durumlarda bu fonksiyonlar doğrudan ihtiyaçlarımızı görmeyebilir veya çok fazla sayıda fonksiyonu bir arada kullanarak uzun ve karmaşık bir formül bizim için gerek kurgulanması bakımından gerekse yazılışı bakımından zor olabilir. Örneğin 40 tane eğer fonksiyonunu içiçe yazmak can sıkıcı olabilir.
Böyle durumlarda Excel’de VBA’i yani makroları kullanarak kendimize özel fonksiyonlar yazabiliyoruz.
Makrolar (VBA) ile Excel’de Fonksiyon Yazarak istediğimiz işlevleri rahatlıkla kodlaya biliriz. Üstelik bu fonksiyonları sonra değiştirebiliyor veya istediğimiz kişiler ile kolaylıkla paylaşabiliyoruz.
VBA ile ilgili daha çok bilgiye buradan erişebilirsiniz.
Modül Ekleme ve Kaydetme
Bir fonksiyon yazmak istediğimizde Excel’de kod editörüne geçip Insert sekmesinden bir Modül eklememiz gerekiyor.
Fonksiyonlar sayfalara yazılabilir ve kullanılırlar fakat Excel ara yüzünde eşittir (=) işaretini koyup fonksiyonun adını yazdığımızda fonksiyonun diğer yerleşik fonksiyonlar gibi çıkmasını istiyorsak kesinlikle fonksiyonumuzu bir modül’e yazmamız gerekiyor. Bir modüle birden fazla fonksiyon yazılabilir.
İçindeki modüllerde fonksiyon bulunan Excel belgelerini .xlsm (Makro İçerebilen Excel Çalışma Kitabı) uzantısı ile kaydedip bu belgeleri gönderdiğiniz herkes kullanabilir.
Fakat fonksiyon modülde olduğu sürece sadece o Excel çalışma kitabında çalışır başka bir Excel belgesinde = (eşittir) dediğinizde çıkmaz o yüzden fonksiyonlarımızı modül’e yazdıktan sonra belgede Farklı Kaydet diyerek fonksiyonu .xlam (Excel Eklentisi) olarak Excel’in varsayılan “C:UsersCihanAppDataRoamingMicrosoftAddIns” fonksiyon klasörüne kaydederiz.
Farklı bir adrese de kaydedebilirsiniz fakat o fonksiyonu her defasında göstermek zorunda kalabilirsiniz örneğin Excel’i açtığınızda ilk bakacağı yer AddIns klasörü olduğu için buraya kaydetmenizi tavsiye ederim.
Excel’deki fonksiyonlar aşağıdaki şekilde görünür. Bu tarz Excel dosyaları çift tıklanarak açılmazlar, bunlar bir klasöre yüklenir ve kullanılırlar.
Fonksiyon dosyasının adı ile fonksiyonun adı aynı olmak zorunda da değildir. Bir fonksiyon dosyasında birden fazla farklı isimde fonksiyonlar da bulunabilir.
.xlam dosyalarını Excel’den Çağırmak
Eğer başka bir konuma kaydeder iseniz Excel ara yüzünde =(eşittir) dediğinizde çıkmayacaktır böyle bir durumda da Geliştirici sekmesindeki Excel Eklentilerinden eklemeniz gerekecektir.
Geliştirici sekmesinden Excel eklentilerine tıkladığınızda açılan pencereden ilgili fonksiyonun onay kutusunu işaretleyip tamam dedikten sonra Excel’de kullanılabilir.
Evet şimdi gelelim fonksiyonumuzu yazmayaJ
Fonksiyon yazmak için modül’ümüze gidiyoruz ve Function kelimesi ile yazmaya başlıyoruz. Fonksiyon yazarken sayı ve karakter ile başlamıyoruz, boşluk koymuyoruz ve 255 karakterden uzun bir isim vermiyoruz.
Fonksiyon Yazımı
Function TCkontrol()
‘
‘ VBA Kodları
‘
End Function
Fonksiyonu yazdığımızda fonksiyon adının yanındaki parantez içine bir şey yazmaz iseniz fonksiyon parametre almayan fonksiyondur. Örneğin Excel’in yerleşik fonksiyonları olan Bugün, Şimdi, Pi gibi fonksiyonlar parametre almazlar.
Eğer bir parametre gönderecek isek parantez içinde aralarında virgüllerle ayırarak bu parametreleri tipleri ile belirleyebiliriz. Biz örneğimizde T.C. kimlik numarasını göndereceğiz ve bu T.C. kimlik numarasının doğru olup olmadığını arka planda yapacağı bir hesaplama ile bize doğru veya yanlış şeklide döndürecek bir fonksiyon yazacağız.
Fonksiyona göndereceğimiz TC numarasını fonksiyona metin gibi gönderip sonra her bir karakterini sırayla parçalarına ayıracağız. Daha sonra bu parçalardan bir matematiksel hesap ile 10 haneyi biz bulacağız akabinde 11 haneyi de yine ilk 10 haneden kendimiz elde edeceğiz.
Ve Excel’den gelen TC numarasının 10. ve 11. Hanelerinin benim bulduğum 10 ve 11. Hanelere aynı anda eşit olması durumda TC kimlik numarasının doğru olduğunu saptamış olacağız ve sonuç olarak doğru göndereceğiz aksi durumda yanlış bilgisini göndereceğiz.
Örnek bir fonksiyon: TCKontrol
Function TCKontrol(ByVal tc As String) As Boolean Dim tc1 As Integer Dim tc2 As Integer Dim tc3 As Integer Dim tc4 As Integer Dim tc5 As Integer Dim tc6 As Integer Dim tc7 As Integer Dim tc8 As Integer Dim tc9 As Integer Dim tc10 As Integer Dim tc11 As Integer Dim tc10x As Integer Dim tc11x As Integer tc1 = Mid(tc, 1, 1) tc2 = Mid(tc, 2, 1) tc3 = Mid(tc, 3, 1) tc4 = Mid(tc, 4, 1) tc5 = Mid(tc, 5, 1) tc6 = Mid(tc, 6, 1) tc7 = Mid(tc, 7, 1) tc8 = Mid(tc, 8, 1) tc9 = Mid(tc, 9, 1) tc10 = Mid(tc, 10, 1) tc11 = Mid(tc, 11, 1) tc10x = ((tc1 + tc3 + tc5 + tc7 + tc9) * 7 – (tc2 + tc4 + tc6 + tc8)) Mod 10 tc11x = (tc1 + tc2 + tc3 + tc4 + tc5 + tc6 + tc7 + tc8 + tc9 + tc10x) Mod 10 If tc10 = tc10x And tc11 = tc11x Then TCKontrol = True Else TCKontrol = False End If End Function
Yukarda bulunan fonksiyona Excel ara yüzünden TC numaralarını göndereceğiz ve bu ilgili işlemleri yaptıktan sonra bizlere TC’nin doğru olup olmadığını gönderecektir.
Peki başka neler biliyoruz?
Örneğin TC numaraları 11 hane olmak zorundadır.
ilk 9 hane elimizde ise 10 ve 11. Haneleri bulabiliriz.
TC numaraları kesinlikle çift sayı ile biter. (0,2,4,6,8)
11 hanenin hepsi de rakam olmak zorundadır.
O zaman bu kodu geliştirebiliriz. Örneğin karakter uzunluğu 11 haneden farklı ise hata yazdırabiliriz veya sadece rakamlardan oluşmuyorsa ya da son hanesi çift değilse hiç kontrole girmeden doğrudan hata sonucunu ekrana yazabiliriz.
Fonksiyonumuzu yazdık ve ülkemizde herkesin kullanacağı bir fonksiyon olduğu için istediğimiz kişilerle paylaşabiliriz. Dilerseniz kod kısmına geçip yeni kod ilaveleri yapabilir ve yine aynı isimle aynı şekilde kullanabiliriz. Makrolar (VBA) ile Excel’de Fonksiyon yazmanın güçlü yanlarını gördükçe sürekli yeni fonksiyonlar üreteceksiniz.
Yazdığımız fonksiyonları diğer Excel fonksiyonları içinde kullanabiliriz vb. birçok işlemi kolaylıkla yapabiliriz. Fonksiyonların en büyük avantajlarından biride hızlarıdır. Oldukça verimli ve hızlı çalışmaları sayesinde işlemleri kısa sürelerde halledebiliriz.
Yukardaki fonksiyon örneğinde görüldüğü üzere Makrolar (VBA) ile Excel’de Fonksiyon kullanarak istediğimiz gibi esnetip şekillendirebiliyoruz. Bu esneklik bizlere daha fazla ve doğru iş yapma olanağı sağlıyor.
İşlem Ekle ile fonksiyon çağırmak
Excel’de F(x) işaretine tıkladığınızda açılan pencerede Kategori seçerken Kullanıcı Tanımlı dediğinizde kendi yazmış olduğunuz fonksiyonları da görmeniz mümkündür.
Görüldüğü gibi Makrolar (VBA) ile Excel’de Fonksiyon yazmak oldukça kolay ve kullanışlıdır. Özellikle Makrolar (VBA) ile Excel’de Fonksiyon yazmayı tüm Excel kullanıcılarına öneriyorum.