Convertire un numero da cifre a lettere (UDF) - Excel vba

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