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
Deschide Microsoft Excel.
Apasă Alt+F11 pentru a deschide aplicația Visual Basic Editor.
În meniul Insert, clic pe Module.
Copiază codul de mai sus în noul modul inserat.
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).