Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Excel: Ricavare numero in lettere da quello in cifre
Nuovo argomento   Rispondi    Indice del forum -> Office e LibreOffice
Precedente :: Successivo  
Autore Messaggio
nero.bm
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 02/10/08 15:51
Messaggi: 105

MessaggioInviato: 10 Ott 2008 19:57    Oggetto: Rispondi citando

Con la macro funziona, ma con il richiamo diretto della funzione nella forma =sCifraInLettere(coordinate_della _cella) no ancora.
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 10 Ott 2008 19:59    Oggetto: Rispondi citando

strano...

hai apportato tutte e due le modifiche?

la seconda l'ho aggiunta forse mentre stavi leggendo...
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 10 Ott 2008 20:21    Oggetto: Rispondi citando

hai ragione... quando deve decodificare una sommatoria fa casino Sad

per tagliare la testa al toro [povero toro]

fai quest'altra modifica

l'istruzione:
da:
Citazione:
sDecimali = Right(Format(avTmp(1) * 0.1, "###########0.00"), 2)



in:
Citazione:
If Len(avTmp(1)) = 1 Then
sDecimali = avTmp(1) & "0"
Else
sDecimali = avTmp(1)
End If



dove:
precedente [dopo la prima modifica]
dopo la modifica


NOTA: ho modificato lo script con le correzioni
Top
Profilo Invia messaggio privato
ro76
Comune mortale
Comune mortale


Registrato: 18/10/08 09:28
Messaggi: 2

MessaggioInviato: 18 Ott 2008 09:47    Oggetto: Rispondi citando

Ciao GrayWolf,

questa macro è proprio quello che cercavo. Ti ringrazio di averla resa disponibile.

C'è però un piccolo problema. Quando i numeri sono 28, 38, 48, 58, 68, 78, 88, 98 la conversione li trasforma in "ventiotto", "trentaotto", "quarantaotto" ecc.

Dovrebbe essere, invece, "ventotto", "trentotto", "quarantotto" ecc.

Insomma quando l'ultimo numero è otto andrebbe fatta la stessa conversione che si fa quando l'ultimo numero è uno.

Visto che io capisco poco di programmazione e non capisco dove dovrei modificare, saresti così gentile da apportare questa ulteriore modifica al codice?

Grazie!
Top
Profilo Invia messaggio privato
nero.bm
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 02/10/08 15:51
Messaggi: 105

MessaggioInviato: 18 Ott 2008 19:20    Oggetto: Rispondi citando

Ti scrivo la macro completa che fino ad ora non mi ha dato problemi, ma ..... non è farina del mio sacco (ho fatto una lieve modifica):
-------------------------------------------------------------------------------------
Sub trasforma()
Dim oWB As Workbook
Dim oWS As Worksheet
Dim sText As String
Dim sNum As String


Set oWB = ThisWorkbook
Set oWS = oWB.ActiveSheet
With oWS
'-------------------------------------------
' sNum = .Range("H23").Text
' sText = sCifraInLettere(sNum)
' .Range("C8") = sText
'-------------------------------------------
' sNum = .Range("A2").Text
' sText = sCifraInLettere(sNum)
' .Range("B2") = sText
'-------------------------------------------
' sNum = .Range("A3").Text
' sText = sCifraInLettere(sNum)
' .Range("B3") = sText
'-------------------------------------------
' sNum = .Range("A4").Text
' sText = sCifraInLettere(sNum)
' .Range("B4") = sText
'-------------------------------------------
' sNum = .Range("A5").Text
' sText = sCifraInLettere(sNum)
' .Range("B5") = sText
'-------------------------------------------
' sNum = .Range("A6").Text
' sText = sCifraInLettere(sNum)
' .Range("B6") = sText
'-------------------------------------------
' sNum = .Range("A7").Text
' sText = sCifraInLettere(sNum)
' .Range("B7") = sText
'-------------------------------------------
' sNum = .Range("A8").Text
' sText = sCifraInLettere(sNum)
' .Range("B8") = sText
'-------------------------------------------
End With


