FONKSİYONLAR

İÇİNDEKİLER

1- Fonksiyon(lar) Nedir?

    Daha önceden matematik işlemlerinde karşılaşmış olduğumuz fonksiyonlar aslı itibariyle vba makro yazımında ve de diğer programlama dillerinde kullanılan fonksiyonlar için bir temel niteliğindedir. Teorik olarak aynı mantıkta çalışırlar. Yapmak için tanımlandıkları bir görevi yerine getirmek. 

    Fonksiyonlar temel itibariyle, gündelik hayatımızda kullanabiliyor olacağımız örneklerden yola çıkarsak, bizim işimizi kolaylaştıran ev aletleri ile özdeşleştirilebilir. Mesela kahve makinası. Tek bir işlevi vardır. O da kahve hazırlamak. Siz içine veya cezvesine su ve kahve koyarsınız. Kahve makinası ise size sizin içebileceğiniz şekilde kahveyi servis eder. Aynı şekilde bir karıştırıcı düşünelim. Siz su ve un koyup aleti çalıştırırsınız, alet hamur hazırlar. Yani kahve makinasının görevi, kendisine verilen girdilerle kahve yapmaktır. Şekerli veya şekersiz olması ise tamamiyle sizin tercihinizdir. Şeker koyup koymamış olmanız kahve yapımını etkilemez. Aynı şekilde karıştırıcının görevlerinden biri de hamur yapmaktır. Hamur için zaruri ihtiyaç olan un ve sudur. Tuz ve kabartma tozu ise zaruri değildir. Çünkü tuz ve kabartma tozu olmadan da sadece un ve su ile karıştırıcı hamur yapar ve görevini gerçekleştirebilir.   Fonksiyonlar Fonksiyonlar Fonksiyonlar Fonksiyonlar Fonksiyonlar Fonksiyonlar Fonksiyonlar     Fonksiyonlar  Fonksiyonlar  Fonksiyonlar  Fonksiyonlar  Fonksiyonlar

    Evinizde çalışma şekli kahve makines ve karıştırıcıdan farklı bir ekipman grubu daha vardır. Bu ekipmanların çalışması için bir girdiye ihtiyaç duyulmaz. Sadece çalıştırmanız yeterlidir. Bu farklı çalışma prensibi olan ekipmanlar; aydınlatma ekipmanlarıdır. Sadece çalıştırdığımız zaman, aydınlatma ekipmanları ek bir girdi olmaksızın elektrik enerjisini ışığa çevirebilmektedir. Yani görevi bulunduğu yeri aydınlatmaktır. Fonksiyonlar  Fonksiyonlar

    Fonksiyonları sadece kelime anlamı bakımından değerlendiricek olursak; “fonksiyon” görev, işlev anlamına gelmektir. Tekrar programlama dillerindeki görevine dönersek ise fonksiyon; önceden tanımlı görevleri yerine getiren, farklı Sub-Routine’ler içerisinde kullanılabilen kod bloklarıdır. 

    Fonksiyonlar, kimi zaman aydınlatma ekipmanları örneğindeki gibi sadece kullanıcı tarafından verilen bir komut ile çalıştırılarak, programlandıkları görevlerini yerlerine getirirler. Kimi zaman kahve makinesinin ihtiyaç duyduğu gibi su ve kahve gibi girdilere ihtiyaç duyabilir, kimi zaman da ek olarak kahvenin şekerli veya şekersiz olması kullanıcıya bir seçenek olarak fonksiyonlar vasıtasıyla sunulabilir. Özetleyecek olursak eğek; Fonksiyonlar

    1- Sadece çalıştırılabilen, girdiye ihtiyaç duymayan fonksiyonlar(Aydınlatma) Fonksiyonlar

    2- Mecburi girdilere ihtiyaç duyan fonksiyonlar (Kahve makinesinin kahve yapabilmesi için kahve su mecburi girdilerdir). Fonksiyonlar

    3- Mecburi girdilere ek olarak bazı seçenekler sunabilen fonksiyonlar(fonksiyonun çalışmasını engellemeyen ancak sonuçlar üzerinde ufak tefek etkileri olan seçenekler  Şekerli mi? Şekersiz mi? Gibi).  Fonksiyonlar

    Fonksiyon konusunu elimizden geldiğince gerçek hayat ile bağdaştırarak fonksiyonlara farklı bir yaklaşım gerçekleştirdik. Şimdi ise “VBA makro yazımında fonksiyonlara” geçelim ve örneklerle fonksiyon konusunu öğrenelim. Fonksiyonlar

    Bu kapsamda adım adım bir fonksiyon tanımlayarak devam edelim.  Fonksiyonlar

