Il Blog di Excelvba Convertire un numero da cifre a lettere (UDF) Inviato da Roberto giovedì 09 aprile 2009 Ultimo aggiornamento giovedì 09 aprile 2009 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 http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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 http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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 http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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 http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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 http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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( _ http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba    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 End If s = CStr(CDec(Numero)) If Len(s) <> Len(Replace(s, ",", "")) Or Len(s) > 21 Then    Da_Numeri_a_lettere = "#VALORE!"    Exit Function End If 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 = _                Da_Numeri_a_lettere(Int(Numero / 1000)) & _                "mila" & _                Da_1_a_99(Numero Mod 1000)        End If http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba    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 = _                Da_Numeri_a_lettere(Int(Numero / 10 ^ 6)) & _                "milioni" & _                Da_Numeri_a_lettere(Numero Mod 10 ^ 6)        End If     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 = _                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 = _                Da_Numeri_a_lettere(Int(Numero / 10 ^ 12)) & _                "bilioni" & _                Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 12) * 10 ^ 12))            End If        ElseIf Tipo = Fino_miliardi Then            Da_Numeri_a_lettere = _                Da_Numeri_a_lettere(Int(Numero / 10 ^ 9)) & _ http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba                "miliardi" & _                Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 9) * 10 ^ 9))        End If    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 = _                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 = _                Da_Numeri_a_lettere(Int(Numero / 10 ^ 18)) & _                "trilioni" & _                Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 18) * 10 ^ 18))            End If        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 = _                    Da_Numeri_a_lettere(Int(Numero / 10 ^ 15)) & _                    "milioni di miliardi" & _                    Da_Numeri_a_lettere(Numero - (Int(Numero / 10 ^ 15) * 10 ^ 15))            End If http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba        End If 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, "|") http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba 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)        End If    Case 100 To 199        Da_1_a_99 = _            "cento" & Da_1_a_99(Numero Mod 100)    Case Else        Da_1_a_99 = _ http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56 Il Blog di Excelvba            Da_1_a_99(Int(Numero / 100)) & _            "cento" & _            Da_1_a_99(Numero Mod 100) End Select End Function  http://excelvba.altervista.org/blog Realizzata con Joomla! Generata: 10 June, 2017, 11:56