End Sub
Function sCifraInLettere(CifraInNumero As Variant) As String

Dim CifraInCaratteri, StringaInCostruzione, PrimoCharMaiusc As String
Dim aUnita, aDecine, aCentin, aSottoVenti, a, b As Variant
Dim nUn, nDec, nCent, nMigl, nCentMigl As Integer
Dim nMilion, nDecMilion, nCentMilion As Integer

Dim sDecimali As String
Dim avTmp As Variant
If InStr(CifraInNumero, ",") > 0 Then
avTmp = Split(CifraInNumero, ",")
CifraInNumero = avTmp(0)
If Len(avTmp(1)) = 1 Then
SDecimali =avTmp(1) & ?0?
Else
sDecimali = avTmp(1)
End If
End If

CifraInNumero = Replace(CifraInNumero, ".", "")

If Not IsNumeric(CifraInNumero) Then
MsgBox "la cella non contiene un valore numerico"
Exit Function
End If

'Assegamenti alle matrici: siccome la numerazione degli elementi in VB
'inizia da 0 mettiamo al primo posto una stringa vuota in modo
'che il primo elemento che conta sia all'indice 1 dell'array
'per non creare confusione dopo.

aUnita = Array("", "un", "due", "tre", "quattro", "cinque", _
"sei", "sette", "otto", "nove")

aDecine = Array("", "dieci", "venti", "trenta", "quaranta", _
"cinquanta", "sessanta", "settanta", _
"ottanta", "novanta")

aCentin = Array("", "cento", "duecento", "trecento", _
"quattrocento", "cinquecento", "seicento", _
"settecento", "ottocento", "novecento")

aSottoVenti = Array("", "dieci", "undici", "dodici", _
"tredici", "quattordici", _
"quindici", "sedici", "diciasette", _
"diciotto", "diciannove")

'Il codice seguente conserva la lunghezza della stringa a 9 caratteri
CifraInCaratteri = Trim(Str$(CifraInNumero))

If (Len(CifraInCaratteri) = 1) Then
CifraInCaratteri = "00000000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 2) Then
CifraInCaratteri = "0000000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 3) Then
CifraInCaratteri = "000000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 4) Then
CifraInCaratteri = "00000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 5) Then
CifraInCaratteri = "0000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 6) Then
CifraInCaratteri = "000" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 7) Then
CifraInCaratteri = "00" & CifraInCaratteri
ElseIf (Len(CifraInCaratteri) = 8) Then
CifraInCaratteri = "0" & CifraInCaratteri
End If

nUn = Val(Mid$(CifraInCaratteri, 9, 1))
nDec = Val(Mid$(CifraInCaratteri, 8, 1))
nCent = Val(Mid$(CifraInCaratteri, 7, 1))
nMigl = Val(Mid$(CifraInCaratteri, 6, 1))
nDecMigl = Val(Mid$(CifraInCaratteri, 5, 1))
nCentMigl = Val(Mid$(CifraInCaratteri, 4, 1))
nMilion = Val(Mid$(CifraInCaratteri, 3, 1))
nDecMilion = Val(Mid$(CifraInCaratteri, 2, 1))
nCentMilion = Val(Mid$(CifraInCaratteri, 1, 1))

If (nCentMilion <> 0) Then
StringaInCostruzione = StringaInCostruzione & aCentin(nCentMilion)
End If
If (nDecMilion <> 0) Then
If (nDecMilion < 2) Then
StringaInCostruzione = StringaInCostruzione & aSottoVenti(nMilion + 1)
Else
StringaInCostruzione = StringaInCostruzione & aDecine(nDecMilion)
End If
End If

