Sviluppare funzionalita su Microsoft Office con VBA conversione di un numero in cifre

Login Registrati
Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
  • Autore
    Articoli
  • #45949 Score: 0 | Risposta

    Buona sera

    chiedo cordialmente se mi potesse mandare un file excel in cui un numero digitato in una cella excel si può convertire in lettere

    In attesa di un vostro parere porgo i miei distinti saluti

    #45954 Score: 0 | Risposta

    gianfranco55
    Partecipante
      61 pts

      ciao

      metti questa su un modulo

      Function spell_my_int(ByVal num As Long) As String
          Dim centOOttanta As Boolean
          centOOttanta = False
          Dim numstring As String
          Dim numlen As Integer
          Dim IDcent As Byte
          Dim subnumerostring As String
          Dim subnumero As Integer
          Dim cifra(2) As String
          Dim text(2) As String
          Dim prime2cifre As Integer
          Dim result As String
          Dim sezione As Integer
          Dim mono(9) As String
          Dim duplo(9) As String
          Dim deca(9) As String
          Dim cento(2) As String
          Dim mili(1, 9) As String
          Dim max
          max = ((10 ^ (6 * 3)) - 1) - 1
          '   Caricamento di mono() in formato esteso
          mono(0) = ""
          mono(1) = "uno"
          mono(2) = "due"
          mono(3) = "tre"
          mono(4) = "quattro"
          mono(5) = "cinque"
          mono(6) = "sei"
          mono(7) = "sette"
          mono(8) = "otto"
          mono(9) = "nove"
          '   Caricamento di duplo() in formato esteso
          duplo(0) = "dieci"
          duplo(1) = "undici"
          duplo(2) = "dodici"
          duplo(3) = "tredici"
          duplo(4) = "quattordici"
          duplo(5) = "quindici"
          duplo(6) = "sedici"
          duplo(7) = "dicias" & mono(7)
          duplo(8) = "dici" & mono(8)
          duplo(9) = "dician" & mono(9)
          '   Caricamento di deca() in formato esteso
          deca(0) = ""
          deca(1) = duplo(0)
          deca(2) = "venti"
          deca(3) = mono(3) & "nta"
          deca(4) = "quaranta"
          deca(5) = "cinquanta"
          deca(6) = "sessanta"
          deca(7) = "settanta"
          deca(8) = "ottanta"
          deca(9) = "novanta"
          '   Caricamento di cento() in formato esteso
          cento(0) = "cent"
          cento(1) = cento(0) & "o"
          '   Caricamento di mili(0 ,) in formato esteso
          mili(0, 0) = ""
          mili(0, 1) = "mille"
          mili(0, 2) = "milione"
          mili(0, 3) = "miliardo"
          mili(0, 4) = "bilione"
          mili(0, 5) = "biliardo"
          '   Caricamento di mili(1 ,) in formato esteso
          mili(1, 0) = ""
          mili(1, 1) = "mila"
          mili(1, 2) = "milioni"
          mili(1, 3) = "miliardi"
          mili(1, 4) = "bilioni"
          mili(1, 5) = "biliardi"
          result = ""
          sezione = 0
          If (num < 0) Then
              spell_my_int = "Minimo 0!"
          ElseIf (num > max) Then
              spell_my_int = "Massimo " & max & "!"
          ElseIf (num = 0) Then
              spell_my_int = "zero"
          Else
              numstring = CStr(num)
              Select Case (Len(numstring) Mod 3)
                  Case 1
                      numstring = "00" & CStr(num)
                  Case 2
                      numstring = "0" & CStr(num)
                  Case Else
                      numstring = CStr(num)
              End Select
              numlen = Len(numstring)
              'MsgBox ("Numlen: " & numlen & "  subnumero: " & numstring)
              Do While ((sezione + 1) * 3 <= numlen)
                  subnumerostring = Mid(numstring, (numlen - ((sezione + 1) * 3)) + 1, 3)
                  subnumero = CInt(subnumerostring)
                  cifra(0) = Mid(subnumerostring, 1, 1)
                  cifra(1) = Mid(subnumerostring, 2, 1)
                  cifra(2) = Mid(subnumerostring, 3, 1)
                  'MsgBox ("Sezione numero: " & sezione & ", cifre della sezione: " & cifra(0) & cifra(1) & cifra(2))
                  If (subnumero <> 0) Then
                      prime2cifre = CInt(cifra(1)) * 10 + CInt(cifra(2))
                      'MsgBox (prime2cifre)
                      If (prime2cifre < 10) Then
                          text(2) = mono(cifra(2))
                          text(1) = ""
                      ElseIf (prime2cifre < 20) Then
                          text(2) = ""
                          text(1) = duplo(prime2cifre - 10)
                      Else
                          'ventitre => ventitrè
                          If (sezione = 0 And cifra(2) = 3) Then
                              text(2) = "trè"
                          Else
                              text(2) = mono(cifra(2))
                          End If
                          '   novantaotto => novantotto
                          If (cifra(2) = 1 Or cifra(2) = 8) Then
                              text(1) = Mid(deca(cifra(1)), 1, Len(deca(cifra(1))) - 1)
                          Else
                              text(1) = deca(cifra(1))
                          End If
                      End If
                      If (cifra(0) = 0) Then
                          text(0) = ""
                      Else
                          ' centoottanta => centottanta
                          If (Not centOOttanta And cifra(1) = 8 Or (cifra(1) = 0 And cifra(2) = 8)) Then
                              IDcent = 0
                          Else
                              IDcent = 1
                          End If
                          If (cifra(0) <> 1) Then
                              text(0) = mono(cifra(0)) & cento(IDcent)
                          Else
                              text(0) = cento(IDcent)
                          End If
                      End If
                      '   unomille    => mille
                      '   miliardo    => unmiliardo
                      If (subnumero = 1 And sezione <> 0) Then
                          If (sezione >= 2) Then
                              result = "un" & mili(0, sezione) & result
                          Else
                              result = mili(0, sezione) & result
                          End If
                      Else
                          result = text(0) & text(1) & text(2) & mili(1, sezione) & result
                      End If
                  End If
                  sezione = sezione + 1
              Loop
              spell_my_int = result
          End If
      End Function

      in A1 scrivi un numero intero

      in A2

      =spell_my_int(A1)

      #45956 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        247 pts

        Gianfranco ha tirato fuori uno dei suoi rari conigli dal cappello targato VBA   

        Di questi algoritmi ce ne sono tanti in giro, io mi ero divertito a fare il contrario anni fa, da lettere a cifre: "seimilioniduecentomilatre" --> 6.200.003   

        #45958 Score: 0 | Risposta

        scossa
        Partecipante
          26 pts

          vecchio frac ha scritto:

          Di questi algoritmi ce ne sono tanti in giro,

           

          Io non ho mai capito perché non si usi il sistema dei trasferimenti internazionali tra banche:

          1.257,32 -> #uno due cinque sette,32#
          
          N.B.: vado a memoria, potrebbe esserci un - o un # tra le cifre.

           

          #45959 Score: 0 | Risposta

          gianfranco55
          Partecipante
            61 pts

            ciao

            ma quale coniglio

            l'ho copiato di sana pianta facendo una ricerca in google

            non ho trovato niente che legga le virgole

            anzi no l'ho trovato ma i decimali li scrive come numero.

             

            vbaisti del piffero

            basterebbe estrarre l'intero e poi usare il resto

            ma la macro verrebbe raddoppiata

            #45961 Score: 0 | Risposta

            scossa
            Partecipante
              26 pts

              gianfranco55 ha scritto:

              non ho trovato niente che legga le virgole

              Ma non è previsto che i decimali vengano convertiti in lettere.

              #45965 Score: 0 | Risposta

              gianfranco55
              Partecipante
                61 pts

                ciao

                si parla di teoria poi che serva o no non importa😁

                comunque ci sono riuscito

                scrivi un numero con la virgola in Ai

                =spell_my_int(A1)&" virgola "&spell_my_int(FILTRO.XML("<d>"&SOSTITUISCI($A1;",";"")&"</d>";"//a[last()]"))

                io ho scritto "virgola" ma uno può mettere quello che vuole

                #45967 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  247 pts

                  gianfranco55 ha scritto:

                  ma la macro verrebbe raddoppiata

                  Basterebbe un sapiente uso della ricorsione   

                  gianfranco55 ha scritto:

                  comunque ci sono riuscito

                  Non c'erano dubbi   

                  scossa ha scritto:

                  Io non ho mai capito perché non si usi il sistema dei trasferimenti internazionali tra banche:

                  Ma negli assegni si deve scrivere la cifra in lettere, e non si scrivono le cifre singolarmente, o almeno io non ne ho mai visti di cosi'

                  #45969 Score: 0 | Risposta

                  scossa
                  Partecipante
                    26 pts

                    vecchio frac ha scritto:

                    Ma negli assegni si deve scrivere la cifra in lettere,

                    Certo, ma credo siano convenzioni; per i trasferimenti via SWIFT, nei messaggi l'importo in lettere è come da esempio:

                    USD 1,725.48 #one-seven-two-five/48# 

                    non sono certo dei "simboli" (l'ultimo messaggio swift l'ho visto 15 anni fa), ma la sostanza è quella: sistema semplice e non lascia di certo dubbi sull'interpretazione.

                    #45975 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      247 pts

                      scossa ha scritto:

                      sistema semplice e non lascia di certo dubbi sull'interpretazione.

                      Perfettamente d'accordo, semplice e non ambiguo, le cifre sono solo dieci e non ci sono problemi a tradurre centinaia, migliaia, milioni, con le varianti locali su singolare/plurale o crasi varie (seicentottantuno  per esempio, dove devo capire che "cento" diventa "cent" e "ottanta" diventa "ottant").

                    Login Registrati
                    Stai vedendo 10 articoli - dal 1 a 10 (di 10 totali)
                    Rispondi a: conversione di un numero in cifre
                    Gli allegati sono permessi solo ad utenti REGISTRATI
                    Le tue informazioni: