trasformare dati ricorsivi presenti su un colonna in colonne ordinate

Anonimo
2018-05-30T13:47:53+00:00

Buon giorno, ho l'esigenza di trasformare un file che ha delle informazioni su una sola colonna ma ricorsive e trasferirle su colonne. Un esempio e' piu' chiaro.

Excel di partenza (ha circa 5000 righe e le informazioni si ripetono ma per 

Pippo

pippo@

industria X

link2

Pluto

pluto@

industri Y

link3

.....

Excel finale

Nome |    email  |   Industria  | Link |

Pippo | pippo@ | industria X |link2 |

Pluto  | pluto@  | industria Y |link3 |

.....      | ......         | .............        | ......   |

Ho provato ad usare traspose ma non trovo una soluzione per farlo ricorsivamente. Qualche idea su come farlo?

Grazie

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

9 risposte

Ordina per: Più utili
  1. Anonimo
    2018-06-04T21:10:43+00:00

    Grazie ancora, ho provato ad eseguire la macro ma durante l'esecuzione mi dice che c'e' un errore

    "Errore di run time '9':

    indice non incluso nell'intervallo

    Il debugger si ferma in questo punto:

        ReDim arrOut(1 To (LRow - iPrimaRigaDati) / _

                     iRows, 1 To iRighePerBloccoDati)

    Come varibili ho ho cambiato solo la seconda da 9 a 7 i deti che ho.

        Const sFoglio As String = "Foglio1"                   '<<=== Modifica

        Const iRighePerBloccoDati As Long = 7             '<<=== Modifica

        Const iPrimaRigaDati As Long = 2                     '<<=== Modifica

        Const iRigheVuoteTraBlocchiDati As Long = 1   '<<=== Modifica

        Const sDestinazione As String = "C2"                '<<=== Modifica

    Forse devo inzializzare altre variabili?

    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-06-01T01:08:40+00:00

    Ciao Cristian,

    ho provato ad eseguire  la prima soluzione

    =INDICE($A:$A;RIF.RIGA(A1)*7-8+RIF.COLONNA(A1))

    sostituendo 9 con 7 che sono i valori dei campi che ho. Se eseguo il comando Ctrl+Maisc+Invio mi dice che la formula contiene un errore.   

    Bisogna adattare entrambi i due valori numerici nella mia formula a secondo del numero di campi ed il numero della prima riga di dati.

    Quindi, ponendo 7 campi e con con dati che iniziano in A1, la formula sarebbe:

        =INDICE($A:$A;RIF.RIGA(A1)*7-7+RIF.COLONNA(A1))

    Se gli stessi dati dovessero iniziare in A2, la formula diventerebbe:

        =INDICE($A:$A;RIF.RIGA(A1)*7-6+RIF.COLONNA(A1))

    Capirai già che le formule corrispondenti per i dati che iniziano in A3 o A4 sarebbero rispettivamente

        =INDICE($A:$A;RIF.RIGA(A1)*7-5+RIF.COLONNA(A1))

    e:

        =INDICE($A:$A;RIF.RIGA(A1)*7-4+RIF.COLONNA(A1))

    Tuttavia, piuttosto che inserire 35.000 (5.000 x 7) formule, personalmente io preferirei sfruttare la macro che ho suggerito.

    Se tu dovessi ancora avere un problema, ti chiederei di caricare una versione del tuo file, priva di dati sensibili, per mostrare la disposizione dei dati

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-05-31T23:01:51+00:00

    Grazie Norman, ho provato ad eseguire  la prima soluzione

    =INDICE($A:$A;RIF.RIGA(A1)*7-8+RIF.COLONNA(A1))

    sostituendo 9 con 7 che sono i valori dei campi che ho. Se eseguo il comando Ctrl+Maisc+Invio mi dice che la formula contiene un errore.   

    Grazie per il supporto, Cristian

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2018-05-30T17:14:15+00:00

    Ciao Cristian,

    Data la presenza di 5000 righe, se volessi evitare l'uso delle formule, potresti provare qualcosa del genere:

    • Alt+F11 per aprire l'editor di VBA
    • Alt+IM per inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Tester()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim srcRng As Range, destRng As Range

        Dim arrIn As Variant, arrOut() As Variant

        Dim iRows As Long, LRow As Long

        Dim i As Long, j As Long, k As Long

        Dim ictr As Long

        Dim CalcMode As Long

        Const sFoglio As String = "Foglio1"                   '<<=== Modifica

        Const iRighePerBloccoDati As Long = 9 '<<=== Modifica

        Const iPrimaRigaDati As Long = 2 '<<=== Modifica

        Const iRigheVuoteTraBlocchiDati As Long =1 '<<=== Modifica

        Const sDestinazione As String = "C2"                '<<=== Modifica

        Set WB = ThisWorkbook

        Set SH = WB.Sheets(sFoglio)

        iRows = iRighePerBloccoDati _

                + iRigheVuoteTraBlocchiDati

        With SH

            LRow = LastRow(SH, .Columns("A:A"))

            Set srcRng = .Range("A" & iPrimaRigaDati & ":A" & LRow)

            Set destRng = .Range(sDestinazione)

        End With

        arrIn = srcRng.Value

        ReDim arrOut(1 To (LRow - iPrimaRigaDati) / _

                     iRows, 1 To iRighePerBloccoDati)

        For i = 1 To UBound(arrIn) Step iRows

            ictr = ictr + 1

            For j = 1 To iRighePerBloccoDati

                arrOut(ictr, j) = arrIn(i + j - 1, 1)

            Next j

        Next i

        On Error GoTo XIT

        Application.ScreenUpdating = False

        destRng.Resize(ictr, iRighePerBloccoDati).Value = arrOut

        Call MsgBox( _

             Prompt:="Fatto!", _

             Buttons:=vbInformation, _

             Title:="REPORT")

    XIT:

        Application.ScreenUpdating = True

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range, _

                            Optional minRow As Long = 1, _

                            Optional sPassword As String)

        Dim bProtected As Boolean

        With SH

            If Rng Is Nothing Then

                Set Rng = .Cells

            End If

            bProtected = .ProtectContents = True

            If bProtected Then

                .Unprotect Password:=sPassword

            End If

        End With

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           after:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

        If bProtected Then

            SH.Protect Password:=sPassword, _

                       UserInterfaceOnly:=True

        End If

    End Function

    '<<========= 

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel
    • Salva il file con l’estensione xlsm
    • Alt+F8 per aprire  la finestra di gestione delle macro
    • Seleziona Tester
    • Esegui

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2018-05-30T15:34:33+00:00

    Ciao Cristian,

    Buon giorno, ho l'esigenza di trasformare un file che ha delle informazioni su una sola colonna ma ricorsive e trasferirle su colonne. Un esempio e' piu' chiaro.

    Excel di partenza (ha circa 5000 righe e le informazioni si ripetono ma per 

    Pippo

    pippo@

    industria X

    link2

    Pluto

    pluto@

    industri Y

    link3

    .....

    Excel finale

    Nome |    email  |   Industria  | Link |

    Pippo | pippo@ | industria X |link2 |

    Pluto  | pluto@  | industria Y |link3 |

    .....      | ......         | .............        | ......   |

    Ho provato ad usare traspose ma non trovo una soluzione per farlo ricorsivamente. Qualche idea su come farlo?

    Poniamo che i dati si trovino nell'intervallo A2:An. e chew ogni blocco di dati cpmprende 9 righe.

    Nella prima di interesse, ad esempio, C1, immetti la formula:

    =INDICE($A:$A;RIF.RIGA(A1)*9-8+RIF.COLONNA(A1))

    Trascina la formula a destra e in basso quanto necessario:

    Nella formula suggerita, sostituisci 9 con il numero di righe di dati in ciascun blocco di dati.

    Postscriptum:

    Questa è una formula matriciale che deve essere confermata con la combinazione di tasti Ctrl+Maisc+Invio

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento