Buradaki notlar Access ve Excel’de nasıl fonksiyon oluşturulabileceğini bir örnek yardımıyla anlatmaktadır. Örnek olarak kullanılan fonksiyon, rakkamla yazılan sayıyı metin haline dönüştürür ve sonucu fonksiyonun değeri olarak döndürür.
Örnegin:
A=Sayiyi_Metne_Cevir(342865)
seklinde bir eşitlik yazarsak A’nin değeri “üçyüzkırkikibinsekizyüzaltmışbeş” olur.
Bu fonksiyonu, hem fonksiyon yazımıyla ilgilenenlere bir örnek olsun, hem de birçok yerde kullanabileceğimiz pratik bir çözüm olsun diye veriyorum. Bu fonksiyonu Excel’de ve Access’de kullanmamız mümkündür. Burada yazılanlar daha önce Excel ve Access kullananların rahat uygulayabileceği düzeydedir. Eğer bu programları fazla bilmiyorsanız bile talimatları takip ederseniz yapabilirsiniz.
FONKSIYON HAKKINDA BİLGİ
Bu fonksiyon, VBA (Visual Basic for Applications) adı verilen Visual Basic’le tamamen uyumlu bir programlama dili kullanılarak yazılmıştır. Şu an 15 haneli sayıları sorunsuz olarak metin haline dönüştürebilmektedir. Algoritma olarak sonsuz büyüklükte sayıları metne çevirmesi mümkündür. Bunun için döngü içindeki select case bölümüne yeni satırlar eklemelisiniz.
Örneğin:
Case 7: S_Metin = UcHane(S_Rakkam Mod 1000) & “binkatrilyon” & S_Metin
gibi.
Fonksiyonun şu an 15 haneyle sınırlı olmasının sebebi Access ve Excel’in 15 haneden büyük sayıları yuvarlamadan kaydedememesidir. Access ve Excel bu meseleyi hallederse fonksiyonu daha büyük sayılar için de kullanabilirsiniz.
Fonksiyon icinde mod komutu kullanılmaktadır. Mod komutu sadece long tipindeki degiskenlerle (2 milyardan küçük tam sayılarla) çalıştığı için sayımız, 9 haneli sayılara bölünerek işleme sokulmaktadır.
Fonksiyon iç hesaplamalarında kullanmak için UcHane adında ikinci bir fonksiyon da kullanmaktadır. Bu fonksiyon kendisine verilen üç haneli sayıyı metne çevirir. Yani burada aslında iki tane fonksiyon vardır.
FONKSIYONUN EXCEL’DE KULLANIMI
a) Excel’i açın.
b) Menüden Tools -> Makro -> Visual Basic Editor seçeneğini seçin. Visual Basic Editor sayfası açılacaktır.
c) Boş bir modul sayfası eklemek için menuden Insert -> Modul seçeneğini seçin.
d) Açılan yeni modul sayfasının ilk satırında büyük ihtimalle Option Explicit ifadesi yazıyor olacaktır. Bu ifadenin altına aşağıda verilen fonksiyonları yazın.
e) Menuden File -> Save seçilerek veya üzerinde disket resmi olan save (kaydet) düğmesine basarak şu ana kadar yaptıklarınızı kaydediniz. Visual Basic Editor penceresini kapatınız.
f) Excel sheet’ine (sayfasına) dönelim ve bir örnek yapalım. A1 kutusuna 7436326 yazınız. A2 kutusuna da =Sayiyi_Metne_Cevir(A1) yazınız. A2 kutusunda yedimilyondörtyuzotuzaltibinüçyüzyirmialti yazdığını göreceksiniz.
g) Bu fonksiyonu şu şekilde de kullanabilirsiniz. Boş bir kutu (Cell) seçiliyken menuden Insert -> Function seçeneğini seçiniz. Açılan pencerenin Function Category bölümünden User Defined’ı seçiniz. Function Name bölümünde bizim yazdığımız fonksiyonlar görünecektir. Sayiyi_Metne_Cevir’in üstüne çift tıklayınız veya seçip OK düğmesine tıklayınız. Açılan pencerede Sayi bölümüne A1 yazınız veya mouse’la, Sayi bilgisini alacağınız kutuya tıklayınız. OK düğmesine tıklayınız.
FONKSİYONUN ACCESS’DE KULLANIMI
a) Boş bir Access dosyası açınız veya bu fonksiyonu kullanmayı düşündüğünüz Access dosyasını (mdb dosyasını) açınız.
b) Modul bölümüne geçiniz ve New (yeni) tuşuna basınız. Veya menuden Insert -> Module seçeneğini seçiniz. Yeni bir modul sayfası açılacaktır.
c) Yeni modul sayfasında büyük ihtimalle
Option Compare Database
Option Explicit
ifadelerini göreceksiniz. Bunların altına aşağıdaki fonksiyonları yazınız.
d) Menuden File -> Save (kaydet) seçeneğini seçerek veya üzerinde disket resmi olan save (kaydet) ikonuna basarak yazdığınız modulu kaydediniz. Fonksiyonumuz artık kullanıma hazırdır. Modul penceresini kapatabilirsiniz.
e) Form içinde bunu şu şekilde kullanabiliriz. Yeni bir form oluşturalım. Bu forma iki tane text box (metin kutusu) koyalım. Birinci metin kutusunun üzerine çift tıklayarak property (özellikler) penceresini açalım. Bu pencerenin other (diğer) sayfasındaki Name (ad) bölümüne SayiRakkamla yazarak bu kutunun ismini SayiRakkamla yapmış olalım.
İkinci kutuya çift tıklayarak bu kutunun property (özellikler) penceresini açalım. Bu pencerenin Data (veri) sayfasındaki Control Source (veri kaynağı) bölümüne =Sayiyi_Metne_Cevir(SayiRakkamla) yazalım. Form çalısınca birinci kutuya yazdığımız sayı metine dönüştürülecek ve sonuç ikinci kutuda görünecektir.
Aynı mantıkla bu fonksiyonu raporlarda, diğer modullerde, sorgularda kullanabilirsiniz.
FONKSİYONLARIN METNI
Burada gördüğünüz kodları yukarıda belirtilen bölümlere yazınız. Bu kodlar Access 2000 ve Excel 2000’de denenmiştir, düzgün çalışmaktadır.
Public Function Sayiyi_Metne_Cevir(Sayi As Double) As String
On Error GoTo Hata_Olustu_Satiri
‘Bu fonksiyon rakkam kullanilarak yazilan sayiyi metne cevirir.
‘Sonuc Sayiyi_Metne_Cevir fonksiyonunun degeri olarak geri doner.
‘Bu fonksiyon kesirli sayilari, yuvarladiktan sonra isleme sokar.
>Dim S_Metin As String, Isaret As String
Dim S_Rakkam As Double, M_Rakkam As Double
Dim Sayac As Byte
‘Fonksiyon tam sayilar icin calistigindan
‘Sayi yuvarlanarak tam sayiya cevriliyor
Sayi = Round(Sayi)
Select Case Sayi
Case 0:
‘Sayi sifir. Fonksiyon degerini sifir dondur, fonksiyondan cik
Sayiyi_Metne_Cevir = “sıfır”
GoTo Cikis_Satiri
Case Is < 0: ‘Sayi negatif. Isareti degerini eksi yap. Sayiyi pozitife cevir, isleme devam et Isaret = “eksi” Sayi = -1 * Sayi Case Is > 0:
‘Sayi pozitif. Isleme devam et
Isaret = “”
End Select
‘Islemlerde mod fonksiyonu kullanilacaginda overflow u engellemek icin
‘Sayi 9 haneli sayilara bolunerek isleme sokuluyor
S_Rakkam = Sayi – 1000000000 * Round(0.000000001 * Sayi, 0)
If S_Rakkam < 0 Then
S_Rakkam = S_Rakkam + 1000000000
End If
M_Rakkam = S_Rakkam
‘Donguye baslamadan once Sayac degerini 1’e esitle
‘Sayac, sagdan itibaren kacinci 3 hanenin isleme girdigini gosterir.
Sayac = 1
Do While Sayi > 0
If (S_Rakkam Mod 1000) > 0 Then
Select Case Sayac
Case 1: S_Metin = UcHane(S_Rakkam Mod 1000)
Case 2:
‘Binler bolumunde ozel bir durum var. Bu uc hane 001 seklinde olursa
‘birbin ifadesi kullanilmadigi icin bu durumda sadece bin yazdiracagiz
If (S_Rakkam Mod 1000) = 1 Then
S_Metin = “bin” & S_Metin
Else
S_Metin = UcHane(S_Rakkam Mod 1000) & “bin” & S_Metin
End If
Case 3: S_Metin = UcHane(S_Rakkam Mod 1000) & “milyon” & S_Metin
Case 4: S_Metin = UcHane(S_Rakkam Mod 1000) & “milyar” & S_Metin
Case 5: S_Metin = UcHane(S_Rakkam Mod 1000) & “trilyon” & S_Metin
Case 6: S_Metin = UcHane(S_Rakkam Mod 1000) & “katrilyon” & S_Metin
‘Bu bolumu ayni mantikla devam ettitmek mumkun ama Access
’15 haneden buyuk sayilarda yuvarlama yapacagi icin sonuc dogru olmaz
‘Bu bolum algoritma olarak dogrudur.
Case Else
End Select
End If
'Isi biten sagdaki uc hane siliniyor
S_Rakkam = (S_Rakkam - (S_Rakkam Mod 1000)) / 1000
'Eger sag taraftaki dokuz hanenin islemi bittiyse
'sonraki dokuz hane S_Rakkam degerine esitleniyor
If Sayac Mod 3 = 0 Then
Sayi = (Sayi - M_Rakkam) / 1000000000
S_Rakkam = Sayi - 1000000000 * Round(0.000000001 * Sayi, 0)
If S_Rakkam < 0 Then
S_Rakkam = S_Rakkam + 1000000000
End If
M_Rakkam = S_Rakkam
End If
Sayac = Sayac + 1
Loop
Sayiyi_Metne_Cevir = Isaret & S_Metin
Cikis_Satiri:
Exit Function
Hata_Olustu_Satiri:
MsgBox Error$
Resume Cikis_Satiri
End Function
Public Function UcHane(UcHaneSayi As Integer) As String
On Error GoTo Hata_Olustu_Satiri
‘Bu fonksiyon rakkam kullanilarak yazilan 3 haneli sayiyi
‘metne cevirir. Sonuc UcHane fonksiyonunun degeri
‘olarak geri doner
Dim UcHaneMetin As String
Select Case UcHaneSayi Mod 10
Case 1: UcHaneMetin = “bir”
Case 2: UcHaneMetin = “iki”
Case 3: UcHaneMetin = “üç”
Case 4: UcHaneMetin = “dört”
Case 5: UcHaneMetin = “beş”
Case 6: UcHaneMetin = “altı”
Case 7: UcHaneMetin = “yedi”
Case 8: UcHaneMetin = “sekiz”
Case 9: UcHaneMetin = “dokuz”
Case Else
End Select
‘Sagdaki rakkam atiliyor. Sayi iki haneye dusuyor.
UcHaneSayi = (UcHaneSayi – (UcHaneSayi Mod 10)) / 10
Select Case UcHaneSayi Mod 10
Case 1: UcHaneMetin = “on” & UcHaneMetin
Case 2: UcHaneMetin = “yirmi” & UcHaneMetin
Case 3: UcHaneMetin = “otuz” & UcHaneMetin
Case 4: UcHaneMetin = “kırk” & UcHaneMetin
Case 5: UcHaneMetin = “elli” & UcHaneMetin
Case 6: UcHaneMetin = “altmış” & UcHaneMetin
Case 7: UcHaneMetin = “yetmiş” & UcHaneMetin
Case 8: UcHaneMetin = “seksen” & UcHaneMetin
Case 9: UcHaneMetin = “doksan” & UcHaneMetin
Case Else
End Select
‘Sagdaki rakkam atiliyor. Sayi bir haneye dusuyor.
UcHaneSayi = (UcHaneSayi – (UcHaneSayi Mod 10)) / 10
Select Case UcHaneSayi
Case 1: UcHaneMetin = “yüz” & UcHaneMetin
Case 2: UcHaneMetin = “ikiyüz” & UcHaneMetin
Case 3: UcHaneMetin = “üçyüz” & UcHaneMetin
Case 4: UcHaneMetin = “dörtyüz” & UcHaneMetin
Case 5: UcHaneMetin = “besyüz” & UcHaneMetin
Case 6: UcHaneMetin = “altıyüz” & UcHaneMetin
Case 7: UcHaneMetin = “yediyüz” & UcHaneMetin
Case 8: UcHaneMetin = “sekizyüz” & UcHaneMetin
Case 9: UcHaneMetin = “dokuzyüz” & UcHaneMetin
Case Else
End Select
UcHane = UcHaneMetin
Cikis_Satiri:
Exit Function
Hata_Olustu_Satiri:
MsgBox Error$
Resume Cikis_Satiri
End Function
Bir yanıt bırakın
Yorum yapabilmek için giriş yapmalısınız.