13.07.2018 tarihinde Formlar-Kontroller sayfası eklenmiştir

25.05.2018 Hosting şirketi dğeiştirmekten kaynaklı bir hata nedeniyle Excelent add-ini indirirken hata alınmaktaydı. Bu hata düzeltilmiştir. İki ayrı download alternatifi sunulmuştur. Kurumunuzun BT politikalarının veya şahsi PC’nizdeki güvenlik ayarlarının izin vermesi durumunda yöntemlerden biriyle kurulum yapabilmelisiniz. Bi sorun olursa bana iletebilirseniz sevinirim.

25.04.2018 tarihinde,VBA konularına Formlar-Temeller sayfası eklenmiştir.

VBAMakro Fonksiyonlar 2

Nümerik Fonksiyonlar

Excel VBA'de kullanılmak üzere çok fazla nümerik fonksiyon bulunmamaktadır.

Bununla birlikte Excel'in kendisiyle gelen nümerik fonksiyonların birçoğunu WorksheetFunction fonksiyonu aracılığı ile kullanabiliriz. Bununla ilgili detaylı bilgiye ilgili sayfada değineceğiz.

Şimdi VBA içindeki birkaç faydalı numerik fonksiyona bakalım.

Dönüştürme fonksiyonları

Ön bilgi:Türkiyede biz "," işaretini ondalık ayraç olarak kullanırken ABD ve dolayısıyla bir ABD firmasnın ürünü olan Excel ve VBA "." işaretini ondalık ayraç olarak kullanır. Binlik ayraç olarak ise tersi. Gerçi regional settings(bölgesel ayarlar) ayarlaması yapıldığında Excelin kendisi de(Sadece Excel, VBA değil) ondalık ayraç olarak "," kullanabilmektedir. Ve nitekim Türkiye'deki bilgilsayarların çoğunda bu ayar yapılı haldedir. Ancak VBA "." karakterini her zaman ondalık ayraç için kulanırken, binlik ayraç diye birşey kullanmaz. VBA dünyasında "," karakteri parametre ayracı olarak kullanılır. Dolayısıyla VBA'deki 2.22 ifadesi Türkçe 2,22 algılanırken 2,22 ifadesi ise 2 ve 22 şeklinde iki ayrı parametre olarak algılanır. Bu 2,22 ifadesi tırnak içinde değilse birçok durumda tek parametre alan fonksiyonlarda hataya neden olurken, tırnak içindeyse metinsel bir ifade olarak algılanır.

Val(String): Parametre olarak aldığı stringi rakama çevirir. Dönüş tipi Double'dır.

Val fonksiyonu, dönüştüreceği değer içindeki ilk sayısal olmayan kısıma kadar olan kısmı sayıya çevirir. Ör:123asr45 değerini 123'e çevirir.

Debug.Print Val("00123") '123
Debug.Print Val("123asr45") '123
Debug.Print Val("2,22") '2 döndürür. çünkü virgülü non-numerik algılar ve ilk non-numerik karakterden önceki kısmı döndürür
Debug.Print Val("2.22") '2,22 döndüdür
'Debug.Print Val(2, 22) 'hata verir, sanki iki paramter var gibi alıgılar
Debug.Print Val(2.22) '2 döndürür, noktayı nonnumerik algılar. Burada 2,22 dönmesini beklediyseniz yukarıda yazıanları tekrara okuyun lütfen

Val'in tarihleri nasıl değiştirdiğini de görelim.

Debug.Print Val("21.01.1979") '21,01 döndürür, çünkü ikinci noktayı saysal olmayan karakter olarak algılar

CInt, CDbl v.s(İfade): Bunlar da dönüştürme görevi görürler. C'den sonraki tipe dönüşüm yaparlar. Ör: CInt, içindeki değeri Integer'e dönüştürken, CDbl, Double'a, CLng Long'a. İfade olarak bir string olabileceği gibi daha küçük boyutlu bir numerik değer de olabilir.

Şunu merak etmiş olabilirsiniz. CDbl da Val de double türüne dönüştürüyor. Ne fark var? Neden 2 tane fonksiyon var? Aşağıdaki kodları ve sonuçları ile yukardaki Val'in sonuçlarını incelerseniz farkı görebilirsiniz.

Debug.Print CDbl("00123") '123
'Debug.Print CDbl("123asr45") 'hata alır. numerik olmasını bekler
Debug.Print CDbl("2,22") '2,22 döndürür
Debug.Print CDbl("2.22") '222 döndürür
'Debug.Print CDbl(2, 22) 'hata verir, sanki iki paramter var giib alıgılar
Debug.Print CDbl(2.22) '2,22 döndürür

Biraz karışık gelmiş olabilir. Özeti şu: Val'i sanki Str fonksiyonu ile string hale gelmiş sayısal ifadeleri sayıya çevimek için kullanmanız gerekirken, CDbl'i kullanıcı tarafından girilen bir sayısal metni sayıya çevirmek için kullanın.

Yuvarlama Fonksiyonları

Int(Number) ve Fix(Number): İkisi de küsurlu sayıların küsuratını atar. Fark şu: Int, negatif sayılarda aşağı doğru yuvarlarken, Fix sadece küsurat atar. Ör: 3,85 için ikisi de 3 döndürürken, -3,85 için Int -4, Fix ise -3 döndürür.

Round(Number,Duyarlılık);Excel'in built-in(yerleşik) Round fonksiyonundan farklıdır. Excel fonksiyonunda negatif değer girerek sayı 10'un katları şeklinde de yazılabilirken, VBA'de sadece pozitif rakamlar girilebilmektedir. Round(95.458, 1) bize 95.5 değerini verir. Ondalık olarak virgül yerine nokta karakteri yazıldığına dikkat edin. 

Negatif değer girip 10'un katları şeklinde yuvarlamak ve RoundUp/RoundDown gibi seçenekleri ele almak için WorksheetFunction'dan faydalanabilriz.

Debug.Print Round(95.458, 1) '95,5
Debug.Print worksheetfunction.Round(95.498, -1) '100
Debug.Print worksheetfunction.RoundUp(95.498, 0) '96
Debug.Print worksheetfunction.RoundDown(95.498, 0) '95

Matematsiksel fonksiyonlar

NOT:Trigonometrik fonksiyonlar gibi MIS dünyasında kullanımı az olan veya hiç olmayan fonksiyonlara yer verilmemişir.

Randomize ve Rnd(Number):Rasgele sayı üretmek için kullanılırlar. Rasgele sayı üretimi bilgisayarın sistem saati baz alınarak üretilir. Rnd ile 0-1 arasında rasgele sayı üretilir. Sayı üretildikten sonra, teknik olarak bir sonraki rasgele sayının ne olacağı tahmin edilebilir, bu da sonraki sayının rasgeleliğine şüphe düşürür. Bununla birlikte her Rnd işleminden önce Randomize fonksiyonu tek başına kullanılırsa sistemin baz alacağı değer bir nevi resetlendiği için bir sonraki rasgele sayının tahmini imkansızlaşır ve gerçek bir rasgele sayı üretilmiş olur. Özellikle birden fazla rasgele sayı üretmeniz gerektiği durumlarda Rnd öncesinde Randomize kullanmanız önerilir, diğer durumlarda tek başında Rnd iş görecektir.

Rnd, Excelin RAND fonksiyonu gibi işlemeketdir. Aşağıda örnekte 1 ile 100 arasında bir sayı üretilip x değişkenine atanmaktaır, bu da RANDBETWEEN(1,100) gibi.

Randomize
x=CInt(Rnd*100)

'ancak 10-20 gibi daha üst seviyelerde bir rasgele rakam istenirse
x=WorksheetFunction.RandBetween(10,20)

Abs(number): Mutlak değer üretir. Ör. Abs(-100) 100 değerini verir.

Sayı formatlama

Sayıları formatlamak için iki fonksiyon bulunmakta. Format ve FormatNumber. Bunların ikisi de aslında String modülünün bir fonksiyonudur. Ama konsept olarak sayılarla ilgili olduğu için burada ele almayı uygun buldum. 

Ben bunlardan FormatNumber yerine Format'ı kullanmayı tercih ediyorum. Zaten FormatNumber üzerine de çok fazla online bilgi de bulunmuyor. Format fonksiyonuyla ilgili detay bilgilere ise buradan ulaşabilrisiniz.

Sayılarda formatlama yaparken dikkat edilecek hususlar bellidir. Binlik ayraç, ondalık ayracı, yuvarlamalar ve gerekirse belirli miktarda fazladan 0 gösterimi.

Formatlamada iki temel karakter kullanıyoruz. 0 ve #. Ben bunlardan en çok #'i kullanıyorum. 0'ın farkı şu:Eğer sayının başında belirli miktar 0 olsun istenirse bu kullanılır. Neden böyle birşey gereksin? Mesela BT ekibine bir liste hazırlıyorsunuzdur, listeyi sizden 10 haneli sayılar şeklinde(başta 0 olacak şekilde) isterler. Mesela sizin göndereceğiniz listedeki sayılardan biri 123 ise bunu 0000000123 şeklinde isterler. 0, aynı zamanda küsuralartarda da fazladan 0 gösterebilir. Mesela 4 haneli küsurat olsun isteniyorsa 3,18'in gösterimi 3,1800 şeklinde olur.

Gerek 0 gerek #, eğer gerekenden az miktarda kullanılmışsa otomatikman gereken adede tamamlanır. (Aşağıda hem 0'ın hem #'in ilk örneklerinde görüldüğü gibi). Ondalık ayraçın solunda sadece 1 adet 0/# olmasına rağmen dört rakamın dördü de gösterilmiştir.

Aşağıdaki örneklerle anlattıklarımız pekiştirelim. Başlamadan önce "ön bilgi" bölümünde yazan '.' ve ',' işaretlerinin kullanımına tekrar bakmanızı öneririm.

Sub formatting()
    Debug.Print Format(8315.4, "0.000") '8315,400
    Debug.Print Format(8315.4, "0,000") '8.315
    Debug.Print Format(8315.4, "0.0") '8315,4
    Debug.Print Format(8315.4, "0,0") '8.315
    Debug.Print Format(8315.4, "0000.0") '8315,4
    Debug.Print Format(8315.4, "0000000.0") '0008315,4
     
    Debug.Print vbNewLine
    Debug.Print Format(8315.4, "#.###") '8315,4. 0 formatından farklı olarak takip eden 0lar görünmez.
    Debug.Print Format(8315.4, "#,###") '8.315
    Debug.Print Format(8315.4, "#.#") '8315,4
    Debug.Print Format(8315.4, "#,#") '8.315
    Debug.Print Format(8315.4, "####.#") '8315,4
    Debug.Print Format(8315.4, "#######.#") '8315,4. 0 formatından farklı olarak baştaki fazla 0lar görünmez.
     
    'nokta ve virgül beraber
    Debug.Print vbNewLine
    Debug.Print Format(8315.4, "0,000.00") '8.315,40
    Debug.Print Format(8315.4, "#,###.##") '8.315,4
    Debug.Print Format(8125648315.486, "#,###.##") '8.125.648.315,49
End Sub
	

YORUMLAR