Scomposizione numei



  • Scomposizione numei
    di Paganiva (utente non iscritto) data: 14/07/2013 01:21:03

    Saluti a tutti.
    Ho un numero es.
    1234567890
    Contenuto in una singola cella es. A1
    Vorrei scomporlo in Unità decine centinaia migliaia, decine di migliaia ec ecc
    in modo da riempire altrttante celle, quante sono le cifre del numero , in questo
    caso es. A2 "1" (unità)
    A3 "2" (decine)
    A4 "3 (centinaia)
    A5 "4" (migliaia) ecc eccetera in modo da ottenere una specie di tabella in queso caso di 10 celle.
    Spero di essere stato chiaro.
    Ciao a tutti e grazie



  • di Vecchio Frac data: 14/07/2013 11:56:26

    Scorri con un contatore la stringa per tutta la sua lunghezza (Len).
    Ad ogni passaggio si incrementa il contatore di uno, quindi questo è anche lo scarto che ti serve per passare alla cella successiva. Ad ogni passaggio quindi ti serve prelevare l'i-esimo carattere della stringa (Mid) e infilarlo nella cella corrispondente allo scarto dalla prima (Offset).






  • di paganiva (utente non iscritto) data: 14/07/2013 17:00:05

    Grazie Vecchio Frac per la spiegazione, tutto molto chiaro, ma la mia conoscenza del VBA, non mi permette di andare oltre un semplice ciclo. Scopiazzando da altre macro ho cercato di andare avanti, ma ho ancora molto da imparare per andare avanti.


  • scomposizione numero
    di canapone data: 14/07/2013 18:14:29

    Ciao a tutti,

    sono a zero con il Visual Basic

    In B1 potresti però provare

    =SE.ERRORE(STRINGA.ESTRAI($A1;LUNGHEZZA($A1)-RIF.COLONNA(A$1)+1;1)+0;"")

    Basta copiare la formula verso sinistra

    Spero sia d'aiuto



  • di Paganiva (utente non iscritto) data: 14/07/2013 19:21:47

    Ciao canapone
    Ho provato la tua soluzione, ma la scomposizione paarte dall'ultima cifra di destra spostandosi verso sinistra
    così 1234567890 diventa 0 9 8 7 6 5 4 3 2 1
    Ho inoltre provato ad adattare la funzione al range di mio interesse ("I3:I2002") ma mi da solo la seconda e prima cifra.
    Dove sbaglio?
    Grazie



  • di Paganiva (utente non iscritto) data: 14/07/2013 19:36:04

    P.S.
    Scusa canapone, avevo saltato il passaggio di spostare la funzione dalla cella di riferimento verso sinistra.



  • di Paganiva (utente non iscritto) data: 14/07/2013 19:41:13

    P.S.
    Come non detto, non funziona



  • di Vecchio Frac data: 14/07/2013 21:32:45

    Questa è la sub a cui pensavo io.
    Puoi effettuare una selezione e poi lanciare la macro oppure modificare la macro affinchè "r" si riferisca già a un range determinato.
     
    Option Explicit
    
    Sub scomponi()
    Dim i As Integer, r As Range
        Set r = Selection
        For i = 1 To Len(r)
            r.Offset(, i) = Mid(r, i, 1)
        Next
    End Sub
    






  • di Vecchio Frac data: 14/07/2013 21:49:48

    Un po' per noia, un po' per gioco :)
    Ecco una tecnica leggermente diversa, che sfrutta TextToColumns.
    La sub naturalmente va adattata (perchè splitta solo la cella A1).
    Temo che sia terribilmente inefficiente su un range molto vasto ma... è interessante ;)
     
    Option Explicit
    
    Sub scomponi_2()
    Dim v() As Variant, i As Integer
    
        ReDim v(Len([a1]) - 1)
        
        For i = 0 To Len([a1]) - 1
            v(i) = Array(i, 1)
        Next
        
        [a1].TextToColumns Destination:=[b1], DataType:=xlFixedWidth, FieldInfo:=v
        
    End Sub






  • di paolomath data: 14/07/2013 23:55:18

    Ciao,
    se il numero è 1234567890 nella cella A1, il numero delle unità nella cella B1 è "0", il numero delle decine nella C1 è "9" ecc. così come nella soluzione di canapone!

    Utilizzando solo formule:

    Se vuoi scrivere partendo dalle unità metti nella cella B1 la formula:

    =SE(LUNGHEZZA($A1)>RIF.COLONNA(A1)-1;STRINGA.ESTRAI($A1;LUNGHEZZA($A1)-RIF.COLONNA(A1)+1;1);"") e trascini verso destra (il SE serve ad evitare errori quando hai finito le cifre del numero)

    Se vuoi le unità in fondo alla sequenza (a destra) metti in B1 la formula:

    =STRINGA.ESTRAI($A2;RIF.COLONNA(A2);1) e trascini verso destra.

    Bye



  • di paganiva (utente non iscritto) data: 14/07/2013 23:58:03

    Saluti a tutti.
    Grazie Vecchio frac per le soluzioni.
    Credo che sia più semplice adottare la prima in quanto il range di azione sono 2000 righe.
    Ho cercato di sviluppare la macro in modo che lavori in colonna "i" con step di una riga fino a che incontra dati
    presenti in colonna, ma non sono riuscito ad adattarli. -o: -o: -o: -o: -o
    I risultati della scomposizione in cifre dovrebbero popolare le celle da colonna AA riempiendo a destra della stessa.
    Questo dovrebbe avvenire ad ogni inserimento per cui le macro dovrà poi essere inserita nell' evento Worksheet_SelectionChange.
    Spero di essere stato chiaro

    Saluti:
     
    Option Explicit
    
    Sub scomponi()
    Dim intero As Integer, r As Range, ' variabile per colonna steep to steep rng As Range
    
      'Set rng = Sheets("Foglio1").Range("i3:B" & Range("i" & Rows.Count).End(xlUp).Row)
      
        Set r = Selection
        For intero = 1 To Len(r)
            r.Offset(, intero) = Mid(r, intero, 1)
        Next
        Set r = Nothing
    End Sub



  • di paganiva (utente non iscritto) data: 15/07/2013 00:04:36

    Grazie paolomath
    soluzione adattabilissima alla mia situazione.
    Ho allegato il file per vedere se possibile una soluzione con VBA invece che con una funzione.
    Saluti


  • unità-decine-centinaia
    di enopanaC (utente non iscritto) data: 15/07/2013 08:51:52

    Ciao a tutti,

    Numero A1, prima formula in B1

    Ho scritto "Basta copiare la formula verso sinistra"

    Intendevo "verso destra" per ottenere unità, decine, centinaia...

    Mi scuso se ho creato confusione nell'applicazione della formula.




  • di Vecchio Frac data: 15/07/2013 10:40:07

    Ecco il codice adattato.
    Scopone il numero che si sta editando nelle cifre che lo compongono, sistemandole da colonna AA in avanti. L'edit intercettabile è solo quello che avviene da cella I3 in giù.
    Scompone anche parole naturalmente, non si fa distinzione.
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer, r As Range, rng As Range
    
        'scompone il valore inserito nella cella che si sta editando
        'inserendo le diverse cifre che la copongono nelle colonne a destra
      
        If Intersect(Target, [I:I]) Is Nothing Then Exit Sub
        If Target.Row < 3 Then Exit Sub
        If Target = "" Then Exit Sub
        
        Application.EnableEvents = False
        
        Set r = Target
        For i = 1 To Len(r)
            r.Offset(, 17 + i) = Mid(r, i, 1)
        Next
        
        Application.EnableEvents = True
    End Sub
    
    






  • di paganiva (utente non iscritto) data: 15/07/2013 14:55:40

    Grazie a tutti
    canapone e enopanaC per la soluzione con funzione
    Vecchio frac, ho inserito il codice, ma credo che ci sia qualche incomprensione, la scomposizione non avviene. allego il file v.01
    Saluti



  • di paganiva (utente non iscritto) data: 15/07/2013 14:58:26

    P.s.
    Dimenticavo di ringraziare anche paolomath per la sua funzione adattabilissima alla mia situazione.



  • di Vecchio Frac data: 15/07/2013 19:46:59

    Funziona perfettamente.
    Poichè la sub intercetta l'evento Change, cioè la modifica della cella, per attivarla ti basta
    - entrare in una delle celle interessate
    - premere F2 per attivare l'edit
    - confermare con Invio.

    Ed ecco la magia :)





  • di paganiva (utente non iscritto) data: 15/07/2013 21:24:47

    Ok Vecchio frac non conoscevo l'attivazione con edit, pensavo ad un'azione simultanea inserimento/scomposizione.
    Chiedo venia.
    Saluti e grazie.



  • di Vecchio Frac data: 15/07/2013 21:37:59

    Ma lo è, "simultanea" ^_^
    Nel momento in cui modifichi una cella e confermi l'inserimento con Invio, si scatena l'evento Change.
    Se hai una cella già valorizzata, e ne modifichi il contenuto (nel modo che preferisci: premendo F2, facendo click sulla barra della formula, doppio click sulla cella), parimenti si scatena l'evento Change (appena confermata la modifica con Invio; se premi ESC non si verifica alcune Change).





  • di paganiva (utente non iscritto) data: 15/07/2013 22:00:34

    Ok Vecchio frac, come non detto. Saluti e grazie per la disponibilità.