Condividi:        

[EXCEL] Tradurre numeri in lettere

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: [EXCEL] Tradurre numeri in lettere

Postdi dario.caregnato » 26/03/14 10:51

Grazie Anthony per la tua funzione, utilissima. Attenzione però che c'erano due piccoli "errori", o almeno la funzione non si comportava come mi aspettavo.

1) 1,45 -> viene convertito come .45 (senza l'UNO)
2) 3,06 -> viene convertito come TRE/6 (manca lo ZERO dei decimali!)

Ho quindi modificato il codice, ora mi sembra andare.

Codice: Seleziona tutto
Option Base 1
Dim sSpell As String
Function SpellIt(ByVal myValore As Double, Optional ByVal myDec As Integer = 2) As String
'traduce un valore nel suo spelling, by Anthony47
'
'Uso:
'      =SPELLIT(ValoreNumerico [;NumDecimali])
'               NumDecimali e' opzionale, di default viene usato 2
'
'Esempio
'=SPELLIT(456,789) restituira' "quattrocentocinquantasei/79"
'
'Max ValNumerico = 2.147.483.647
'I Negativi vengono rappresentati come "-(Spelling)"
'
Dim sValore As String, sPotenza, uPotenza, I As Long, myMille As String, vValore As Long
'
sSpell = ""
'Valori chiave e sostituzioni
sPotenza = Array("miliardi.", "milioni.", "mila.", "")
uPotenza = Array("unmiliardo.", "unmilione.", "mille.", "uno")
'
sValore = Format(Abs(Fix(myValore)), "000000000000")
vValore = Int(Abs(myValore))
'
For I = 1 To 4   '4 blocchi "migliaia"
myMille = Mid(sValore, 1 + (I - 1) * 3, 3)
If CLng(myMille) > 0 Then
    If CLng(myMille) = 1 Then
        sSpell = sSpell & uPotenza(I)
    Else
        sSpell = sSpell & sMille(myMille) & sPotenza(I)
    End If
End If
Next I
' MODIFICATO per non far aggiungere lo "/" e poter valutare myVirg come numero
' Compila spelling
If sSpell = "" Then sSpell = "zero"
If myDec > 0 Then myVirg = Round((Abs(myValore) - vValore) * (10 ^ myDec), 0)

' AGGIUNTO se necessario aggiungo lo ZERO nei decimali
If myVirg < 10 Then myVirg = 0 & myVirg

' SPOSTATO aggiunta dello slash
myVirg = "/" & myVirg

SpellIt = sSpell & myVirg
If myValore < 0 Then SpellIt = "-(" & SpellIt & ")"
End Function

Function sMille(ByVal sBlocco As String) As String
Dim vNum, sNum, vBlocco As Long, nwBlocco As String, strNum As String
Dim Iv As Long
'
'Valori chiave
vNum = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
    30, 40, 50, 60, 70, 80, 90, 100)
sNum = Array("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici", _
    "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove", "venti", _
    "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta", "cento")
If Len(sBlocco) > 3 Then   'Sara' sempre Falso
    sMille = "#####": Exit Function
End If
'
strNum = sBlocco
ReBlk:
vBlocco = CLng(strNum)
If vBlocco > 99 Then
    nwBlocco = Left(strNum, 1)
    If vBlocco > 199 Then
        txt1 = sMille(nwBlocco) & "cento"
        strNum = Replace(strNum, nwBlocco, "", 1, 1)
    Else
        txt1 = "cento"
        strNum = Replace(strNum, nwBlocco, "", 1, 1)
    End If
End If
If vBlocco > 199 Then GoTo ReBlk
If vBlocco <= 20 Then GoTo Fase3
Fase2:
vBlocco = CLng(strNum)
    CPart = Application.Match(vBlocco, vNum)
    txt2 = sNum(CPart)
    CVal = vNum(CPart)
    vBlocco = vBlocco - CVal
Fase3:
If vBlocco > 0 Then
    txt3 = sNum(vBlocco + 1)
'    txt3 = sMille(Format(vBlocco, "0"))
End If
'
'Compila spelling
If (Left(txt3, 1) = "u" Or Left(txt3, 1) = "o") And Len(txt2) > 0 Then _
    txt2 = Left(txt2, Len(txt2) - 1)
sMille = txt1 & txt2 & txt3
End Function


Spero sia utile anche ad altri, a presto!

Dario
dario.caregnato
Newbie
 
Post: 1
Iscritto il: 26/03/14 10:46

Sponsor
 