2- Bir Fonksiyonun Tanımlanması

    Fonksiyonların vba editor ve modül üzerinde tanımlanması Sub-Routine’lerden farklıdır. Modülün yazdığımız kodun bir fonksiyon olduğunu tanıması için makro, Sub-Routine’den farklı olarak Sub ile değil Function ile başlar. Bir isim tanımlandıktan sonra (ismin sonuna eklenen parantezden sonra), fonksiyonun hangi tip veride işlem yapacağı da Sub-Routine’den farklı olarak bu ilk aşamada tanımlanır.Fonksiyonlar

                                                                                         Sub IlkMakro()            yerine          Function IlkMakro() As String   

    Bir alt bölümde temel farklar daha detaylı bir şekilde açıklanmıştır.

3- Fonksiyon ve Sub-Routine Karşılaştırması

    Bir fonksiyonun oluşturulması şekil itibariyle  Sub-Routine yazımına benzer. Ancak tabi temel farklılıklar vardır. İsterseniz bu aşamada Sub-Routine ve Function’a ait altta eklenmiş olan görsellere bir göz atıp aradaki farklılıkları bulmaya çalışabilirsiniz.     Fonksiyonlar

    Şimdi Fonksiyonu parçalayarak inceleyelim. Fonksiyonlar

Fonksiyonlar_Gorsel_1
Excel VBA Editorde Fonksiyonların Tanımlanmasına Ait Görsel

    1- Sub yerine Function ile fonksiyon yazılmaya başlanır ve sonrasında Fonksiyonun adı yazılır. Burada parantez koymak mecburidir. Aksi halde kod As kelimesi üzerinde hata verir(İleri örneklerde bu parantezin ne için koyulduğunu göreceğiz). Parantezden sonra ise aynı değişken tanımlar gibi fonksiyonun da işlem yapacağı veri tipini tanımlıyoruz.

    2- Burada ise yapılması gereken işlemi görüyoruz. Asıl işlem burada tanımlanıyor. Burada dikkat etmeniz gereken şey, ise örneğimizde sadece formatlama kullanmış olmamız. Yani formatlamanın sonucunu ve tarihi biz fonksiyonu başka bir yerde kullanmadığımız sürece göremeyiz. Diğer bir detay ise bu fonksiyonda herhangi bir şekilde mecburi veya isteğe bağlı bir parametrenin kullanılmamış olmasıdır.

    1′- Aynen Sub ve diğer ifadelerde olduğu gibi End Function yazarak fonksiyonu oluşturmayı bitiriyoruz. 

    

Fonksiyonlar_Gorsel_2
Fonksiyon ve Subroutine Karşılaştırması İçin Kullanılan Görsel

       Basit bir Sub-Routine.

NOT= ‘Now’ VBA içerisinde önceden tanımlanmış bir fonksiyondur(Pre-Defined Function).  Bize o anın takvimini ve saatini verir(03.10.2019 10:33 gibi).Burada ise DuzenlenmisTarih Fonksiyonu çıktısı olarak bu Now sonucunu düzenliyoruz ve hangi günde olduğumuzun yazılmasını ve saatin yazılmamasını fonksiyon içerisne yazıyoruz. 

    Now yani tarihi formatlarken ilk önce formatlanacak olan şeyi yani ‘Now’ yazıyoruz. Sonrasın ise tarihin nasıl görünmesini istiyorsak o şekilde düzenleme yapıyoruz. Fabrika ayarında Now formatı “gg.aa.yyyy ss:dd” şeklindedir. Eğer office dili ingilizce ise de;  “dd.mm.yyyy hh:mm” şeklindedir (VBA kodlamasında kesinlikle ingilizce kullanılacağını unutmayın).Yani;

    gg, dd= Ayın hangi günü olduğu 2 karakterle belirlenir, 07 gibi. Ancak biz sadece tek bir g veya d yazarsak sadece 7 olarak ayın hangi günü olduğu beliritilir. Tabi çift basamaklı günlerde yine gg/dd formatı otomatik olarak kullanılacaktır. Ay ve yıl içinde aynı koşullar geçerlidir. Yani kaç adet hane ile ayın veya yılın gösterilmesini istiyorsanız o kadar harf girmelisiniz.

     Eğer günün adının da yazılmasını istiyorsanız da dddd yazarsanız en başa günün adı tam olarak yazdırılır. Yani Çarş değil Çarşamba gibi.

    1-Formatlanacak tarih fonksiyonu. Date de kullanılabilir ancak saati vermez.

    2- Günü de görmek istediğimiz için Day baş harfi olarak 4 defa d yazıyoruz. 3 veya 2 kere d yazıp sonucu gözlemleyin.

    3- Gün kaç hane ile yazılsın diye belirtiyoruz. (d:1, dd:01)

    4-Ayın ismi tam yazılsın diye dört adet m yazıyoruz.(Ay:Month)

    5- İçinde bulunulan yılın kaç hane olacağını belirliyoruz.

     Bu şekilde dd.mm.yyyy hh:mm şeklinde olan tarih yazılışını “dddd dd mmmm yyyy” olacak şekilde düzenlemiş oluyoruz. Gördüğünüz gibi saati bütün denklemden çıkarttık.

 

Fonksiyonlar_Gorsel_3 Bir Fonksiyonun Locals Window’da Çalıştırılmasına Ait Görsel

    Görselde yer alan fonksiyon halihazırda herhangi bir Sub-Routine tarafından kullanılmadığı için worksheet üzerinde yapacağı değişikliği göremeyiz. Bu nedenden dolayı da hem çalışıp çalışmadığını hem de istediğimiz sonucu verip vermediğini test edebilmek için Locals penceresini kullanırız. Locals penceresi açıkken F8 tuşuna basarak fonksiyon içerisinde ilerlerken yukarıdaki görsel son satırdaki komutu çalıştırmadan ortaya çıkar. 

    Locals penceresinde ilk sütunda fonksiyonun adı, ikinci sütunda fonksiyonun bir Sub-Routine içerisinde  çalıştırıldığında vereceği sonuç ve son kısımda ise bu sonucun yani fonksiyonun veri tipi yer almaktadır. Locals penceresi bu şekilde kullanılarak, fonksiyon worksheet üzerinde işlem yapmadan oto-kontrol sağlanmış olur.

4- Sub-Routine Aracılığıyla Fonksiyonun Çalıştırılması

    Fonksiyonlar Sub-Routine’ler içerisine gömülü olarak çalıştırılablirler. Aslında yukarı kısımda fonksiyon ve Sub-Routine karşılaştırmasında kullanılan görsellerde Sub-Routine içerisinde biz bu işlemi gerçekleştirdik. Şimdi aynı Sub-Routini burada da görelim.

    Sub TarihAt ()

        Range(“A1”).Value = DuzenlenmisTarih

    End Sub

    Gördüğünüz gibi ‘DüzenlenmisTarih’ fonksiyonunun sonucunu bu şekilde bir hücrenin değeri olarak atayabiliyoruz. Burada Sub-Routine içerisinde çalışmaya başlayan kod, ne zaman ki fonksiyonun olduğu satıra geliyor, bu sefer işlem Sub-Routine içerisinde durdurulup ilgili foksiyon içerisinde başlıyor. İşlem fonksiyon içerisinde baştan sona devam ediyor, bittiği anda tekrar kod, ilk Sub-Routine içerisinde kaldığı yerde devam ediyor. Bu sayede Sub-Routine içerisinde normalde gerçekleşen birçok hareket, Sub-Routine dışında gerçekleşmiş oluyor ve bizim kodumuz en sade haliyle kalabiliyor. Aynı fonksiyon, diğer Sub-Routine’ler içerisinde de kullanılabildiği için sadece Sub-Routine içerisinde fonksiyona atıfta bulunarak tekrar tekrar aynı kodu yazmaya gerek kalmıyor. 

    Hazırladığımız örnekte geçmiş konularımızdan birkaç tanesinin beraberce kullanıldığını göreceksiniz. Şimdiye kadar hazırladığımız makrolar içinde en uzunu olan bu makro ile hem konuları tekrarlamış olacağız, hem de fonksiyon konusuna geniş açıdan bakabileceğiz.

    Fonksiyonumuzu incelemeye başlamadan önce, fonksiyon içerisinde kullanılan ve sizin işlemediğimiz metotlar ile ilgili ufak bir tanıtım yapacağız. Bu sayede fonksiyonu incelerken dikkatimizin başka noktalara kaymasını engelleyeceğiz. Ancak ilk önce videoyu izleyerek, Sub-Routine’den nasıl fonksiyona geçiş yapıldığını görelim.

    Görselde Sub-Routine ve fonksiyonların nasıl iç içe çalıştığını gözlemleyebilirsiniz.

Örnek 1 - Tablo Düzenleme Fonksiyonu

    Fonksiyonlar bahsettiğimiz gibi birden fazla kez kullanılabilirler. Bu kapsamda tabloları tek tıkla düzenleyebilen bir fonksiyon oluşturduk. Bu fonksiyon yardımıyla oluşturduğunuz herhangi bir tabloyu, tablo bittikten sonra çalıştırarak;

    -Sütun İsimleri Yazı Karakterini ‘Times New Roman’ Değiştirebilir,

    -Sütun İsimlerini Bold Yapabilir,

    -Yazı büyüklüğünü 14’e çıkartabilir,

    -Başlık Satır rengini değiştirebilir,

    -Sütun genişliklerini, içlerindeki yazı uzunluklarına göre otomatik düzenleyebilir,

    -Okunması rahat olsun diye satır renklerini değiştirebilir,

    -Hazırlamış olduğunuz tablonun etrafını ve hücreler etrafına sınır çizdirebilir,

    -ve son olarak da tablonun en altına tablonun hazırlandığı bilgisayarın adını kullanarak kim tarafından tablonun hazırlandığını ve tarihini  atabilirsiniz.

    Yukarıda tablonun formatlanmasında yapacağımız işlemleri sıraladık. Size bu işlemleri isterseniz azaltabilir isterseniz de istediğiniz kadar çoğaltabilirsiniz, tamamiyle size kalmış bir durum. Normal koşullarda bir rapor yazarken standart bir tablo görünümü olması istenir. Burada tablonun formatlanması ile ilgili birfonksiyon oluşturarak hem bu tabloların her seferinde standart olmasını sağlıyoruz hem de her tablo için tek tek gerçekleştirmemiz gereken 8 adımı, hazırladığımız fonksiyon yardımıyla saniyeler içinde gerçekleştirebiliyoruz.

Ek Notlar

    .AutoFit metodu sütun genişliklerini otomatik olarak sütünların içerisindeki verilerin uzunluğuna göre ayarlamamızı sağlayan metottur. Birkaç Farklı şekilde kullanımı vardır. Aşağıda bizim örneğimize ek olarak farklı kullanım şekilleri de verilmiştir. 

    Her metot gibi .AutoFit metodu da ucuna eklenen object’i düzenler. Burada istersek tüm sütun boyunca yer alan en uzun veriye göre sütunların ayarlanmasını sağlarız, yada sadece başlık gibi verilerin bulunduğu ilgili satıra göre bütün sütunu baştan aşağı otomatik olarak ayarlarız. Her zaman çok kullanışlı olan bu metot bize makro kullandığımız süre boyunca çok faydalı olacaktır. 


 -Worksheets(“Sheet1”).Columns(“A:K”).AutoFit
 
-Worksheets(“Sheet1”).Range(“A5:L5”).Columns.AutoFit

.Borders metodu, belirlenen bir range objesinin içinde veya etrafında sınır çizmemezi sağlar. Yine çalışma şekli diğer metotlarla aynıdır. Yani ;

Nesne.Borders şeklinde kullanılır. .Borders ile ilgili olarak sadece birkaç adet parametreden bahsedeceğiz. Bunlar;

1-.Borders parametresi Sheet2.RAnge(“A1:C5”). Borders (XlDiagonalDown).LineStyle=1 ->>> Yandaki kodda gördüğünüz parantez içerisinde yer alan kısımdır ve sınır çizgisinin nasıl olacağını belirler. Bu kapsamda

– XlDiagonalUp ve XlDiagonalDown= Range içinde yer alan hücrelerin içerisine çapraz çizgi çeker.

-XlEdgeBottom ve XlEdgeTop; alanın en alt ve en üst kenarını çizer

-XlEdgeLeft ve XlEdgeRight; Seçili alanın sağ ve solunu çizer

– XlInsideHorizontal; Alan içerisinde yatay çizgiler oluşturur. Hücrelerden oluşan bir alanın içinde yatay çizgiler çizdirmek istiyorsak kullanıyoruz.

-XlInsideVertical;Alan İçinde dikey çizgiler oluşturur.Hücrelerden oluşan bir alanın içinde dikey çizgiler çizdirmek istiyorsak kullanıyoruz.

 

Nereye çizgi çizileceğine karar verdikten sonra, ki istersek hem alanın 4 tarafına hem de ortasına çapraz şeklinde olabilir tamamen size kalmış, bu sefer .Borders metoduna ait özellikleri(properties) değiştirebilirsiniz. Aşağıda ki görselde değiştirebileceğiniz özelliklerden bazılarını görebiliyorsunuz. Gördüğünüz .Color ve LineStyle gibi özellikler diğer metotlar için de geçerlidir. Hatılarsanız bir alanın da rengini değiştirirken yine .Color yani renk özelliğini aynı şekilde  değiştirmiştik. 

Fonksiyonlar .Borders Properties

    Şimdi çizgi çizme ile ilgili olarak yapacağımız işlemlerde çok işimize yarayacak olan LineStyle yani çizgi tipine ait çizgi tiplerini inceleyelim. 

Fonksiyonlar .LineStyle Çizgi Tipleri

.XlContinuous : Devamlı çizgi. Standart çizgi

xlDash: Kesikli çizgi

xlDashDot: Çizgi-nokta şeklinde çizgi

xlDashDotDot: Bir çizgi iki nokta

xlDouble: Çift çizgi

xlDot: Noktalar

xlLineStyleNone: Çizgi Yok

xlSlantDoshDot: Hat üzerinde eğimli nokta ve çizgi

Bildiğiniz gibi LinseStyle sonra XlSlantDashDot yerine sadece Değeri olan 13 yazarak da bu özelliği değiştirebilirsiniz. Tabi ki bu değerleri aklınızda tutmanıza gerek yok, LineStyle üzerine tıkladıktan sonra F1’e basarak yardım penceresini açarak, açılan pencerede yukarıda yer alan tabloyu bulup, kullanabilirsiniz. 

Son olarak da çizgi kalınlığını burada görelim;

Weight: XlThin—————İnce çizgi

Weight: XlMedium———Orta Kalınlık

Weight:XlThick————–Kalın Çizgi

Örnek olarak da kod içerisinde kullanımını verelim;

sub tablo()

    Range(“B3:J14”).Select

    With Selection.Borders(xlInsideVertical)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    

    With Selection.Borders(xlInsideHorizontal)

        .LineStyle = xlContinuous

        .Weight = xlMedium

    End With

End Sub

 

Bu metot ise seçtiğimiz alanın etrafına sınır çizer.

Worksheets("Sheet1").Range("A1:D4").BorderAround ColorIndex:=3, Weight:=xlThick

Kullanım şekli yukarıdaki gibidir. Veya;

Range(“b3:j14”).BorderAround xlContinuous

Şeklinde yazılan bir kod da tablonuzun etrafını normal bir çerçeveye almanıza yetecektir.

Örnek 1 - Tablo Düzenleme Fonksiyonu Kod İncelemesi

    Örnek fonksiyon içerisinde geçen ve bizim daha önceden görmemiş olduğumuz metotları ek notlar kısmında öğrendik. Şimdi fonksiyonumuzu oluşturan kodu bölüm bölüm inceleyelim.

    ilk olarak bir fonksiyona parametre eklemei görelim;

                                                    Function TabloDuzenle(SolUst_Kose As Range) As Range        ile          Function TabloDuzenle() As Range 

arasındaki fark aslında bakarsanız tam olarak bize parametrenin nasıl fonksiyona entegre edildiğini gösteriyor. İkinci fonksiyonumuz normal parametresiz bir fonksiyon. İlk fonksiyon örneği ise bir adet mecburi parametre alan bir fonksiyondur. PArametre eklerken fonksiyonun yanındaki panatezin içini kullanırız. 

      Burada mesela parantezin yanına ”SolUst_Kose As Range” yazarak bir adet parametre olduğunu göstermiş olduk. Ayrınca burada önemli bir nokta ise parametreyi sanki bir değişken tanımlarmışçasına veri tipini de belli ederek yazmış olmamız. Sadece “Dim” anahtar kelimesini kulanmadık. Burada verdiğimiz parametre bir mecburi parametredir ve eğer istersek virgül ile ayırarak aynı şekilde yeni mecburi parametreler de fonksiyona ekleyebiliriz. Burada verdiğimiz parametrelere mecburi/zorunlu parametre diyoruz çünkü eğer fonksiyonu çalıştırırken bu parametreleri fonksiyona girmezsek fonksiyon çalışmayacak ve size hata verecektir. Bölümün sonunda konu olarak zorunlu olmayan, tercihe bağlı parametreleri de işleyeceğiz. 

    Sub-Routine içerisinde tanımlanmış olan fonksiyonlar, IntelliSense Listesinde görülür. IntelliSense listesinde fonksiyonumuzun nasıl göründüğüne bakalım;

 

Şimdi bir Sub-Routine içerisinde fonksiyonumuzu çağırdığımız zaman, fonksiyonun parametreyi bizden nasıl istediğini görelim. 

Fonksiyonlar Fonksiyonun IntelliSense'de Görünümü

Sub-Routine içerisinde fonksiyonumuzun adının ilk harflerini yazıp CTRL+Space bastığımızda, TabloDuzenle fonksiyonunun IntelliSense ekranında listede olduğunu görebiliyoruz.

 

 Şimdi de Fonksiyonun kullanmamız gereken parametre konusundaki verdiği bilgiyi görelim. Bu sefer de fonksiyon ismini girip parantez açtıktan sonra girmemiz gereken parametreyi ve veri tipini ekranda görebiliyoruz.

 

 

 

 

Fonksiyonlar Parametre

Bölümün ileri kısmında zaten fonksiyonların nasıl kullanıldığını da göreceğiz. 

 

 

 

Fonksiyonlar Örnek 1-1

 

Fonksiyonlar Örnek 1-2

Tablonun fonksiyondan sonraki halinin kıyaslanabilmesi için, buraya tablonun fonksiyon çalıştırılmadan önceki halini ekliyoruz.

Fonksiyonlar Örnek Tablo

    Fonksiyonun tamamını, yaptığı görevleri daha rahat inceleyebilmek adına 5 bölüme ayırdık. Şimdi bu bölümleri sırayla inceleyelim.

NOT: Sub-Routine’den parametre olarak B3 hücresinin girildiği durum göz önüne alınmıştır.

Bölüm-1

    Fonksiyon, tablo düzenlenme işlemlerini, parametre olarak tablonun en üst sol köşesini istemektedir. Yapılan bütün işlemler tablonun sol üst köşesinin kullanıcı tarafından verildiği duruma göre ayarlanmıştır. 

    Bu kapsamda artık fonksiyon SolUst_Kose parametresini aktif hücre olarak seçerek işleme başlıyor.

    Range(ActiveCell, ActiveCell.End(XlToRight))—————————————————————-En sol hücreden başlayarak satırın en sonuna kadarki alanı seçen kod 

    SolUst_Kose.Select————————————————————————————————– Yani range olarak girdiğimiz hücre aktif hücre olarak belirleniyor.

    Range(ActiveCell, ActiveCell.End(XlToRight)).Font.Bold=True—————————————–Başlıkların olduğu satır soldan sağa olacak şekilde yazı kalınlığı kalın yapılıyor.

    Range(ActiveCell, ActiveCell.End(XlToRight)).Font.Name = “Times New Roman”————–Yazı tipi New Times Roman olarak ayarlanıyor.

    Range(ActiveCell, ActiveCell.End(XlToRight)).Font.Size = 14——————————————Yazı büyüklüğü 14 olarak değiştiriliyor

    Range(ActiveCell, ActiveCell.End(XlToRight)).Inretior.Color = rgbCornFlowerBlue———–Bütün satırın rengi değiştiriliyor ve rgbCornFlowerBlue yapılıyor.

Aşağıda 1. Bölümün Tablo üzerinde yaptığı değişikliği inceleyelim.

 

 Bölüm 2 

     Fonksiyonun ikinci kısmında ise   

     Range(ActiveCell, ActiveCell.End(xlToRight).End(xlDown)).Columns.AutoFit 

    kodu ile bütün tablo alanı seçilerek, tablo içerisinde hücrelerde yer alan en uzun verilere göre sütun genişlikleri ayarlanıyor. (AutoFit metodu ile ilgili not yukarıda verilmiştir.)

Bölüm 2’nin tablo üzerinde yapmış olduğu değişimleri inceleyelim. Bir üst bölüme göre sütun genişliklerinin ayarlandığını görebilirsiniz.

 

Fonksiyonlar Phase 2

 

Bölüm-3

    Tablonun başlıklar kısmının ve sütun genişliklerinin düzenlenmesinden sonra, verileri daha rahat okuyabilmek adına, başlıkların altından itibaren bütün veri satırlarının renklendirilmesine karar verilmiştir. Bölüm 3 olarak adlandırdığımız bu kod vasıtasıyla da bu işlemi gerçekleştirmiş oluyoruz. Şimdi bölüm 3 e oluşturan kodu inceleyelim.

    Zaten Fonksiyonun hemen başında For döngümüzde kullanılacak olan SatırSayisi ve Sayac değişkenlerini tanımlamıştık. Şimdi ise ilk önce SatirSayisi değişkenini verilerin yer aldığı satırları saydırarak belirliyoruz. Burada .Count metodunu kullandık. Seçilen hücrenin bir altındaki hücreden başlayarak en son içinde veri olan hücreye kadar kaç adet satır var belirliyoruz. 

    Sonrasında ise Sayac değişkenini kullanarak, bu belirlediğimiz satırları OffSet metodu yardımıyla geziniyoruz. Sayac değişkeninin aldığı değer eğer 2 ile bölünebiliyorsa üzerinde durulan satırın rengini rgbLightGray, bölünemiyorsa da rgbAliceBlue yapıyoruz. Bu işlem son satıra kadar devam ediyor ve bu sayede satırlar farklı olarak renklendirilmiş oluyor. 

SatirSayisi = Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).Count

    For Sayac = 1 To SatirSayisi

        If Sayac Mod 2 = 0 Then

            Range(ActiveCell.Offset _

            (Sayac, 0), ActiveCell.Offset(Sayac, 0).End(xlToRight)).Interior.Color _

            = rgbLightGray

        Else

            Range(ActiveCell.Offset _

            (Sayac, 0), ActiveCell.Offset(Sayac, 0).End(xlToRight)).Interior.Color = _

            rgbAliceBlue

        End If

    Next Sayac

Bölüm 3’ün tablo üzerinde gerçekleştirmiş olduğu değişkikliği inceleyelim. Gördüğünüz gibi renklendirme sayesinde artık veriler daha okunaklı bir hal almış.

 

 

 Bölüm 4 

    Tablomuzun kenarlıklarını oluşturmak için tek bir .Borders metodu yerine örnek teşkil etmesi için .BroderAround metodu da kullanılmıştır. Bu iki metot ile ilgili gerekli bilgiler Ek Notlar başlığı altında verilmiştir. 

     İlk önce tablonun içerisinde yer alan hücrelerin dik kenarları çizilmiş sonra da enine kenarlar çizilmiştir. Son olarak da .BorderAround metodu ile bütün tablonun dış kenarları çizilmiştir. Burada With kullanımı gördüğünüz gibi bütün alanı tanımlayan Range(ActiveCell, ActiveCell.End(xlToRight).End(xlDown)) kodunu 4 kere yazmaktan bizi kurtarmıştır. Ayrıca ileri zamanda bu tablo ile ilgili de bir değişiklik yapmak isterseniz yine çok basit bir şekilde With bloğu içerisinde bu değişkiliği gerçekleştirebilirsiniz.

    Range(ActiveCell, ActiveCell.End(xlToRight). _

    End(xlDown)).Select

    With Selection.Borders(xlInsideVertical)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    With Selection.Borders(xlInsideHorizontal)

        .LineStyle = xlContinuous

        .Weight = xlThin

    End With

    Range(ActiveCell, ActiveCell.End(xlToRight). _

    End(xlDown)).BorderAround xlContinuous

 Bölüm 4 ‘ün yaptığı çizimlerden sonra tablonun aldığı şekli görebilirsiniz. Artık sınırları çizili daha derli toplu bir tablomuz var.

 

 

Bölüm-5

    Bölüm 5’te son olarak tablonun en altına tablonun kim tarafından hangi tarihte yapıldığı yazılıyor. Burada her defasında farklı bir isim girmek yerine, bilgisayarın User hesabındaki ismin yazılmasını sağlıyoruz.

    ActiveCell.End(xlDown).Offset(1, 0).Value =  Environ(“UserName”) & ” Tarafından ” &  Format(Now, “dddd dd mm yyyy hh:mm”) & ” Tarihinde Hazırlanmıştır.”

    Bu son dokunuşla beraber tablomuz üzerinde yapılan işlemlerimiz son bulmuş oluyor.

 

Örnek 1 - Tablo Düzenleme Fonksiyonunu Sub-Routine ile Çağırma

    Fonksiyonumuzu adım adım incelemeyi bitirdikten sonra şimdi sıra Sub-Routine içerisinde fonksiyonumuzu çağırmaya geldi.

    Sub Fonksiyon_Cagir()

        Dim R as Range

       Set R = Application.InputBox(“Tablonuzun Üst Sol Köesini Seçiniz”, “Tablo Düzenleme”, “Bir Hücreye Tıklayanız”, , , , , 8)

       Call TabloDuzenle(R)

    End Sub

    İlk olarak fonksiyondan gelecek olan bir veri yoksa veya bir karşılığı yoksa, yani fonksiyondan dönen sonucu bir değişkene atamak gibi bir eşitlik kullanmayacaksak, fonksiyonu çalıştırma işlemini ‘Call’ ifadesini kullanarak gerçekleştiriyoruz. Yukarıdaki örnekte görebileceğiniz gibi sadece “Call + Fonksiyon Adı ” şeklinde fonksiyonumuzu kontrol edebiliyoruz. Tabi fonksiyondan sonra parantez içerisine istenilen veri tipindeki parametreyi girmek zorundayız.

    Bu örnekte elle bir tablonun en üst sol hücresini girmekten ziyade, ilgili hücreye tıklayarak hücrenin referansını almanın daha az hataya sebep olabileceği ve kullanımı açısından da kolay olduğunu düşünüdüğüm için, parametreyi Application.InputBox metodu ile kullanıcıdan alınmasını daha uygun buldum. Bu kapsamda Range tipinde bir değişken tanımladım ve Application.InputBox yardımıyla bu değişkene Range olarak değer atanmasını sağladım. Application.InputBox çalıştığı zaman bize “Tablonun Üst Sol Köşesini Seçiniz” mesajı veriyor ve biz de bir hücreye tıkladığımız zaman tıklanan hücrenin adresini R değişkenine atıyor. 

