Convertire un numero da cifre a lettere (UDF) Inviato da Roberto giovedì 09 aprile 2009 Ultimo aggiornamento giovedì 09 aprile 2009 Il Blog di Excelvba Per convertire un numero da cifre a lettere sono disponibili in internet diverse funzioni, ho deciso di scriverne una anch'io. Il risultato mi è sembrato interessante... E' possibile ottenere due formati a secondo dell'argomento opzionale "Tipo" che viene passato. Qui sotto i risultati a confronto: Numero 10^N Fino_miliardi Direttiva_CEE 10 10^1 dieci dieci 100 10^2 cento cento 1.000 10^3
mille mille 10.000 10^4 diecimila diecimila 100.000 10^5 centomila centomila 1.000.000 10^6 unmilione unmilione 10.000.000 10^7 diecimilioni diecimilioni
100.000.000 10^8 centomilioni centomilioni 1.000.000.000 10^9 unmiliardo unmiliardo 10.000.000.000 10^10 diecimiliardi diecimiliardi 100.000.000.000 10^11 centomiliardi centomiliardi 1.000.000.000.000 10^12 millemiliardi
unbilione 10.000.000.000.000 10^13 diecimilamiliardi diecibilioni 100.000.000.000.000 10^14 centomilamiliardi centobilioni 1.000.000.000.000.000 10^15 unmilione di miliardi unbiliardo 10.000.000.000.000.000 10^16 diecimilioni di miliardi diecibiliardi 100.000.000.000.000.000
10^17 centomilioni di miliardi centobiliardi 1.000.000.000.000.000.000 10^18 millemilioni di miliardi untrilione 10.000.000.000.000.000.000 10^19 diecimilamilioni di miliardi diecitrilioni 100.000.000.000.000.000.000 10^20 centomilamilioni di miliardi centotrilioni All''inizio del codice c è una routine che crea la tabella sul foglio attivo. Buon lavoro a tutti. Saluti r
Option Explicit Public Enum Tipo_Numerazione Fino_miliardi = 0 Direttiva_CEE = 1 End Enum Sub Numeri_e_lettere() Dim v, i As Long Dim rng As Excel.Range Dim sh As Excel.Worksheet 'per vedere il risultato passando i due possibili 'argomenti alla funzione Da_Numeri_a_lettere Set rng = [A1] v = Array("Numero", "Fino_miliardi", "Direttiva_CEE") For i = 0 To UBound(v) rng.offset(0, i) = v(i) Next For i = 1 To 20 rng.offset(i, 0) = CDec(10 ^ i) rng.offset(i, 0).NumberFormat = "#,##0" rng.offset(i, 1) = Da_Numeri_a_lettere(10 ^ i, Fino_miliardi) rng.offset(i, 2) = Da_Numeri_a_lettere(10 ^ i, Direttiva_CEE) Next Set sh = rng.parent sh.cells.entirecolumn.autofit End Sub Function Da_Numeri_a_lettere( _
ByVal Numero As Double, _ Optional Tipo As Tipo_Numerazione = Fino_miliardi) As String ' ' 'Di Roberto Mensa nick r ' ' Dim s As String Dim res As String If Numero = 0 Then Da_Numeri_a_lettere = "" Exit Function s = CStr(CDec(Numero)) If Len(s) <> Len(Replace(s, ",", "")) Or Len(s) > 21 Then Da_Numeri_a_lettere = "#VALORE!" Exit Function Select Case Len(s) Case 1, 2, 3 Da_Numeri_a_lettere = Da_1_a_99(Numero) Case 4, 5, 6 If Numero < 2000 Then Da_Numeri_a_lettere = "mille" & _ Da_1_a_99(Numero Mod 1000) Else Da_Numeri_a_lettere(Int(Numero / 1000)) & _ "mila" & _ Da_1_a_99(Numero Mod 1000)
Case 7, 8, 9 If Numero < 2000 * 10 ^ 3 Then Da_Numeri_a_lettere = "unmilione" & _ Da_Numeri_a_lettere(Numero - 10 ^ 6) Else Da_Numeri_a_lettere(Int(Numero / 10 ^ 6)) & _ "milioni" & _ Da_Numeri_a_lettere(Numero Mod 10 ^ 6) Case 9 To 15 If Numero < 2000 * 10 ^ 6 Then Da_Numeri_a_lettere = "unmiliardo" & _ Da_Numeri_a_lettere(Numero - 10 ^ 9) ElseIf Tipo = Direttiva_CEE Then If Numero < 10 ^ 12 Then Da_Numeri_a_lettere(Int(Numero / 10 ^ 9)) & _ "miliardi" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 9) * 10 ^ 9)) ElseIf Numero < 2000 * 10 ^ 9 Then Da_Numeri_a_lettere = "unbilione" & _ Da_Numeri_a_lettere(Numero - 10 ^ 12) Else Da_Numeri_a_lettere(Int(Numero / 10 ^ 12)) & _ "bilioni" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 12) * 10 ^ 12)) ElseIf Tipo = Fino_miliardi Then Da_Numeri_a_lettere(Int(Numero / 10 ^ 9)) & _
"miliardi" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 9) * 10 ^ 9)) Case 16 To 21 If Tipo = Direttiva_CEE Then If Numero < 2000 * 10 ^ 12 Then Da_Numeri_a_lettere = "unbiliardo" & _ Da_Numeri_a_lettere(Numero - 10 ^ 15) ElseIf Numero < 10 ^ 18 Then Da_Numeri_a_lettere(Int(Numero / 10 ^ 15)) & _ "biliardi" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 15) * 10 ^ 15)) ElseIf Numero < 2000 * 10 ^ 15 Then Da_Numeri_a_lettere = "untrilione" & _ Da_Numeri_a_lettere(Numero - 10 ^ 18) Else Da_Numeri_a_lettere(Int(Numero / 10 ^ 18)) & _ "trilioni" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 18) * 10 ^ 18)) ElseIf Tipo = Fino_miliardi Then If Numero < 2000 * 10 ^ 12 Then Da_Numeri_a_lettere = "unmilione di miliardi" & _ Da_Numeri_a_lettere(Numero - 10 ^ 15) Else Da_Numeri_a_lettere(Int(Numero / 10 ^ 15)) & _ "milioni di miliardi" & _ Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 15) * 10 ^ 15))
End Select End Function Function Da_1_a_99( _ ByVal Numero As Long) As String ' ' 'Di Roberto Mensa nick r ' ' Dim Dic As Object Dim s As String Dim sarr() As String Dim i As Long Set Dic = CreateObject("Scripting.Dictionary") If Numero = 0 Then Exit Function s = "uno due tre quattro cinque sei sette " & _ "otto nove dieci undici dodici tredici " & _ "quattordici quindici sedici diciassette " & _ "diciotto diciannove" sarr = Split(s, " ") For i = 0 To UBound(sArr) Dic.Add i + 1, sarr(i) Next s = "venti trenta quaranta cinquanta s" & _ "essanta settanta ottanta novanta" sarr = Split(s, " ")
For i = 0 To UBound(sArr) Dic.Add (i + 2) * 10, sarr(i) Next s = "ventuno trentuno quarantuno cinqu" & _ "antuno sessantuno settantuno otta" & _ "ntuno novantuno" sarr = Split(s, " ") For i = 0 To UBound(sArr) Dic.Add (i + 2) * 10 + 1, sarr(i) Next s = "ventotto trentotto quarantotto ci" & _ "nquantotto sessantotto settantott" & _ "o ottantotto novantotto" sarr = Split(s, " ") For i = 0 To UBound(sArr) Dic.Add (i + 2) * 10 + 8, sarr(i) Next Select Case Numero Case 1 To 99 Da_1_a_99 = Dic.Item(Numero) If Len(Da_1_a_99) = 0 Then Da_1_a_99 = Dic.Item(Int(Numero / 10) * 10) & _ Dic.Item(Numero Mod 10) Case 100 To 199 Da_1_a_99 = _ "cento" & Da_1_a_99(Numero Mod 100) Case Else Da_1_a_99 = _
Da_1_a_99(Int(Numero / 100)) & _ "cento" & _ Da_1_a_99(Numero Mod 100) End Select End Function