Re: [EXCEL] Tradurre numeri in lettere

Postdi Anthony47 » 26/03/14 15:50

Ciao dario.caregnato, benvenuto nel forum.
Chissa' quante volte l' ho usata e chissa' quante volte ho messo in giro documenti contrastanti (anche se la tendenza e' di controllare l' esito)... Quindi grazie per la segnalazione!

Propongo la versione 2.0, che corrisponde a questo codice:
Codice: Seleziona tutto
Option Base 1        'RIGOROSAMENTE IN TESTA AL MODULO
Dim sSpell As String 'SEMPRE IN TESTA AL MODULO
Function SpellItV2(ByVal myValore As Double, Optional ByVal myDec As Integer = 2) As String
'traduce un valore nel suo spelling, by Anthony47
'
'Uso:
'      =SPELLITv2(ValoreNumerico [;NumDecimali])
'               NumDecimali e' opzionale, di default viene usato 2
'
'Esempio
'=SPELLITv2(456,789) restituira' "quattrocentocinquantasei/79"
'
'Max ValNumerico = 2.147.483.647
'I Negativi vengono rappresentati come "-(Spelling)"
'
Dim sValore As String, sPotenza, uPotenza, I As Long, myMille As String, vValore As Long
'
sSpell = ""
'Valori chiave e sostituzioni
sPotenza = Array("miliardi.", "milioni.", "mila.", "")
uPotenza = Array("unmiliardo.", "unmilione.", "mille.", "")
'
sValore = Format(Abs(Fix(myValore)), "000000000000")
vValore = Int(Abs(myValore))
'
For I = 1 To 4   '4 blocchi "migliaia"
myMille = Mid(sValore, 1 + (I - 1) * 3, 3)
If CLng(myMille) > 0 Then
    If CLng(myMille) = 1 Then
        If I = 4 Then
            sSpell = sSpell & "uno"    'uPotenza(I)
        Else
            sSpell = sSpell & uPotenza(I)
        End If
    Else
        sSpell = sSpell & sMille(myMille) & sPotenza(I)
    End If
End If
Next I
'Compila spelling
If sSpell = "" Then sSpell = "zero"
If myDec > 0 Then myVirg = "/" & Format(Round((Abs(myValore) - vValore) * (10 ^ myDec), 0), String(myDec, "0"))
SpellItV2 = sSpell & myVirg
If myValore < 0 Then SpellItV2 = "-(" & SpellItV2 & ")"
End Function

Function sMille(ByVal sBlocco As String) As String
Dim vNum, sNum, vBlocco As Long, nwBlocco As String, strNum As String
Dim Iv As Long
'
'Valori chiave
vNum = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
    30, 40, 50, 60, 70, 80, 90, 100)
sNum = Array("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici", _
    "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove", "venti", _
    "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta", "cento")
If Len(sBlocco) > 3 Then   'Sara' sempre Falso
    sMille = "#####": Exit Function
End If
'
strNum = sBlocco
ReBlk:
vBlocco = CLng(strNum)
If vBlocco > 99 Then
    nwBlocco = Left(strNum, 1)
    If vBlocco > 199 Then
        txt1 = sMille(nwBlocco) & "cento"
        strNum = Replace(strNum, nwBlocco, "", 1, 1)
    Else
        txt1 = "cento"
        strNum = Replace(strNum, nwBlocco, "", 1, 1)
    End If
End If
If vBlocco > 199 Then GoTo ReBlk
If vBlocco <= 20 Then GoTo Fase3
Fase2:
vBlocco = CLng(strNum)
    CPart = Application.Match(vBlocco, vNum)
    txt2 = sNum(CPart)
    CVal = vNum(CPart)
    vBlocco = vBlocco - CVal
Fase3:
If vBlocco > 0 Then
    txt3 = sNum(vBlocco + 1)
'    txt3 = sMille(Format(vBlocco, "0"))
End If
'
'Compila spelling
If (Left(txt3, 1) = "u" Or Left(txt3, 1) = "o") And Len(txt2) > 0 Then _
    txt2 = Left(txt2, Len(txt2) - 1)
sMille = txt1 & txt2 & txt3
End Function
Nota: anche la tua versione non risolve esattamente il problema dei decimali se la scelta e' diversa da 2 (es 1,123 diventa uno/01 con 1 decimale).

Ciao e grazie ancora.
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "[EXCEL] Tradurre numeri in lettere":


Chi c’è in linea

Visitano il forum: Nessuno e 75 ospiti