Excel'de sayıyı yazıya dönüştürme
Neden Excel'de kendi içinde sayıyı okunuşuna dönüştürme fonksiyonu yok bilmiyorum, bu yüzden faydalı olması amacıyla kendimkini yazdım.
Aslında çeşitli forumlarda bu şekilde kendi formüllerini oluşturup paylaşanlar hep var. Fakat denk geldiğim çözümler, genel olarak yalın fonksiyonlarla yazılmaktan ziyade Visual Basic makroları ile yazılmıştı. Bu da benim aradığım bir şey değil, çünkü makrolar yalnızca Excel'in masaüstü sürümlerinde kullanılabiliyor, ve üstelik kod çalıştırmaya olanak sağladığından dolayı Office sürümlerinde varsayılan olarak makrolar kapalı şekilde gelebiliyor, ve/ya makro içeren bir dosya açtığınızda çeşitli uyarılar çıkartabiliyor.
Bu yüzden bütün işlemleri yine yalnızca Excel içinde yapmak taşınabilirlik açısından çok daha iyi olacak.
Mantık basit. Sayıları her binlik basamakta bir ayırıp, elde oluşan üçlü rakam grupları için 0'dan 9'a kadar sıralanmış yazı karşılığına dönüştürmek gerekiyor.
001 654 243 → bir milyon altı yüz elli dört bin iki yüz kırk üç
─┬─ ─┬─ ─┬─
 │   │   │
 │   │   │
 │   │   └─ → iki yüz kırk üç
 │   │
 │   └───── → altı yüz elli dört = bin
 │
 └───────── → bir                = milyon
Aynı işlemi her binlik basamak için tekrar etmemiz gerektiğinden, 1000'in kuvvetini artırarak istediğimiz kadar da uzatabiliriz.
Örneğin A1 hücresinde 2147654243 yazıyorsa, aşağıdaki formülle 1000 sayısının 2. kuvvetindeki kısmı (1000 ^ 2), yani sadece "milyon"lar basamaklarını alabiliriz, bu da 147 eder:
=A1 / 1000; 2; 1000
Daha sonradan üç basamağa düşürdüğümüz bu sayıyı, içinde kaç yüzlük, kaç onluk ve kaç birlik olduğu şeklinde ayırabiliriz.
=A2 / 100 & " yüzlük " & A2 / 10; 10 & " onluk " & A2; 10 & " birlik "
Fakat burada hesaba katmamız gereken özel durumlar da var.
Örneğin, 1000000 sayısını hep "bir milyon" olarak okusak da 1000 sayısına hiçbir zaman "bir bin" demeyiz, sadece "bin" deriz. Bu 100 için de geçerli, hiçbir zaman "bir yüz" olarak okunmuyor. O yüzden bu basamaklar için ayrı işlem yapılması gerekiyor.
Ayrıca aynı hesaplamayı her binlik basamakta bir tekrarlamamız gerektiğinden, aynı basamak bölme işlemine de birden fazla kez ihtiyacımız olacak. Excel'in yeni sürümlerindeki LAMBDA işlevi kullanarak formülün içinde yeniden kullanılabilir özel bir işlev oluşturarak bütün formülü çok daha kısa tutabiliyoruz. Ancak çoğu yerde hala Excel'in eski sürümleri kullanıldığı için aynı formülün LAMBDA içermeyen versiyonuna da sahip olmamız iyi olur.
Tüm bu durumlar ele alındığında, aşağıdaki formül yeterli olacaktır:
Bu formül yalnızca Türkçe dilinde ve bölgesel ayarı Türkiye olarak ayarlanan Excel'de çalışır. Excel'deki işlev adları ve parametre ayırıcıları bölgeye göre farklılık gösterir. Örneğin İngilizce dilindeyseniz
=SUM(A1, 0.45, A2)yazmanız gerekiyorken, Türkçe'de ise yalnızca=TOPLA(A1; 0,45; A2)çalışır. Başka bir dilde yazılmış bir fonksiyonu kullanmanız için önce o dildeki Excel'den dosyaya kaydedilmesi gerekiyor. Bunu yapmak için Office'in web sürümünü de kullanabilirsiniz.
=
    _CELL; A1; // Hücrenin referansını buradan değiştirin.
    _SPACE; " "; // Basamakların arasına eklenecek boşluk. Örneğin "beş yüz kırk altı" yerine "beşyüzkırkaltı" yazmasını istiyorsanız, bu boşluğu buradan silebilirsiniz.
    _PREFIX; ""; // Oluşan metnin en başına eklenecek bir ön ek. Örneğin "yalnız " olarak ayarlanırsa sonuç "yalnız beş yüz kırk altı" olur.
    _MONEY; DOĞRU; // Sayıyı "lira" ve "kuruş" şeklinde para biçimine dökmek istiyorsanız bunu DOĞRU yapın (154,20 -> "yüz elli dört lira yirmi kuruş" olur), eğer normal bir sayı olarak yalnızca ondalik kesime gelindiğinde "virgül" yazmasını istiyorsanız YANLIŞ yapın. (154,20 -> "yüz elli dört virgül yirmi")
    _DIGITS; x; x; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz";
    _TENS; x; x; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
    _FROM_HUNDRED; 
        x; 
            hundreds; x / 100;
            tens; x / 10; 10;
            units; x; 10;
            
                _SPACE; DOĞRU;
                hundreds = 0; ""; hundreds = 1; ""; hundreds & _SPACE & "yüz";
                tens = 0; ""; tens;
                units = 0; ""; units
            
        
    ;
    _FROM_THOUSAND; 
        power; name; 
            count; _CELL / 1000; power; 1000;
            count = 0; ""; power = 1; count = 1; name; count & name = ""; ""; _SPACE & name
        
    ;
    _FRACTIONS; 
        fractions; _CELL; 1 * 100; 0;
        fractions = 0; ""; " " & _MONEY; ""; "virgül" & " " & fractions & _MONEY; " " & "kuruş"; ""
    ;
    _PREFIX & _CELL < 0; "eksi" & " "; "" & 
        _SPACE; DOĞRU;
        4; "trilyon"; // Bu formül 1000'in 4. kuvvetine kadar olan sayıları, yani trilyonları destekliyor. Bunun üzerine de çıkmanız gerekiyorsa buradaki gibi _FROM_THOUSAND çağrısına ekleme yapıp öndeki sayıyı 1 artırabilirsiniz.
        3; "milyar";
        2; "milyon";
        1; "bin";
        0; ""
     & _MONEY; " " & "lira"; "" & _FRACTIONS
=
    _CELL; A1; // Hücrenin referansını buradan değiştirin.
    _SPACE; " "; // Basamakların arasına eklenecek boşluk. Örneğin "beş yüz kırk altı" yerine "beşyüzkırkaltı" yazmasını istiyorsanız, bu boşluğu buradan silebilirsiniz.
    _PREFIX; ""; // Oluşan metnin en başına eklenecek yazı. Örneğin "yalnız " olarak ayarlanırsa sonuç "yalnız beş yüz kırk altı" olur.
    _MONEY; DOĞRU; // Sayıyı "lira" ve "kuruş" şeklinde para biçimine dökmek istiyorsanız bunu DOĞRU yapın (154,20 -> "yüz elli dört lira yirmi kuruş" olur), eğer normal bir sayı olarak yalnızca ondalik kesime gelindiğinde "virgül" yazmasını istiyorsanız YANLIŞ yapın. (154,20 -> "yüz elli dört virgül yirmi")
    _PREFIX & _CELL < 0; "eksi" & " "; "" & 
        _SPACE; DOĞRU;
        
            count; _CELL / 1000; 4; 1000;
            
                count = 0; ""; 
                
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                 & _SPACE & "trilyon"
            
        ;
            count; _CELL / 1000; 3; 1000;
            
                count = 0; ""; 
                
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                 & _SPACE & "milyar"
            
        ;
            count; _CELL / 1000; 2; 1000;
            
                count = 0; ""; 
                
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                 & _SPACE & "milyon"
            
        ;
            count; _CELL / 1000; 1; 1000;
            
                count = 0; ""; count = 1; "bin";
                
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                 & _SPACE & "bin"
            
        ;
            count; _CELL / 1000; 0; 1000;
            
                count = 0; ""; 
                
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                
            
         & _MONEY; " " & "lira"; "" & 
            count; _CELL; 1 * 100; 0;
            
                count = 0; ""; 
                " " & _MONEY; ""; "virgül" & " " & 
                    hundreds; count / 100;
                    tens; count / 10; 10;
                    units; count; 10;
                    
                        _SPACE; DOĞRU;
                        hundreds = 0; ""; hundreds = 1; ""; hundreds; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz" & _SPACE & "yüz";
                        tens = 0; ""; tens; "on"; "yirmi"; "otuz"; "kırk"; "elli"; "altmış"; "yetmiş"; "seksen"; "doksan";
                        units = 0; ""; units; "bir"; "iki"; "üç"; "dört"; "beş"; "altı"; "yedi"; "sekiz"; "dokuz"
                    
                 & _MONEY; " " & "kuruş"; ""