Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Conversione numero in Base36

  1. #1
    Sgrubak non  in linea Scribacchino
    Ciao a tutti!
    Mi sono ritrovato con l'esigenza di effettuare la conversione come da titolo, e ho notato che ne qui, ne su altri forum italiani viene affrontato l'argomento. Esistono un sacco di convertitori online, ma nulla che possa essere facilmente sfruttato in Excel.

    Quel che mi manca di ottenere : Specificare come secondo argomento il formato "000" ed ottenere il numero con gli zeri iniziali.

    Funziona se il risultato assomiglia ad un numero decimale, quindi senza lettere al suo interno. Prendendo ad esempio
    =ConvertiLngToB36(55)
    =ConvertiLngToB36(110)
    
    Ottengo correttamente i risultati "1J" e "32".
    Utilizzando invece
    =ConvertiLngToB36(55;"000")
    =ConvertiLngToB36(110;"000")
    
    ottengo "1J" e "032", mentre quel che cerco avere anche il primo numero con gli zeri iniziali, ossia "01J".
    Mi ci sto arrovellando, ma non saprei proprio come impostare la funzione.

    Lascio di seguito il codice completo come riferimento per quanto sopra e nel caso in cui possa mai servire a qualcuno:
    Option Explicit
    Const CARATTERI As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Public Function ConvertiLngToB36(stringa As String, Optional formato As String = "0") As String
    Dim c As String, risultato As String
    Dim longDaConvertire As Long
    Dim resto As Long
    
    longDaConvertire = CLng(stringa)
    
    If longDaConvertire < 0 Then
        ConvertiLngToB36 = CVErr(xlErrValue)
        Exit Function
    End If
    
    Do
        resto = longDaConvertire Mod 36
        longDaConvertire = longDaConvertire \ 36
        risultato = risultato & Mid(CARATTERI, resto + 1, 1)
    Loop Until longDaConvertire = 0
    
    ConvertiLngToB36 = Format(StrReverse(risultato), formato)
    
    End Function
    
    Public Function ConvertiB36ToLng(stringa As String) As Long
    Dim risultato As Double
    Dim stringaRev As String
    Dim i As Integer, indiceLetteraCorrente As Integer
    
    stringaRev = StrReverse(stringa)
    For i = 1 To Len(stringaRev)
        
        indiceLetteraCorrente = InStr(1, CARATTERI, UCase(Mid(stringaRev, i, 1))) - 1
        
        If indiceLetteraCorrente < 0 Then
            ConvertiB36ToLng = CVErr(xlErrValue)
            Exit Function
        End If
        
        risultato = risultato + (36 ^ (i - 1)) * indiceLetteraCorrente
    Next i
    ConvertiB36ToLng = CLng(risultato)
    End Function
    


    P.S: Magari lo miglioro rendendolo fruibile anche per i numeri negativi e numeri con la virgola, ma al momento fa quel che mi serve e son contento.
    Ultima modifica di Master85; 21-12-2020 11:56  Motivo: Aggiunto [RISOLTO] al titolo

  2. #2
    Non puoi usare la format con una stringa del genere. Se sono solo zeri da aggiungere, concatenate gli zeri con la stringa e poi prendi la con right che ti serve
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ...
    Quel che mi manca di ottenere : Specificare come secondo argomento il formato "000" ed ottenere il numero con gli zeri iniziali.
    ottengo "1J" e "032", mentre quel che cerco avere anche il primo numero con gli zeri iniziali, ossia "01J".
    ...
    ConvertiLngToB36 = Format(StrReverse(risultato), formato)
    
    Faccio il lazzarone, intervengo solo sul risultato finale prendendo spunto da un manuale che ha fatto la storia di VBA: VBA Developer's Handbook ma non ricordo se la prima o seconda edizione (che ha autori diversi quindi mi dispiace non attribuire il giusto merito a chi spetta). Non ricordo di preciso l'utilizzo, passato troppo tempo, serviva forse per caratteri di riempimento in generale, in testa o in coda... per ecco, il meccanismo l'ho imparato l
    Dim stringa1 As String
    Dim stringa2 As String
    stringa1 = formato & StrReverse(risultato) 'risultato 0001J
    stringa2 = Right$(stringa1, Len(risultato)) 'che esplicitato  Right$("0001J", 3)
    ConvertiLngToB36 = stringa2
    
    Ho usato variabli in abbondanza per rendere pi chiaro il famoso meccanismo di cui parlavo prima: "formato" il contenuto massimo dei valori di riempimento; a questo accodo il valore vero, quello che voglio sistemare, e prendo il numero di caratteri di cui composto "formato", in questo caso partendo da destra
    Ecco! nel frattempo, senza scrivere la "pappa pronta", l'aveva gi detto AntonioG. Uffaaaaa!!!!

  4. #4
    Sgrubak non  in linea Scribacchino
    Grazie ragazzi! Semplice ed efficace... Proprio non ci avevo pensato.

    Ho solo aggiunto una If, in modo che nel caso in cui la lunghezza del formato sia pi corta della lunghezza del risultato, non tronchi la stringa restituendo valori errati.

    Public Function ConvertiLngToB36(stringa As String, Optional formato As String = "0") As String
    Dim c As String, risultato As String
    Dim longDaConvertire As Long
    Dim resto As Long
    
    longDaConvertire = CLng(stringa)
    
    If longDaConvertire < 0 Then
        ConvertiLngToB36 = CVErr(xlErrValue)
        Exit Function
    End If
    
    Do
        resto = longDaConvertire Mod 36
        longDaConvertire = longDaConvertire \ 36
        risultato = risultato & Mid(CARATTERI, resto + 1, 1)
    Loop Until longDaConvertire = 0
    
    risultato = StrReverse(risultato)
    
    If Len(risultato) > Len(formato) Then
        ConvertiLngToB36 = risultato
    Else
        ConvertiLngToB36 = Right(formato & risultato, Len(formato))
    End If
        
    End Function
    
    @Phil: A riga 4 del tuo codice un refuso la Len(risultato), o mi sta sfuggendo qualcosa? Credo debba essere Len(formato), giusto?
    Ultima modifica di Sgrubak; 21-12-2020 08:49 

  5. #5
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ...
    @Phil: A riga 4 del tuo codice un refuso la Len(risultato), o mi sta sfuggendo qualcosa? Credo debba essere Len(formato), giusto?
    (Quando presi in castagna i "sapientoni" rispondono: "Volevo vedere se eri attento" )

    Volevo vedere se eri attento e avevi capito il meccanismo.

  6. #6
    Sgrubak non  in linea Scribacchino

    Ti capisco. quel che capita a me tutti i giorni.

  7. #7
    Sgrubak non  in linea Scribacchino
    Piccoli aggiustamenti:
    Public Function ConvertiLngToB36(stringa As String, Optional formato As String = "0") As String
    Dim risultato As String
    Dim longDaConvertire As Long
    Dim resto As Long
     
    longDaConvertire = CLng(stringa)
     
    If longDaConvertire < 0 Then
        ConvertiLngToB36 = CVErr(xlErrValue)
        Exit Function
    End If
     
    Do
        resto = longDaConvertire Mod 36
        longDaConvertire = longDaConvertire \ 36
        risultato = Mid(CARATTERI, resto + 1, 1) & risultato
    Loop Until longDaConvertire = 0
     
    If Len(risultato) > Len(formato) Then
        ConvertiLngToB36 = risultato
    Else
        ConvertiLngToB36 = Right(formato & risultato, Len(formato))
    End If
         
    End Function
    
    Mi sono accorto che concatenavo al risultato il carattere a riga 16 e poi utilizzavo la StrReverse(). Ho concatenato al contrario e ho rimosso l'inversione della stringa a riga 19. Ho rimosso anche la variabile stringa [c] che era un refuso delle varie prove ed in realt non serviva.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Conversione di testo in numero
    Da SiriusBlack nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 05-04-2017, 11:20
  2. conversione visualizzazione numero
    Da mardock11 nel forum C/C++
    Risposte: 1
    Ultimo Post: 01-06-2015, 22:29
  3. Conversione numero DA lettere A cifre
    Da John Hawk nel forum Visual Basic 6
    Risposte: 26
    Ultimo Post: 21-09-2012, 16:59
  4. [VBA] Conversione colonna da stringa a numero
    Da L4P_81 nel forum Microsoft Excel
    Risposte: 10
    Ultimo Post: 29-11-2011, 11:05
  5. Conversione da Byte a numero
    Da Eurofolle nel forum Visual Basic 6
    Risposte: 14
    Ultimo Post: 07-07-2011, 10:19