Oto formuła excelowa, która (bez użycia VBA) zamienia liczbę (np. 131517,45) na kwotę słownie (np. sto trzydzieści jeden tysięcy pięćset siedemnaście złotych czterdzieści pięć groszy):
=USUŃ.ZBĘDNE.ODSTĘPY(JEŻELI(ZAOKR.DO.CAŁK(A1)=0;"zero";JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0>1;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"000");1)+0>0;INDEKS({"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"000");1)+0)&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"00");2)+0<20;INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"00");2)+1);INDEKS({"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"0");1)+0+1));"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0>0;INDEKS({"miliardów";"miliard";"miliardy"};(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0=1)+(ORAZ(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"0");1)+0>=2;PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"0");1)+0<=4;LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");1;3)+0;"00");2);1)+0<>1))*2+1);"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0>1;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0>0;INDEKS({"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0)&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+0<20;INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+1);INDEKS({"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"0");1)+0+1));"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0>0;INDEKS({"milionów";"milion";"miliony"};(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0=1)+(ORAZ(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"0");1)+0>=2;PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"0");1)+0<=4;LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2);1)+0<>1))*2+1);"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0>1;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0>0;INDEKS({"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0)&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+0<20;INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+1);INDEKS({"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"0");1)+0+1));"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0>0;INDEKS({"tysięcy";"tysiąc";"tysiące"};(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0=1)+(ORAZ(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"0");1)+0>=2;PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"0");1)+0<=4;LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2);1)+0<>1))*2+1);"")&" "&JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0>0;INDEKS({"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0)&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+0<20;INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+1);INDEKS({"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"0");1)+0+1)))&" "&INDEKS({"złotych";"złoty";"złote"};(ZAOKR.DO.CAŁK(A1)=1)+(ORAZ(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1);"0");1)+0>=2;PRAWY(TEKST(ZAOKR.DO.CAŁK(A1);"0");1)+0<=4;LEWY(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1);"00");2);1)+0<>1))*2+1)&" "&JEŻELI(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0=0;"zero";JEŻELI(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+0<20;INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+1);INDEKS({"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"};LEWY(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2);1)+0-1)&" "&INDEKS({"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"0");1)+0+1)))&" "&INDEKS({"groszy";"grosz";"grosze"};(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0=1)+(ORAZ(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"0");1)+0>=2;PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"0");1)+0<=4;LEWY(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2);1)+0<>1))*2+1))
Działa dla liczb od 0 do 999999999,99. Testowana pod Excelem 2010. Pod Libre Office (dawniej Open Office) nie działa (może by ktoś naprawił?).
Przy okazji robienia tej formuły wymyśliłem ciekawy sposób na pisanie takich nietrywialnych formuł – zamiast pisać ją z palca, napisałem w Perlu program, który ją generuje. Oto ten program:
$liczba = "A1";
# to jest funkcją, żeby w przyszłości móc zmienić na wersję zobfuskowaną
sub jezeli {
my $warunek = shift;
my $tak = shift;
my $nie = shift;
return "JEŻELI($warunek;$tak;$nie)";
}
sub ostatnie_dwie_cyfry {
my $liczba = shift;
return "PRAWY(TEKST($liczba;\"00\");2)";
}
sub ostatnia_cyfra {
my $liczba = shift;
return "PRAWY(TEKST($liczba;\"0\");1)+0";
}
sub przedostatnia_cyfra {
my $liczba = shift;
my $ostatnie_dwie_cyfry = ostatnie_dwie_cyfry($liczba);
return "LEWY($ostatnie_dwie_cyfry;1)+0";
}
sub mnoga {
my $liczba = shift;
my $jeden = shift;
my $trzy = shift;
my $siedem = shift;
my $ostatnia = ostatnia_cyfra($liczba);
my $przedostatnia = przedostatnia_cyfra($liczba);
my $czy_jeden = "$liczba=1";
my $czy_zgody = "ORAZ($ostatnia>=2;$ostatnia<=4;$przedostatnia<>1)";
my $numer_formy = "($czy_jeden)+($czy_zgody)*2+1";
my $formy = "{\"$siedem\";\"$jeden\";\"$trzy\"}";
return "INDEKS($formy;$numer_formy)";
}
sub dwucyfrowa_slownie {
my $liczba = shift;
my $liczebniki_1_19 = '{"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć";"dziesięć";"jedenaście";"dwanaście";"trzynaście";"czternaście";"piętnaście";"szesnaście";"siedemnaście";"osiemnaście";"dziewiętnaście"}';
my $ostatnie_dwie_cyfry = ostatnie_dwie_cyfry($liczba);
my $liczebnik_do_19 = "INDEKS($liczebniki_1_19;$ostatnie_dwie_cyfry+1)";
my $ostatnia = ostatnia_cyfra($liczba);
my $przedostatnia = przedostatnia_cyfra($liczba);
my $liczebniki_20_90 = '{"dwadzieścia";"trzydzieści";"czterdzieści";"pięćdziesiąt";"sześćdziesiąt";"siedemdziesiąt";"osiemdziesiąt";"dziewięćdziesiąt"}';
my $liczebniki_0_9 = '{"";"jeden";"dwa";"trzy";"cztery";"pięć";"sześć";"siedem";"osiem";"dziewięć"}';
my $dziesci = "INDEKS($liczebniki_20_90;$przedostatnia-1)";
my $iles = "INDEKS($liczebniki_0_9;$ostatnia+1)";
my $dziesciiles = "$dziesci\&\" \"\&$iles";
return jezeli("$ostatnie_dwie_cyfry+0<20", $liczebnik_do_19, $dziesciiles);
}
sub dwucyfrowa_lub_0_slownie {
my $liczba = shift;
return jezeli("$liczba=0", '"zero"', dwucyfrowa_slownie($liczba));
}
sub trzycyfrowa_slownie {
my $liczba = shift;
my $liczebnik_do_99 = dwucyfrowa_slownie($liczba);
my $liczebniki_100_900 = '{"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"}';
my $cyfra_setek = "LEWY(TEKST($liczba;\"000\");1)+0";
my $ewentualne_setki = "INDEKS($liczebniki_100_900;$cyfra_setek)";
my $setki = jezeli("$cyfra_setek>0", "$ewentualne_setki&\" \"", '""');
return "$setki&$liczebnik_do_99";
}
sub szesciocyfrowa_slownie {
my $liczba = shift;
my $sformatowana = "TEKST($liczba;\"000000\")";
my $grupa_1 = "PRAWY($sformatowana;3)+0";
my $grupa_2 = "LEWY($sformatowana;3)+0";
my $liczebnik_1 = trzycyfrowa_slownie($grupa_1);
my $ewentualny_liczebnik_2 = trzycyfrowa_slownie($grupa_2);
my $ewentualne_tysiace = mnoga($grupa_2, "tysiąc", "tysiące", "tysięcy");
my $liczebnik_2 = jezeli("$grupa_2>1", $ewentualny_liczebnik_2, '""') . '&" "&' . jezeli("$grupa_2>0", $ewentualne_tysiace, '""');
return "$liczebnik_2\&\" \"\&$liczebnik_1";
}
# rozbudowana wersja funkcji szesciocyfrowa_slownie
# nie korzysta z funkcji szesciocyfrowa_slownie
sub dwunastocyfrowa_slownie {
my $liczba = shift;
my $sformatowana = "TEKST($liczba;\"000000000000\")";
my $grupa_1 = "FRAGMENT.TEKSTU($sformatowana;10;3)+0";
my $grupa_2 = "FRAGMENT.TEKSTU($sformatowana;7;3)+0";
my $grupa_3 = "FRAGMENT.TEKSTU($sformatowana;4;3)+0";
my $grupa_4 = "FRAGMENT.TEKSTU($sformatowana;1;3)+0";
my $liczebnik_1 = trzycyfrowa_slownie($grupa_1);
my $ewentualny_liczebnik_2 = trzycyfrowa_slownie($grupa_2);
my $ewentualny_liczebnik_3 = trzycyfrowa_slownie($grupa_3);
my $ewentualny_liczebnik_4 = trzycyfrowa_slownie($grupa_4);
my $ewentualne_tysiace = mnoga($grupa_2, "tysiąc", "tysiące", "tysięcy");
my $ewentualne_miliony = mnoga($grupa_3, "milion", "miliony", "milionów");
my $ewentualne_miliardy = mnoga($grupa_4, "miliard", "miliardy", "miliardów");
my $liczebnik_2 = jezeli("$grupa_2>1", $ewentualny_liczebnik_2, '""') . '&" "&' . jezeli("$grupa_2>0", $ewentualne_tysiace, '""');
my $liczebnik_3 = jezeli("$grupa_3>1", $ewentualny_liczebnik_3, '""') . '&" "&' . jezeli("$grupa_3>0", $ewentualne_miliony, '""');
my $liczebnik_4 = jezeli("$grupa_4>1", $ewentualny_liczebnik_4, '""') . '&" "&' . jezeli("$grupa_4>0", $ewentualne_miliardy, '""');
return "$liczebnik_4\&\" \"\&$liczebnik_3\&\" \"\&$liczebnik_2\&\" \"\&$liczebnik_1";
}
sub liczba_slownie {
my $liczba = shift;
return jezeli("$liczba=0", '"zero"', dwunastocyfrowa_slownie($liczba));
}
$liczebnik_zl = liczba_slownie("ZAOKR.DO.CAŁK($liczba)");
$zl = mnoga("ZAOKR.DO.CAŁK($liczba)", "złoty", "złote", "złotych");
$grosze = "PRAWY(TEKST(ZAOKR.DO.CAŁK($liczba*100)/100;\"0,00\");2)+0";
$liczebnik_gr = dwucyfrowa_lub_0_slownie($grosze);
$gr = mnoga($grosze, "grosz", "grosze", "groszy");
print "=USUŃ.ZBĘDNE.ODSTĘPY($liczebnik_zl\&\" \"&$zl&\" \"\&$liczebnik_gr\&\" \"\&$gr)";
Obie rzeczy wrzucam też na pastebina: http://pastebin.com/LcdRw5Ee , http://pastebin.com/ZCYZMgDS . Obie rzeczy umieszczam w domenie publicznej.
A wczoraj kursantka poprosiła mnie o analogiczną formułę, tylko że dającą tekst angielski. Oto ona:
=USUŃ.ZBĘDNE.ODSTĘPY(JEŻELI(ZAOKR.DO.CAŁK(A1)=0;"zero";JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0>0;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"0");1)+0+1))&" million";"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0>0;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"0");1)+0+1))&" thousand";"")&" "&JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"0");1)+0+1)))&" "&JEŻELI(JEŻELI(ZAOKR.DO.CAŁK(A1)=0;"zero";JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0>0;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");4;3)+0;"0");1)+0+1))&" million";"")&" "&JEŻELI(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0>0;JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");7;3)+0;"0");1)+0+1))&" thousand";"")&" "&JEŻELI(LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0>0;INDEKS({"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};LEWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"000");1)+0)&" hundred"&" ";"")&JEŻELI(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(FRAGMENT.TEKSTU(TEKST(ZAOKR.DO.CAŁK(A1);"000000000000");10;3)+0;"0");1)+0+1)))>1;" dollars";" dollar")&" "&JEŻELI(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0=0;"zero";JEŻELI(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"0");1)+0+1)))&" "&JEŻELI(JEŻELI(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0=0;"zero";JEŻELI(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+0<20;INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2)+1);INDEKS({"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"};LEWY(PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"00");2);1)+0-1)&" "&INDEKS({"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"};PRAWY(TEKST(PRAWY(TEKST(ZAOKR.DO.CAŁK(A1*100)/100;"0,00");2)+0;"0");1)+0+1)))>1;" cents";" cent"))
Działa dla kwot do 999 999 999,99 włącznie. Testowane pod Excelem 2010. Oto źródło tej formuły napisane w Perlu:
$liczba = "A1";
# to jest funkcją, żeby w przyszłości móc zmienić na wersję zobfuskowaną
sub jezeli {
my $warunek = shift;
my $tak = shift;
my $nie = shift;
return "JEŻELI($warunek;$tak;$nie)";
}
sub ostatnie_dwie_cyfry {
my $liczba = shift;
return "PRAWY(TEKST($liczba;\"00\");2)";
}
sub ostatnia_cyfra {
my $liczba = shift;
return "PRAWY(TEKST($liczba;\"0\");1)+0";
}
sub przedostatnia_cyfra {
my $liczba = shift;
my $ostatnie_dwie_cyfry = ostatnie_dwie_cyfry($liczba);
return "LEWY($ostatnie_dwie_cyfry;1)+0";
}
sub dwucyfrowa_slownie {
my $liczba = shift;
my $liczebniki_1_19 = '{"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"eleven";"twelve";"thriteen";"fourteen";"fifteen";"sixteen";"seventeen";"eighteen";"nineteen"}';
my $ostatnie_dwie_cyfry = ostatnie_dwie_cyfry($liczba);
my $liczebnik_do_19 = "INDEKS($liczebniki_1_19;$ostatnie_dwie_cyfry+1)";
my $ostatnia = ostatnia_cyfra($liczba);
my $przedostatnia = przedostatnia_cyfra($liczba);
my $liczebniki_20_90 = '{"twenty";"thirty";"fourty";"fifty";"sixty";"seventy";"eighty";"ninety"}';
my $liczebniki_0_9 = '{"";"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"}';
my $dziesci = "INDEKS($liczebniki_20_90;$przedostatnia-1)";
my $iles = "INDEKS($liczebniki_0_9;$ostatnia+1)";
my $dziesciiles = "$dziesci\&\" \"\&$iles";
return jezeli("$ostatnie_dwie_cyfry+0<20", $liczebnik_do_19, $dziesciiles);
}
sub dwucyfrowa_lub_0_slownie {
my $liczba = shift;
return jezeli("$liczba=0", '"zero"', dwucyfrowa_slownie($liczba));
}
sub trzycyfrowa_slownie {
my $liczba = shift;
my $liczebnik_do_99 = dwucyfrowa_slownie($liczba);
my $liczebniki_100_900 = '{"sto";"dwieście";"trzysta";"czterysta";"pięćset";"sześćset";"siedemset";"osiemset";"dziewięćset"}';
my $liczebniki_1_9 = '{"one";"two";"three";"four";"five";"six";"seven";"eight";"nine"}';
my $cyfra_setek = "LEWY(TEKST($liczba;\"000\");1)+0";
my $ewentualne_setki = "INDEKS($liczebniki_1_9;$cyfra_setek)&\" hundred\"";
my $setki = jezeli("$cyfra_setek>0", "$ewentualne_setki&\" \"", '""');
return "$setki&$liczebnik_do_99";
}
sub szesciocyfrowa_slownie {
my $liczba = shift;
my $sformatowana = "TEKST($liczba;\"000000\")";
my $grupa_1 = "PRAWY($sformatowana;3)+0";
my $grupa_2 = "LEWY($sformatowana;3)+0";
my $liczebnik_1 = trzycyfrowa_slownie($grupa_1);
my $ewentualny_liczebnik_2 = trzycyfrowa_slownie($grupa_2);
my $liczebnik_2 = jezeli("$grupa_2>0", $ewentualny_liczebnik_2 . '&" thousand"', '""');
return "$liczebnik_2\&\" \"\&$liczebnik_1";
}
# rozbudowana wersja funkcji szesciocyfrowa_slownie
# nie korzysta z funkcji szesciocyfrowa_slownie
sub dziewieciocyfrowa_slownie {
my $liczba = shift;
my $sformatowana = "TEKST($liczba;\"000000000000\")";
my $grupa_1 = "FRAGMENT.TEKSTU($sformatowana;10;3)+0";
my $grupa_2 = "FRAGMENT.TEKSTU($sformatowana;7;3)+0";
my $grupa_3 = "FRAGMENT.TEKSTU($sformatowana;4;3)+0";
my $liczebnik_1 = trzycyfrowa_slownie($grupa_1);
my $ewentualny_liczebnik_2 = trzycyfrowa_slownie($grupa_2);
my $ewentualny_liczebnik_3 = trzycyfrowa_slownie($grupa_3);
my $ewentualne_tysiace = '" thousand"';
my $ewentualne_miliony = '" million"';
my $liczebnik_2 = jezeli("$grupa_2>0", "$ewentualny_liczebnik_2\&$ewentualne_tysiace", '""');
my $liczebnik_3 = jezeli("$grupa_3>0", "$ewentualny_liczebnik_3\&$ewentualne_miliony", '""');
return "$liczebnik_3\&\" \"\&$liczebnik_2\&\" \"\&$liczebnik_1";
}
sub liczba_slownie {
my $liczba = shift;
return jezeli("$liczba=0", '"zero"', dziewieciocyfrowa_slownie($liczba));
}
$liczebnik_zl = liczba_slownie("ZAOKR.DO.CAŁK($liczba)");
$zl = jezeli("$liczebnik_zl>1", '" dollars"', '" dollar"');
$grosze = "PRAWY(TEKST(ZAOKR.DO.CAŁK($liczba*100)/100;\"0,00\");2)+0";
$liczebnik_gr = dwucyfrowa_lub_0_slownie($grosze);
$gr = jezeli("$liczebnik_gr>1", '" cents"', '" cent"');
print "=USUŃ.ZBĘDNE.ODSTĘPY($liczebnik_zl\&\" \"&$zl&\" \"\&$liczebnik_gr\&\" \"\&$gr)";