If (nMilion <> 0 And nDecMilion <> 1) Then
StringaInCostruzione = StringaInCostruzione & aUnita(nMilion)
End If
If (nCentMilion = 0 And nDecMilion = 0 And nMilion = 1) Then
StringaInCostruzione = StringaInCostruzione & "milione"
End If
If (nCentMilion <> 0 Or nDecMilion <> 0 Or nMilion > 1) Then
StringaInCostruzione = StringaInCostruzione & "milioni"
End If
If (nCentMigl <> 0) Then
StringaInCostruzione = StringaInCostruzione & aCentin(nCentMigl)
End If
If (nDecMigl <> 0) Then
If (nDecMigl < 2) Then
StringaInCostruzione = StringaInCostruzione & aSottoVenti(nMigl + 1)
Else
StringaInCostruzione = StringaInCostruzione & aDecine(nDecMigl)
End If
End If
If (nMigl <> 0 And nDecMigl <> 1) Then
If (Not (nCentMilion = 0 _
And nDecMilion = 0 _
And nMilion = 0 _
And nCentMigl = 0 _
And nDecMigl = 0 _
And nMigl = 1)) _
Then
StringaInCostruzione = StringaInCostruzione & aUnita(nMigl)
End If
End If
If (nCentMigl <> 0 Or nDecMigl <> 0 Or nMigl <> 0) Then
If (nCentMilion = 0 _
And nDecMilion = 0 _
And nMilion = 0 _
And nCentMigl = 0 _
And nDecMigl = 0 _
And nMigl = 1) _
Then
StringaInCostruzione = StringaInCostruzione & "mille"
Else
StringaInCostruzione = StringaInCostruzione & "mila"
End If
End If
If (nCent <> 0) Then
StringaInCostruzione = StringaInCostruzione & aCentin(nCent)
End If
If (nDec <> 0) Then
If (nDec < 2) Then
StringaInCostruzione = StringaInCostruzione & aSottoVenti(nUn + 1)
Else
StringaInCostruzione = StringaInCostruzione & aDecine(nDec)
If CifraInCaratteri Mod 10 = 1 Then
StringaInCostruzione = Left(StringaInCostruzione, Len(StringaInCostruzione) - 1)
End If
End If
End If
If (nUn <> 0 And nDec <> 1) Then
If (nUn = 1) Then
StringaInCostruzione = StringaInCostruzione & "uno"
Else
StringaInCostruzione = StringaInCostruzione & aUnita(nUn)
End If
End If
StringaInCostruzione = StrConv(StringaInCostruzione, vbProperCase)
If Len(sDecimali) > 0 Then
StringaInCostruzione = StringaInCostruzione & "/" & sDecimali
'* commentare [con un APICE SINGOLO A INIZIO RIGA]
'* le due righe sottostanti se NON si vuole l'aggiunta di /00
'* QUANDO NON CI SONO DECIMALI
Else
StringaInCostruzione = StringaInCostruzione & "/00"
End If
sCifraInLettere = StringaInCostruzione

End Function
-------------------------------------------------------------------------------------
Dimenticavo: usa la formula "= sCifraInLettere(sNum)" per leggere la casella con il numero da trasformare
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 18 Ott 2008 19:52    Oggetto: Rispondi citando

ro76 ha scritto:
Ciao GrayWolf,

questa macro è proprio quello che cercavo. Ti ringrazio di averla resa disponibile.

C'è però un piccolo problema. Quando i numeri sono 28, 38, 48, 58, 68, 78, 88, 98 la conversione li trasforma in "ventiotto", "trentaotto", "quarantaotto" ecc.

Dovrebbe essere, invece, "ventotto", "trentotto", "quarantotto" ecc.

Insomma quando l'ultimo numero è otto andrebbe fatta la stessa conversione che si fa quando l'ultimo numero è uno.

Visto che io capisco poco di programmazione e non capisco dove dovrei modificare, saresti così gentile da apportare questa ulteriore modifica al codice?

Grazie!


de nada Smile
anzi, grazie a te della segnalazione

ecco qui la funzione riveduta e corretta per l'eliminazione dell'ultimo carattere della decina quando l'unità è 1 o 8

