If Bloklarının Kullanımı ve Konuya Ait Ornekler
KOŞULLU DURUMLAR-1
IF BLOKLARI
1- If Koşullu Durumlar / Tek Mi? Çift Mi?
Koşullu durumlarda unutmayalım ki koşulu ve sonuçları, istediğimiz gibi belirleyebiliriz. Hücrenin içinde rakam varsa hücrenin rengi siyah olsun, yazı varsa yazı tipi Times New Roman olsun ve yazı boyutu 22 olsun gibi.
Nasıl koşullu durumları kullanacağınızı öğrendikten sonra diğer konularla birleştirebilir ve farklı konuların beraber çalışmasını sağlayarak çok daha efektif kodlar yazabilirsiniz. Çalışma hayatımın bir kısmında birden çok tarımsal saha için ihtiyaç duyulan su miktarıları ile ilgili hesaplar yapmak zorunda kalmıştım. Sonuçları tek bir workbook içerisine topladığımda ise tablolardan oluşmuş yüzlerce sayfalık bir veri elde etmiştim. Sonrasında ise defalarca farklı koşullara(farklı illere, ilçelere, kotlara, havzalara vb) göre bu tabloların özetlerini çıkarmam gerekmişti. Ve ne yazık ki o zaman bu işlemi tek tek elle yapmıştım. Tabi ki sonraları kendim excel de gömülü bazı fonksiyonları kullanarak işlemi hızlandırdım yine de geçen süre, makro ile bu işi tamamlama süremin yanına bile yaklaşamaz. Oysa makro da yapmam gereken şey çok belliydi. Koşullu durumlardan sonra işleyeceğim döngü konuları ile if-else konularını birleştirmekle bu işlemi tek tuşla halledebilirdim. Algoritmanın akışı muhtemelen şu şekilde olurdu;
Elazığ sulamaları diyelim;
-Sıradan ilk worksheet aç
-İlgili Range’e yani ilin yazıldığı hücreye git
-Hücrenin içindeki değer “Elazığ” mı?
-Eğer Elazığ ise tablonun en alt sağ köşesindeki değeri kopyala
*Ozet worksheet aç
*Range(“___”) yapıştır. Eğer hücre doluysa bir altına yapıştır
*Kopyalama yaptığın sayfadan sonraki sayfaya git
_Eğer hücrenin içindeki değer Elezığ değilse
*Bir sonraki sayfaya geç
-Eğer worksheet son worksheetse programı durdur.(Tabi algoritmanın eksik gediği olabilir çalıştırmadığımız için bilemiyorum.)
Bu şekilde yazabileceğim bir kod ile sadece Elazığ ve gidilecek hücreyi değiştirerek istediğim her türlü veriyi istediğim özet sayfasının istediğim satır ve hücresine saniyeler içerisinde hazırlayabilirdim.
Burada gördüğünüz gibi bir koşul belirledik. Bu koşul; il hücresindeki değerin Elazığ olup olmamasıydı. Eğer koşul sağlanırsa yapılan işlem farklı koşul sağlanmaz ise de yapılmasını istediğimiz işlem farklı bir şekilde gerçekleşmektedir.
Şimdilik biz bu koşul olayını ilk örneğimiz için iyice basite indirgeyip, sadece hücredeki rakamların tek mi çift mi olduğuna bakan bir kod yazalım. Ancak daha öncesinde If bloğunu inceleyelim.
En basit if bloğunu size tanıtmaya çalıştığım bu görselde sadece if bloğunu açan ‘If’ ve kapatan ‘End If’ var.
If bloğunun nasıl çalıştığı ile ilgili çok az bir detay vermek istiyorum. Burada bizim verdiğimiz koşula karşılık if bloğu True veya False olarak geri dönüş yapar. Yani bizim örneğimizde eğer ActiveCell.Value 10 ise, If bloğu bu koşul için TRUE değerini döndürür. Bunun anlamı ise alt satırı yazdığımız ‘Gerçekleşmesini istediğimiz durumun’ gerçekleşmesine izin verir. Yani bir nevi anahtar görevi görür. Sanki bir gece klübüne girerken güvenliğin yaşınızı sorması gibi.
Güvenlik: “18 yaşından büyük müsünüz? If ActiveCell.Value > 18 Then
Girebilirsiniz. ActiveCell.OffSet(0,1).Value=”Girebilirsiniz”
Güvenlik size kapıyı gösterir. End if
Yani güvenlik size 18 yaşından büyük müsünüz diye sorduktan sonra siz ‘hı hı’ derseniz, onay alınmış oluyor ve güvenlik sizin 18 yaşından büyük kişilerin yapabildiği şeyi yapmanıza izin veriyor, yani klübe girebilirsiniz. 18 yaşınızda değilseniz o zaman sizin için parti bitmiş demektir. Yani End if = End Party
Şimdi başka bir örneği inceleyelim
Bir sayının tek mi çift mi olduğunu öğrenmek istersek yaptığımız şey çok basittir. Eğer elimizdeki sayı 2 ile kalansız olarak bölünebiliyorsa o sayı çifttir deriz. VBA editorde de aynı işlemi uygulayacağız. Elimizdeki sayının da çift olup olmadığını “Mod” kullanarak bulacağız. İlk önce yapmak istediğimiz şeyin algoritmasını yazalım.
-Bir hücre seç
*Eğer hücre boşsa, subroutine’den çıkış yap.
-Eğer hücre içindeki sayının Mod 2 karşılığı 0 ise;
-O sayının yanına Çift Yazdır ve bir alt hücreyi seç
-Eğer Mod 2 0 değilse, hücrenin bir yan hücresine Tek yazdır ve bir alt hücreyi seç.
İşte olay bu kadar basit. Şimdi örneğimize ait kodu inceleyelim. 2 adet Koşul oluşturduk bile.
Bu subroutine içinde 2 adet koşul ve sonuç olarak da iç içe geçmiş iki adet koşullu durum bloğu yer almaktadır. İlk if bloğumuzda seçilen hücrenin dolu mu boş mu olduğuna sınıyoruz. Burada uyguladığımız düzen ise ilk önce ‘ If’ ile koşul oluşturuyoruz. Sonra Else ile koşul yerine gelmezse ne yapılması gerektiğini belirtiyor ve End If ile de bloğu sonlandırıyoruz.
Ilk If bloğunda, yani en basit if bloğu olarak nitelendirdiğimiz blokta eğer koşul yerine gelmezse kod çalışmayı bırakıyordu. Yani koşul yerine gelmezse herhangi bir alternatif yoktu. Burada ise Else sayesinde bir alternatif senaryo üretiyoruz. Yani koşul gerçekleşmediği zaman veya tam tersi düşünecek olursak, gerçekleşmesini istediğimizi durumun tersi gerçekleşirse yine kodun bir davranış / hareket gerçekleştirmesini sağlayabiliyoruz. Aşağıda, iç içe geçmiş olan If bloklarını görüyoruz.
If ActiveCell = ” ” Then —————————–> Burada koşulu oluşturuyoruz. Yani eğer ActiveCell= Boşsa Exit Sub. Yani koşul hücrenin boş olması
Exit Sub
Else—————————————————>Burada ise hücrenin boş olmadığı durumda kodun ne yapması gerektiğini alt satırdaki kod ile belirtiyoruz.
Diğer if bloğu çalışır
End if
Önceden de söylediğim gibi bir koşulun True veya False olmasına göre If bloğu harekete geçer. Kısaca buradaki örnekte If koşulu, hücrenin boş olmasıydı. Yani EĞER HÜCRE BOŞSA, SUBROUTINE KAPAT, DOLUYSA DA DİĞER IF BLOĞUNU ÇALIŞTIR.Bunu tam tersine de çevirebiliriz. Yani; EĞER HÜCRE BOŞ DEĞİLSE IF BLOĞUNU ÇALIŞTIR, BOŞSA SUBROUTINE KAPAT.
If ActiveCell <> ” ” Then —————————–> Burada koşulu oluşturuyoruz. Yani eğer ActiveCell<> Boş Değilse Diğer Blok Çalışsın Yani koşul hücrenin boş olmaması
Diğer If Bloğu Çalışsın
Else—————————————————>Burada ise hücrenin boş olduğu durumda subroutine’in kapatılması
Exit Sub
End if
Şimdi ilk önce seçili hücrenin dolu olduğunu kontrol eden, doluysa da içindeki sayının tek mi çift mi olduğunu yan hücreye yazdıran subroutine i inceleyelim. Hatta yukarıda bahsettiğimiz gibi ilk önce boş olma koşulu, sonra da dolu olma koşuluna göre iki farklı şekilde subroutini inceleyelim.
Soldaki kod da koşulumuzu: Eğer hücre boşsa subroutine kapat, boş değilse Else altındaki kodu çalıştır.
Sağdaki kod da koşulumuz: Eğer hücre boş değilse hemen altta yer alan if bloğunu çalıştır, boşsa subroutinei kapat şeklindedir.
Her iki kodu da çalıştırdığımızda aynı sonuçları verir.
Her iki kodu da sol tarafta gördüğünüz sütun üzerinde denedik ve her ikisi de sağdaki sonucu verdi. Burada siz de aynı kodu denerken ilk hücre olan 1’i seçmeyi unutmayın. Yoksa hücre boş olduğu için kod hiç çalışmayacaktır. Yazılan her Tek ve Çift ibaresinden sonra kodu tekrar tekrar çalıştırın, bütün sütunun değerlendirileceğini göreceksiniz.
Peki eğer birden farklı koşul eklemek istersek ne yapmamız gerekiyor?
Normalde boş hücrenin değeri 0 olduğu için, eğer boş hücre için bu tek çift yazdırma kodunu çalıştırsaydık, boş hücrenin yanında çift yazardı. Ama eğer hücrenin içinde 2 ile bölünemeyen string tipi bir değer olsaydı o zaman da kodumuz hata verirdi.
Yan tarafta yazdığımız kodun değeri 2 ile bölünemeyen bir hücreye geldiği zaman çalıştığında verdiği hatayı görüyoruz. Bu hatanın tipi Run-Time hata tipidir. Sebebi ise ilk başta herhangi bir hata gözükmemesine karşın kodun çalıştırıldıktan sonra hata vermesidir. Hata tipinin altında ise daha detaylı olarak Type mismatch yazmaktadır. Bu ibare ise veri tiplerinin uymadığı anlamına gelmektedir.
Kod, bizim hazırladığımız örnek üzerinde pürüzsüz bir şekilde çalışacaktır ancak arada 2 ile bölünemeyen bir değer yer alırsa kod hata verecektir. Kodun, bölünemeyen bir değere denk geldiği zaman hata mesajı vermemesi için koşullarımıza, hücrenin dolu olmasının yanısıra değerinin de bir sayı olması gerektiği koşulunu eklemeliyiz.
Bu pozisyonda If bloğunu oluşturken ‘AND’ ve ‘OR’ adında birden fazla koşul koymamızı sağlayan yardımcılarımız vardır.
Koşullu durumlarla ilgili diğer derse alttaki tuştan ulaşabilirsiniz.
2- If Koşullu Durumlarda 'And' ve 'Or' Kullanımı
‘And’
Birden fazla koşul koymanın da farklı 2 şekli var aslında. Bunlardan ilki bütün koşulların sağlanmasıyken, diğer yöntem ise koyduğumuz koşullardan sadece birinin sağlanmasıdır.
And ile biz ilk koşul koyma şeklini gerçekleştiriyoruz. Yani bir nevi buradaki ‘And’ i Türkçe’mizdeki ‘Hem’ gibi düşünün. Çok basit bir örnek verelim.
“Eğer hem arabası hem de evi varsa evlenirim, yoksa evlenmem.”
Burada eve ve arabaya sahip olmak üzere 2 adet şart koşulmuş ve ikisi de olmazsa evlenmeyeceğini söyleyen bir arkadaşımız var. İşte burayı eğer IF bloğu ile yazmak istersek kullanacağımız bağlaç ‘And’ olacaktır.
İki koşul var ve her ikisi de sağlanmak zorundaysa kullanılacak bağlaç ‘And’.
Şimdi ‘And’ bağlacını kodumuz içerisinde nasıl kullanacağız onu görelim.
Not:IsNumeric fonksiyonu bir değerin sayı olup olmadığını belirler.
IsNumeric(Range(“A12”).Value) şeklinde kullanılır. Eğer Range içerisindeki değer sayı ise True, sayı değilse de False olarak dönüş yapar.
Yukarıdaki yenilediğimiz kod içersinde artık hücrenin;
-hem boş olmadığı,
– hem de doluysa dahi içerisinde bulunan değerin sayı olduğu
iki farklı koşulu öne sürmüş oluyoruz. Her iki koşulun da yerine getirilmesi durumunda kod çalışmaya devam edecektir. Yani eğer hücrelerden bir tanesinde sayı olmayan bir değer bulunuyorsa, kod hata vermeden çalışmayı durduracaktır.
‘Or’
Yine birden fazla koşul var ancak bunlardan sadece bir tanesi yeterli oluyorsa o zaman kullanacağımız bağlaç ise ‘Or’ olacaktır.
‘Or’ bağlacını da ya – ya da olarak düşünebiliriz.
“Eğer evi ya da parası varsa evlenirim, yoksa evlenmem.” derken 2 adet koşul var ancak bu koşllardan sadece bir tanesinin olumlu olması, bizim için yeterli oluyor.
Şimdi ‘Or’ bağlacını kodumuz içerisinde nasıl kullanacağız onu görelim. Daha öncesinde ise ‘Len’ fonksiyonunu tanıyalım.
NOT: Len fonksiyonu; Len(Range(“A4”)) gibi bir kullanımı vardır ve parantez içerisinde yer alan her ne ise, karakter olarak uzunluğunu verir. Aşağıdaki örnekte kullanımını çok daha iyi bir şekilde görebilirsiniz.
Şimdi ise kendi örneğimize geçelim.
Bu örnekte aynı ‘And’ gibi 2 adet şart koşuyoruz. İlk şartımız seçilen hücrenin boş olmaması, ikinci şart ise hücrenin içinde yer alan verinin uzunluğunun 1 e eşit veya 1 den fazla olması. Yani hücrenin boş olmaması ifadesinin farklı bir söyleniş şekli.
Burada bu iki koşuldan birisinin sağlanması ile If bloğu True dönüş yapacak ve hemen altındaki ikinci If bloğu çalışarak, hücrelerdeki sayıları tek ve çift olarak nitelendirecektir.
Şimdiye kadar gördüğümüz örnekte koşullar sağlandığında sadece hücrenin yanına tek veya çift yazdırdık. Şimdi biraz renkli bir örnek verelim. Yine aynı sayıların bulunduğu sütunda, aktif hücre tek ise sol tarafta aktif hücrenin içinde yazan rakam kadar hücreyi maviye, aynı şekilde aktif hücrenin içersindeki rakam çiftse de, aktif hücrenin sağ tarafındaki hücreleri, aktif hücrenin içerisinde yazan değer kadar yeşil ile renklendirelim.
Sağda yer alan görselde sadece tek ve çift yazmamıza yarayan kod satırları yorum şekline dönüştürülmüş ve onların yerine de hücreleri boyamaya yarayan kodlar eklenmiştir. İki kod arasındaki temel farklar çok rahat olarak okunabilmektedir. Bu işlemi gerçekleştirirken de ilk yazdığımız iç içe If bloğunun iskeletinin de hiç değişmedeği çok net bir şekilde görülmektedir.
Aşağıda ise kodun çalıştırıldığı zaman ortaya çıkan görseli görebilirsiniz.
3- ElseIf
Peki eğer aynı If bloğu içerisinde farklı farklı koşullara göre farklı sınıflandırmalar ve uygulamalar yapmak istersek?
İşte bu noktada kullanacağımız bağlaçın adı ‘ElseIf’ tir.
Şimdi örnek üzerinde kullanımına bakalım. Örnek olarak her yerde kullanılan ve bence de konuyu anlayabilmek açısından çok basit ve etkili olduğunu düşündüğüm not verme sistemini ele alalım.
Bir öğretmen olduğumuzu varsayalım. Not sistemine öğrencilerin vize ve final sonuçlarını giriyoruz ve sistem otomatik olarak öğrencilerin geçip geçmediğini sistemde hesaplıyor, harf puanını ve ayrıca da Geçti ve Kaldı olarak puanların en sonuna not düşüyor. Şimdi bu basit hesabı If bloğu kullanarak VBA Editor üzerinde makro kullanarak yapalım.
Yanda yer alan biraz uzunca yazılmış olan kodu inceleyelim. Her not değeri için farklı Harf notu ve öğrencinin durumu olarak da ‘Geçti’, ‘Kaldı’ ve ‘Koşullu’ durum değerlendirmeleri yapılmıştır ve If ten sonra yapılan her yeni koşullandırma ElseIf bloğu eklenerek gerçekleştirilmiştir. Bu sayede elimizdeki birden fazla değeri istediğimiz şekilde sınıflandırabilmekteyiz. Eğer istersek Geçen öğrencilerin, geçti yazılarını yeşil, kaldı yazılarını kırmızı ve koşullu durumunu ise istediğimiz herhangi bir renkte vererek daha dikkat çekici bir tablo oluşturabiliriz.
Tablomuzun Boş Hali
Tablomuzun Macro ile doldurulmuş hali.
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.