numere în cuvinte

Există diverse aplicații (unele și online) de transformare a cifrelor și a numerelor întregi în cuvinte, dar acest lucru e posibil și în Excel. Pentru transformare, se pot folosi:

  • formule în foaia de lucru sau

  • o funcție definită de utilizator (UDF - User Defined Function) în VBA, care poate fi apelată ulterior în registrele Excel (format xlm sau xlsm) - în acest caz, la deschiderea fișierului, Excel va afișa un avertisment de securitate sub panglică. Pentru a putea apela funcția, clic pe Enable Content.

Transformarea numerelor în cuvinte, folosind formule

Fișierul final are două variante (cu spații între cuvinte și fără spații) și poate fi descărcat de pe Google Drive, de aici:

https://drive.google.com/file/d/1vRtOUOufEe-X_7mRKybv4G_gV9SNnXDi/view?usp=sharing

Pe scurt, după introducerea unei valori în celula B2, Excel va afișa în celula A14 transformarea numărului în cuvinte.

În acest caz se pot introduce maxim 9 cifre.

Am folosit și Data Validation pentru a limita numărul maxim de cifre la 9 - cel mai mare număr introdus fiind 999.999.999.

Pentru a simplifica modul de calcul, transformarea s-a făcut în coloana C pe grupuri (zeci+unități, sute etc.), iar rezultatele parțiale au fost concatenate în celula A14, pentru a obține rezultatul final.

Pentru a evita folosirea de formule „kilometrice”, cuvintele sunt preluate din tabele. Astfel, mai rămân de făcut câteva ajustări, doar acolo unde este cazul (pentru a adăuga cuvintele „și”, „de”).

În formule sunt folosite diverse funcții Excel:

  • MOD() - pentru a trunchia valoarea inițială

  • IF() - pentru a prelua diferite cazuri (de exemplu, numerele 11-19 au „regim special”)

  • LEN() - pentru a prelua lungimea numărului

  • VLOOKUP() pentru a căuta corespondentul cifrei/cifrelor în tabelul cu cifre și cuvinte

  • INT() pentru a obține valoarea întreagă a numărului etc.

De exemplu, pentru a prelua zecile și unitățile numărului introdus:

  • mai întâi am trunchiat numărul cu MOD(numar,100), pentru a avea doar zeci și unități

  • apoi am folosit o formulă care să transforme cifrele în cuvinte, în funcție de posibilele intervale: dacă nu sunt zeci și unități (numărul se termină cu 00), dacă sunt doar unități etc.

Desigur, pot fi folosite și alte funcții care duc la același rezultat.

Transformarea numerelor în cuvinte, folosind o funcție scrisă în VBA

Am folosit codul și instrucțiunile de pe pagina https://exceldatapro.com/spellnumber-function/, pe care le-am adaptat la limba română. Intervalul din cod este cuprins între 0.00 și 999999999999999,99 (15 cifre și două zecimale, plus cuvintele pentru „lei” și „bani”).

Macrocomanda conține și variante pentru alte monede - instrucțiunile Select Case, aici pentru EUR și USD.

De exemplu, pentru ca rezultatul transformării să fie în euro, la formula se adaugă parametru "EUR", astfel:

=SpellNumberRO2(A3, "EUR")

unde A3 este celula de unde se preia valoarea care va fi transformată în cuvinte.

Fișierul xlsm pentru varianta în română (cu și fără spații între cuvinte) poate fi descărcat de aici:

https://drive.google.com/file/d/1dFzH1ZFc04vXQ00POLOr2tSDU400FOjh/view?usp=sharing.

Mai jos se află codul în română - varianta cu spații între cuvinte, iar etapele de lucru sunt descrise după cod.

Option Explicit

'Main Function www.ExcelDataPro.com


Public Count, Place 'au fost declarate publice, ca poata fi preluate de functia PreiaUnitati


Function SpellNumberRO2(ByVal MyNumber, Optional MyCurrency As String = "")