Codice:

Function sCifraInLettere(CifraInNumero As Variant) As String
   
    Dim CifraInCaratteri, StringaInCostruzione, PrimoCharMaiusc As String
    Dim aUnita, aDecine, aCentin, aSottoVenti, a, b As Variant
    Dim nUn, nDec, nCent, nMigl, nCentMigl As Integer
    Dim nMilion, nDecMilion, nCentMilion As Integer
   
    Dim sDecimali As String
    Dim avTmp     As Variant
   
    If InStr(CifraInNumero, ",") > 0 Then
      avTmp = Split(CifraInNumero, ",")
      CifraInNumero = avTmp(0)
      If Len(avTmp(1)) = 1 Then
        sDecimali = avTmp(1) & "0"
      Else
        sDecimali = avTmp(1)
      End If
    End If

    CifraInNumero = Replace(CifraInNumero, ".", "")
    If Not IsNumeric(CifraInNumero) Then
      MsgBox "la cella non contiene un valore numerico"
      Exit Function
    End If
   
 
 'Assegamenti alle matrici: siccome la numerazione degli elementi in VB
    'inizia da 0 mettiamo al primo posto una stringa vuota in modo
    'che il primo elemento che conta sia all'indice 1 dell'array
    'per non creare confusione dopo.
   
    aUnita = Array("", "un", "due", "tre", "quattro", "cinque", _
    "sei", "sette", "otto", "nove")
   
    aDecine = Array("", "dieci", "venti", "trenta", "quaranta", _
    "cinquanta", "sessanta", "settanta", _
    "ottanta", "novanta")
   
    aCentin = Array("", "cento", "duecento", "trecento", _
    "quattrocento", "cinquecento", "seicento", _
    "settecento", "ottocento", "novecento")
   
    aSottoVenti = Array("", "dieci", "undici", "dodici", _
    "tredici", "quattordici", _
    "quindici", "sedici", "diciasette", _
    "diciotto", "diciannove")
   
    'Il codice seguente conserva la lunghezza della stringa a 9 caratteri
    CifraInCaratteri = Trim(Str$(CifraInNumero))
   
    If (Len(CifraInCaratteri) = 1) Then
        CifraInCaratteri = "00000000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 2) Then
        CifraInCaratteri = "0000000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 3) Then
        CifraInCaratteri = "000000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 4) Then
        CifraInCaratteri = "00000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 5) Then
        CifraInCaratteri = "0000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 6) Then
        CifraInCaratteri = "000" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 7) Then
        CifraInCaratteri = "00" & CifraInCaratteri
    ElseIf (Len(CifraInCaratteri) = 8) Then
        CifraInCaratteri = "0" & CifraInCaratteri
    End If
   
    nUn = Val(Mid$(CifraInCaratteri, 9, 1))
    nDec = Val(Mid$(CifraInCaratteri, 8, 1))
    nCent = Val(Mid$(CifraInCaratteri, 7, 1))
    nMigl = Val(Mid$(CifraInCaratteri, 6, 1))
    nDecMigl = Val(Mid$(CifraInCaratteri, 5, 1))
    nCentMigl = Val(Mid$(CifraInCaratteri, 4, 1))
    nMilion = Val(Mid$(CifraInCaratteri, 3, 1))
    nDecMilion = Val(Mid$(CifraInCaratteri, 2, 1))
    nCentMilion = Val(Mid$(CifraInCaratteri, 1, 1))
   
    If (nCentMilion <> 0) Then
        StringaInCostruzione = StringaInCostruzione & aCentin(nCentMilion)
    End If
    If (nDecMilion <> 0) Then
        If (nDecMilion < 2) Then
          StringaInCostruzione = StringaInCostruzione & aSottoVenti(nMilion + 1)
        Else
          StringaInCostruzione = StringaInCostruzione & aDecine(nDecMilion)
        End If
    End If
   
    If (nMilion <> 0 And nDecMilion <> 1) Then
        StringaInCostruzione = StringaInCostruzione & aUnita(nMilion)
    End If
    If (nCentMilion = 0 And nDecMilion = 0 And nMilion = 1) Then
        StringaInCostruzione = StringaInCostruzione & "milione"
    End If
    If (nCentMilion <> 0 Or nDecMilion <> 0 Or nMilion > 1) Then
        StringaInCostruzione = StringaInCostruzione & "milioni"
    End If
    If (nCentMigl <> 0) Then
        StringaInCostruzione = StringaInCostruzione & aCentin(nCentMigl)
    End If
    If (nDecMigl <> 0) Then
        If (nDecMigl < 2) Then
          StringaInCostruzione = StringaInCostruzione & aSottoVenti(nMigl + 1)
        Else
          StringaInCostruzione = StringaInCostruzione & aDecine(nDecMigl)
        End If
    End If
    If (nMigl <> 0 And nDecMigl <> 1) Then
        If (Not (nCentMilion = 0 _
        And nDecMilion = 0 _
        And nMilion = 0 _
        And nCentMigl = 0 _
        And nDecMigl = 0 _
        And nMigl = 1)) _
        Then
          StringaInCostruzione = StringaInCostruzione & aUnita(nMigl)
        End If
    End If
    If (nCentMigl <> 0 Or nDecMigl <> 0 Or nMigl <> 0) Then
        If (nCentMilion = 0 _
        And nDecMilion = 0 _
        And nMilion = 0 _
        And nCentMigl = 0 _
        And nDecMigl = 0 _
        And nMigl = 1) _
        Then
            StringaInCostruzione = StringaInCostruzione & "mille"
        Else
            StringaInCostruzione = StringaInCostruzione & "mila"
        End If
    End If
    If (nCent <> 0) Then
        StringaInCostruzione = StringaInCostruzione & aCentin(nCent)
    End If
    If (nDec <> 0) Then
        If (nDec < 2) Then
          StringaInCostruzione = StringaInCostruzione & aSottoVenti(nUn + 1)
        Else
          StringaInCostruzione = StringaInCostruzione & aDecine(nDec)
          If CifraInCaratteri Mod 10 = 1 _
          Or CifraInCaratteri Mod 10 = 8 Then
            StringaInCostruzione = Left(StringaInCostruzione, Len(StringaInCostruzione) - 1)
          End If
        End If
    End If
    If (nUn <> 0 And nDec <> 1) Then
      If (nUn = 1) Then
        StringaInCostruzione = StringaInCostruzione & "uno"
      Else
        StringaInCostruzione = StringaInCostruzione & aUnita(nUn)
      End If
    End If
    StringaInCostruzione = StrConv(StringaInCostruzione, vbProperCase)
    If Len(sDecimali) > 0 Then
      StringaInCostruzione = StringaInCostruzione & "/" & sDecimali
   '* commentare [con un APICE SINGOLO A INIZIO RIGA]
   '* le due righe sottostanti se NON si vuole l'aggiunta di /00
   '* QUANDO NON CI SONO DECIMALI
    Else
      StringaInCostruzione = StringaInCostruzione & "/00"
    End If
    sCifraInLettere = StringaInCostruzione

End Function



è possibile fare una prova digitando i valori
18
28
38
48
58
68
78
88
98
in celle che abbiano formato numerico con due decimali e nella cella adiacente =sCifraInLettere(coordinate_della_cella_precedente)
quindi
se
A2 contiene 28,00
B2 conterrà =CifraInLettere(A2)
e così via
Top
Profilo Invia messaggio privato
ro76
Comune mortale
Comune mortale


Registrato: 18/10/08 09:28
Messaggi: 2

MessaggioInviato: 19 Ott 2008 09:14    Oggetto: Rispondi

Grazie mille, GrayWolf! Funziona a meraviglia.

Un saluto
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Office e LibreOffice Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi