Condividi tramite

Spostare valori da una cella a più celle

Anonimo
2010-10-17T19:52:02+00:00

Allora ragazzi, sulla cella 1A ho dei valori ed ho bisogno di spostare ogni valore sulla cella 1B, 1C eccetera...

Dato che la lista è molto lunga ho bisogno che voi mi dite come posso automatizzare il tutto senza dover fare tutto a mano.

Ovviamente la difficolta sta nel creare l'automazione e far capire al pc che deve spostare il nome nella cella successiva, la data in quella ancora successiva eccetra...

Vi posto un immagine di quello che voglio fare, le frecce corrispondo allo spostare quel valore sull altra cella:

http://img98.imageshack.us/f/immaginedb.jpg/

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2010-10-18T10:24:51+00:00

    E se spezziamo in array, considerando come carattere delimitatore uno spazio e come campo che siamo sicuri sia valorizzato quello della data, potremmo usare questa sub:

    Sub Spezza()

       <cut>

    Nel mio pc, non gira. Dichiarate tutte le variabili? Sicuro(a) di copiare tutti i valori testuali? Le date, sono nel formato corretto; esempio, 5/1/10, come viene riportata? ;-)


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    Forse, se vuoi unire in colonna B tutti i valori testuali(io non ho capito bene cosa voglia l'OP), meglio:

    Public Sub m()

        Dim sh As Worksheet

        Dim lRiga As Long

        Dim lng As Long

        Dim sa As Variant

        Dim lCont As Long

        Dim lCol As Long

        Dim s As String

        Application.ScreenUpdating = False

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        With sh

            On Error Resume Next

            lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

            For lng = 1 To lRiga

                lCol = 3

                sa = Split(.Range("A" & lng).Value, " ")

                For lCont = 0 To UBound(sa)

                    If Not IsNumeric(sa(lCont)) And Not IsDate(CDate(sa(lCont))) Then

                        .Cells(lng, 2).Value = .Cells(lng, 2).Value & sa(lCont) & " "

                    Else

                        If IsNumeric(sa(lCont)) Then

                            .Cells(lng, lCol) = sa(lCont)

                            lCol = lCol + 1

                        Else

                            .Cells(lng, lCol) = Format(sa(lCont), "mm/dd/yyyy")

                            lCol = lCol + 1

                        End If

                    End If

                Next

            Next

            .Columns(1).EntireColumn.Delete

        End With

        Application.ScreenUpdating = True

        Set sh = Nothing

    End Sub


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2010-10-17T23:11:52+00:00

    Ovviamente la difficolta sta nel creare l'automazione e far capire al pc che deve spostare il nome nella cella successiva, la data in quella ancora successiva eccetra...

    Non esattamente; prova ad utilizzare Testo in colonna: -->Dati-->Testo in colonna ed excel farebbe un lavoro egregio. Provalo per verifica.

    La vera difficoltà sta nel fatto che i dati non sono omogenei:

    Qualcuno ha un valore in più rispetto agli altri. Vedi CENNI, PEZZINO, ESPOSITO che non hai preso in considerazione (mancano le frecce)

    Altri hanno cognome o nome rappresentati da tre parole invece di due: DEL GAISO, BERGONZOLI.

    Se hai provato "Testo in colonna" penso che tu abbia capito di cosa sto parlando; comunque il problema è risolvibile in Vba, ma non conosco la tua esperienza in merito.

    Facci sapere, grazie.

    Eliano

    La risposta è stata utile?

    0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-10-18T10:02:19+00:00

    E se spezziamo in array, considerando come carattere delimitatore uno spazio e come campo che siamo sicuri sia valorizzato quello della data, potremmo usare questa sub:

    Sub Spezza()

       <cut>

    Nel mio pc, non gira. Dichiarate tutte le variabili? Sicuro(a) di copiare tutti i valori testuali? Le date, sono nel formato corretto; esempio, 5/1/10, come viene riportata? ;-)


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-10-18T09:48:31+00:00

    E se spezziamo in array, considerando come carattere delimitatore uno spazio e come campo che siamo sicuri sia valorizzato quello della data, potremmo usare questa sub:

    Sub Spezza()

        Dim strDaSpezz As String

        Dim nPosChr As Integer

        Dim nCountSp As Integer

        Dim arrStr() As String

        Dim bEnd As Boolean

        Range("A1").Select

        While ActiveCell.Value <> ""

            strDaSpezz = ActiveCell.Value

            'faccio questo giro perchè non voglio definire a priori la dimensione dell'array

            nCountSp = 0

            bEnd = False

            While Not bEnd

                nPosChr = InStr(1, strDaSpezz, " ", vbTextCompare)

                If nPosChr = 0 Then

                    bEnd = True

                End If

                strDaSpezz = Mid(strDaSpezz, nPosChr + 1)

                nCountSp = nCountSp + 1

            Wend

            'ridimensiono array

            ReDim arrStr(nCountSp)

            'spezzo la stringa nel mio array di lavoro

            nCountSp = 0

            strDaSpezz = ActiveCell.Value

            bEnd = False

            While Not bEnd

                nPosChr = InStr(1, strDaSpezz, " ", vbTextCompare)

                If nPosChr = 0 Then

                    arrStr(nCountSp) = strDaSpezz

                    bEnd = True

                Else

                    arrStr(nCountSp) = Left(strDaSpezz, nPosChr - 1)

                End If

                strDaSpezz = Mid(strDaSpezz, nPosChr + 1)

                nCountSp = nCountSp + 1

            Wend

            'la data è il mio unico dato certo, quindi trovo la posizione in cui è contenuta

            nCountData = 0

            bFind = False

            While Not bFind

                If InStr(1, arrStr(nCountData), "/", vbTextCompare) > 0 Then

                    bFind = True

                Else

                    nCountData = nCountData + 1

                End If

            Wend

            'imposto tutti i dati fino al progr. contenente la data (escludo primo che ha numero)

            ActiveCell.Offset(0, 1).Value = ""

            For i = 1 To nCountData - 1

                If ActiveCell.Offset(0, 1).Value <> "" Then

                    ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value & " "

                End If

                ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value & arrStr(i)

            Next i

            'imposto quello che contiene data

            ActiveCell.Offset(0, 2).Value = arrStr(nCountData)

            'imposto i successivi

            ActiveCell.Offset(0, 3).Value = arrStr(nCountData + 1)

            ActiveCell.Offset(0, 4).Value = arrStr(nCountData + 2)

            'mi sposto di riga

            ActiveCell.Offset(1, 0).Select

        Wend

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-10-18T07:48:05+00:00

    Allora ragazzi, sulla cella 1A ho dei valori ed ho bisogno di spostare ogni valore sulla cella 1B, 1C eccetera...

    Dato che la lista è molto lunga ho bisogno che voi mi dite come posso automatizzare il tutto senza dover fare tutto a mano.

    Ovviamente la difficolta sta nel creare l'automazione e far capire al pc che deve spostare il nome nella cella successiva, la data in quella ancora successiva eccetra...

    Vi posto un immagine di quello che voglio fare, le frecce corrispondo allo spostare quel valore sull altra cella:

    http://img98.imageshack.us/f/immaginedb.jpg/

    Una possibile soluzione l'hai avuta da Eliano. Non è possibile in nessun modo però, distinguere fra nomi e cognomi.

    • Mario Rossi
    • Alberto Maria Rossi
    • Gianni degli Esposti
    • Carlo Alberto de Filippi

    In nessun modo, ne da Excel ne con il vb(macro) riuscirai a incolonnare dati di questo genere in modo omogeneo. Una possibile soluzione vb potrebbe essere questa:

    Public Sub m()

        Dim sh As Worksheet

        Dim lRiga As Long

        Dim lng As Long

        Dim sa As Variant

        Dim lCont As Long

        Dim lCol As Long

        Application.ScreenUpdating = False

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        With sh

            On Error Resume Next

            lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

            For lng = 1 To lRiga

                lCol = 8

                sa = Split(.Range("A" & lng).Value, " ")

                For lCont = 0 To UBound(sa)

                    If Not IsNumeric(sa(lCont)) And Not IsDate(CDate(sa(lCont))) Then

                        .Cells(lng, lCont + 2).Value = sa(lCont)

                    Else

                        If IsNumeric(sa(lCont)) Then

                            .Cells(lng, lCol) = sa(lCont)

                            lCol = lCol + 1

                        Else

                            .Cells(lng, lCol) = Format(sa(lCont), "mm/dd/yyyy")

                            lCol = lCol + 1

                        End If

                    End If

                Next

            Next

            .Columns(1).EntireColumn.Delete

        End With

        Application.ScreenUpdating = True

        Set sh = Nothing

    End Sub

    Dove, hai la colonna A del Foglio1 con  dati da dividere. Nelle colonne da 2 a 7 metto tutto quello che è testo prima della data, diviso voce per voce. Utilizzo 6 colonne per eventuali nomi/cognomi complessi(e qui non posso sapere come già detto quali siano i nomi e quali i cognomi), in colonna 8 allineo le dte, dalla colonna 9 i numeri. Alla fine elimino la colonna A. Eventuali colonne vuote le elimini a mano.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento