kwota słownie w Excelu

po polsku

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.

po angielsku

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)";