Dim Lei, bani, Temp

Dim DecimalPlace ', Count


ReDim Place(9) As String

Place(2) = " Mii "

Place(3) = " Milioane "

Place(4) = " Miliarde "

Place(5) = " Trilioane "

' Reprezentarea valorii in cuvinte.

MyNumber = Trim(Str(MyNumber))

' Pozitia zecimalei sau 0 daca nu exista.

DecimalPlace = InStr(MyNumber, ".")

' Converteste bani si seteaza MyNumber la valoare lei.

If DecimalPlace > 0 Then

bani = PreiaZeci(Left(Mid(MyNumber, DecimalPlace + 1) & _

00, 2))

MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))

End If

Count = 1

Do While MyNumber <> ""

Temp = PreiaSute(Right(MyNumber, 3))

If Temp <> "" Then Lei = Temp & Place(Count) & Lei

If Len(MyNumber) > 3 Then

MyNumber = Left(MyNumber, Len(MyNumber) - 3)

Else

MyNumber = ""

End If

Count = Count + 1

Loop


Dim str_amount, str_amounts

Dim str_ban, str_bani


Select Case UCase(MyCurrency)

Case "EUR"

str_amount = "Euro"

str_amounts = "Euro"

str_ban = "cent"

str_bani = "centi"

Case "USD"

str_amount = "Dolar"

str_amounts = "Dolari"

str_ban = "Cent"

str_bani = "Centi"

Case Else:

str_amount = "Leu"

str_amounts = "Lei"

str_ban = "ban"

str_bani = "bani"

End Select


Select Case Lei

Case ""

Lei = "Zero " & str_amounts

Case "Unu"

Lei = "Un " & str_amount

Case Else

Lei = Lei & " " & str_amounts

End Select

Select Case bani

Case ""

bani = " si zero " & str_bani

Case "Unu"

bani = " si un " & str_ban

Case Else

bani = " si " & bani & " " & str_bani

End Select


SpellNumberRO2 = Lei & bani


End Function

' Converteste un numar din intervalul 100-999 in text

Function PreiaSute(ByVal MyNumber)

Dim Result As String

If Val(MyNumber) = 0 Then Exit Function

MyNumber = Right("000" & MyNumber, 3)

' Aici sute.

If Mid(MyNumber, 1, 1) <> "0" Then

If Mid(MyNumber, 1, 1) = "1" Then

Result = " O Suta "

ElseIf Mid(MyNumber, 1, 1) = "2" Then

Result = " Doua Sute "

Else

Result = PreiaUnitati(Mid(MyNumber, 1, 1)) & " Sute "

End If

End If

' Converteste zeci si unitati.

If Mid(MyNumber, 2, 1) <> "0" Then

Result = Result & PreiaZeci(Mid(MyNumber, 2))

Else

Result = Result & PreiaUnitati(Mid(MyNumber, 3))

End If

PreiaSute = Result

End Function


' Converteste un numar din intervalul 10-99 in text.

Function PreiaZeci(ZeciText)

Dim Result As String

Result = "" ' Anuleaza valoarea functiei temporare.

If Val(Left(ZeciText, 1)) = 1 Then ' Daca valoarea este intre 10-19...

Select Case Val(ZeciText)

Case 10: Result = "Zece"

Case 11: Result = "Unsprezece"

Case 12: Result = "Doisprezece"

Case 13: Result = "Treisprezece"

Case 14: Result = "Paisprezece"

Case 15: Result = "Cincisprezece"

Case 16: Result = "Saisprezece"

Case 17: Result = "Saptesprezece"

Case 18: Result = "Optsprezece"

Case 19: Result = "Nouasprezece"

Case Else

End Select

Else ' If value between 20-99...

Select Case Val(Left(ZeciText, 1))

Case 2:

If Right(ZeciText, 1) = "0" Then

Result = "Douazeci "

Else

Result = "Douazeci si "

End If

Case 3:

If Right(ZeciText, 1) = "0" Then

Result = "Treizeci "

Else

Result = "Treizeci si "

End If

Case 4:

If Right(ZeciText, 1) = "0" Then

Result = "Patruzeci "

Else

Result = "Patruzeci si "

End If

Case 5:

If Right(ZeciText, 1) = "0" Then

Result = "Cincizeci "

Else

Result = "Cincizeci si "

End If

Case 6:

If Right(ZeciText, 1) = "0" Then

Result = "Saizeci "

Else

Result = "Saizeci si "

End If

Case 7:

If Right(ZeciText, 1) = "0" Then

Result = "Saptezeci "

Else

Result = "Saptezeci si "

End If

Case 8:

If Right(ZeciText, 1) = "0" Then

Result = "Optzeci "

Else

Result = "Optzeci si "

End If

Case 9:

If Right(ZeciText, 1) = "0" Then

Result = "Nouazeci "

Else

Result = "Nouazeci si "

End If


Case Else

End Select

Result = Result & PreiaUnitati _

(Right(ZeciText, 1)) ' Recupereaza unitatile.

End If


If ZeciText > 20 Then

PreiaZeci = Result & " de"

Else

PreiaZeci = Result

End If

End Function


' Converteste un numar din intervalul 1-9 in text.

Function PreiaUnitati(Digit)

Select Case Val(Digit)

Case 1:

If Count = 1 Then

PreiaUnitati = "Unu"

ElseIf Count = 2 Then

PreiaUnitati = "O"

Place(2) = " Mie "

ElseIf Count = 3 Then

PreiaUnitati = "Un"

Place(3) = " Milion "

ElseIf Count = 4 Then

PreiaUnitati = "Un"

Place(4) = " Miliard "

ElseIf Count = 5 Then

PreiaUnitati = "Un"

Place(5) = " Trilion "

End If

Case 2:

If Count = 1 Then

PreiaUnitati = "Doi"

ElseIf Count = 2 Then

PreiaUnitati = "Doua"

ElseIf Count = 3 Then

PreiaUnitati = "Doua"

Place(3) = " Milioane "

ElseIf Count = 4 Then

PreiaUnitati = "Doua"

Place(4) = " Miliarde "

ElseIf Count = 5 Then

PreiaUnitati = "Doua"

Place(5) = " Trilioane "

End If

Case 3: PreiaUnitati = "Trei"

Case 4: PreiaUnitati = "Patru"

Case 5: PreiaUnitati = "Cinci"

Case 6: PreiaUnitati = "Sase"

Case 7: PreiaUnitati = "Sapte"

Case 8: PreiaUnitati = "Opt"

Case 9: PreiaUnitati = "Noua"

Case Else: PreiaUnitati = ""

End Select

End Function

Etape de creare a funcției UDF de transformare a unui număr în cuvinte

  1. Deschide Microsoft Excel.

  2. Apasă Alt+F11 pentru a deschide aplicația Visual Basic Editor.

  3. În meniul Insert, clic pe Module.

  4. Copiază codul de mai sus în noul modul inserat.

  5. Salvează registrul de lucru cu Ctrl+S. Excel va afișa un mesaj de atenționare, datorită codului. Clic pe „Nu”, apoi salvare registru cu extensia xlm (sau xlsm).

Am terminat cu crearea funcției în registrul de lucru. De reținut că această funcție va fi disponibilă numai în acest registru de lucru. Pentru a o folosi în alt registru de lucru, se repetă pașii menționați mai sus. Pentru a o folosi și în alte registre de lucru de pe aceeași unitate (PC), funcția ar trebui salvată în proiectele VBA - PERSONAL.XLSB.

Notă: registrul de lucru (în format xlm sau xlsm) conține acum o macrocomandă. Atunci când se deschide un registru de lucru care conține macrocomenzi, Excel va afișa un avertisment de securitate sub panglică. Pentru ca macrocomanda să funcționeze, trebuie activat conținutul acesteia (clic pe Enable Content).