Appliciation.InputBox ile ilgili dersi tekrar etmek isteyenler alttaki tuşa tıklayarak dersin sayfasını ziyaret edebilirler.

 

    Son olarak da R değişkeni Range formatında ve Range veri tipini taşıdığı için fonksiyonumuz içerisinde parametre olarak kullanılabiliyor.

    Call TabloDuzenle(R) 

    ve bu şekilde fonksiyonumuzu çalıştırmış oluyoruz. Şimdi istediğimiz tablonun sol üst köşesine tıklayarak şekilsel değişiklikleri gerçekleştirebiliriz. Yanlış anlamayın isterseniz tablonun ortasında bir hücreye de tıklayabilirsiniz ancak fonksiyon tıklanan hücrenin sağı ve altını tablo olarak belirleyip işlemleri ona göre yürütecektir.

Örnek 1 - Tablo Düzenleme Fonksiyonuna Optional Parametre Ekleme

    Fonksiyonlara istediğimiz kadar parametre ekleyebiliriz. Burada dikkat edilmesi gereken eklediğimiz parametrelerin zorunlu parametre mi yoksa seçmeli parametre mi olacağına karar vermek ve ona göre de parametreleri fonksiyon içinde tanımlamaktdır. 

    Parametreleri tanımlarken uymamız gereken basit birkaç tane kural vardır. Bunlar; 

    1-Seçmeli parametreleri belirtirken sadece parametrenin önüne ‘optional’ ifadesi eklenir.

    2-Zorunlu parametreler sol başta, seçmeli parametreler sağ tarafta olur.

    3- Seçmeli parametrelere eğer bir değer verilmediyse uygulaması için bir değer atanabilir.(Default değer). 

    Şimdi örneğimizde bu bahsi geçen kuralların uygulanmış hallerini görelim. 

    TabloDuzenle fonksiyonumuzla ilgili olarak SolUst_Kose zorunlu parametresine ek olarak KalinCizgi seçmeli parametresini de ekledik. Şimdi ekran görüntüsüne bakalım.

Fonksiyonlar-Fonksiyonun Secmeli Parametrenin Fonksiyona Eklenmiş Hali

    Görülebildiği gibi 3 kuralı birden uyguladık.

    1-KalinCizgi parametresinin Önüne ‘optional’ yazarak parametreyi seçmeli yaptık.

    2-Seçmeli parametreyi zorunlu parametreden sonra yazdık ve virgül ile ayırdık.

    3-Seçmeli parametreye bir değer girilmezse, default değerini ‘=’ işareti ‘False’ olacak şekilde ayarladık.

    Yani burada seçmeki parametre girmezsek, hiç bir sıkıntı olmadan kod çalışmaya devam edecektir. Ancak Boolean veri tipinde(True,False) olan KalinCizgi parametresi default ayarı olan False dışında bir değer alırsa ne olur fonksiyonun altına Bölüm 6 olarak eklediğimiz kodu inceleyerek görelim.

    Fonksiyonlar-Bolum 6

 

    Eger KalinCizgi parametresini True olarak ayarlarsak fonksiyonun altına eklediğimiz IF bloğu çalışacak ve tabloya eklenen son çerçevenin çizgisini kalın yapacaktır. Şimdi ilk önce seçmeli parametrenin nasıl VBA Editor’de göründüğünü sonra da kalın çizgili tablomuzun son halini görelim.

 

Fonksiyonlar_Seçmeli parametrenin

    Her zaman olduğu gibi köşeli parantez içerisinde yer alan parametreler seçmeli parametrelerdir. Ayrıca bize burada dahi girmemiz gereken veri tipini ve default değeri net bir şekilde göstermektedir. 

 

Fonksiyonlar_Phase-6

    Gördüğünüz gibi son örneğe nazaran tablonun kenarlıkları kalın çizgi ile çevrelenmiştir. Bu ve bunun gibi çokca işlemi siz de fonksiyonlarınızda seçmeli parametre olarak kullanabilirsiniz. Örneğin araba hızı hesap eden bir fonksiyon hazırladığınızı varsayalım. Seçmeli parametre olarak kilometre veya mil birimini kullanıcıya sunabilirsiniz. 

    Eğer seçmeli parametreye değer girilmediyse km/h, girildiyse de mil/h biriminin hesaplamalarda kullanılmasını sağlayabilirsiniz. Neredeyse her hesaplama için zorunlu veya seçmeli parametre tanımlayabilirsiniz.  

 

Dünya Çapında Araştırmacılara Ait Çalışmaları Okumak İsterseniz https://www.researchgate.net/profile/Ender_Dagdelen adresini Ziyaret Edebilirsiniz. Ana Sayfaya Dönmek İsterseniz De Aşağıdaki Tuşu Tıklayınız.

Herkese İyi Çalışmalar…

Soru ve Önerileriniz İçin;

[email protected]