Trasporre dati da righe in 2 o più colonne.

Anonimo
2019-01-09T09:28:08+00:00

Buongiorno, ho bisogno di traporre dei dati disposti su più colonne sul foglio principale (come da prima immagine allegata) e riportare su di un nuovo foglio (magari chiedendomi di salvarlo con nome ed in una determinata cartella) i dati cosi come sono riportati sull'immagine nr. 2 allegata.

Quindi la mia esigenza è quella di dover creare un nuovo foglio solo con 2 colonne e che riportano le colonne chiamate ID_Fruitore e Turno.

Spero di essere stato chiaro.

Questi sono i dati disposti sul foglio principale.

Questi sono i dati che dovrebbero essere salvati su di un nuovo foglio e posizionati in modo verticale per ogni ID_Fruitore.

Ringrazio in anticipo chi mi vorrà aiutare in questo.

P.S. fate voi se risolvere la mia esigenza con codice oppure con formula, per me va bene lo stesso.

Quello che vi chiedo è di spiegarmi come adattare un eventuale vostro codice o formula poiché ho altri file uguali a questo e che necessitano di tirare fuori dati oltre le 2 colonne (come in questo caso).

Ciao Nicola

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

15 risposte

Ordina per: Più utili
  1. Anonimo
    2019-01-26T12:45:22+00:00

    Ciao Norman, grazie innanzitutto per il tuo cortese e graditissimo riscontro. È un piacere immenso saperti vicino a noi sempre pronto ad aiutarci. Sono fuori per lavoro, proverò le tue formule appena possibile. Puoi per favore postare un codice vba che faccia quello che chiedo, sarebbe più efficace per il mio lavoro, lo devo adattare ad altri fogli di lavoro. Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-01-26T12:43:21+00:00

    Ciao Nicola,

    vedo che il buon Norman ha dato una soluzione con formule.

    Nel frattempo mi ero cimentato nel provare a trovare una possibile soluzione al caso specifico.

    Prova a vedere questo file: File esempio

    Nel Modulo1 è presente questo codice:

    '---

    Option Explicit

    Sub TrasponiValori()

       Const sPrimaCella As String = "A1"

       Const sIntestazioneID As String = "ID_Parent"

       Const sIntestazioneTurno As String = "Turno"

       Const iColID As Long = 1

       Const iColTurno1 As Long = 5 '<--- da personalizzare

       Const iColUltimoTurno As Long = 7 '<--- da personalizzare

       Const NumCampiDatiTrasposti = 2

       Dim WsDati As Worksheet

       Dim rPrimaCella As Range

       Dim rIntervalloDati As Range

       Dim arrDati As Variant

       Dim NumRec As Long, NumCol As Long

       Dim i As Long, j As Long

       Dim NumRecTrasposti As Long

       Dim cont As Long

       Dim arrDatiTrasposti() As Variant

       Dim NewWb As Workbook

       Dim sNomeFile As String

       Set WsDati = ActiveSheet

       Set rPrimaCella = WsDati.Range(sPrimaCella)

       Set rIntervalloDati = rPrimaCella.CurrentRegion

       With rIntervalloDati

          NumRec = .Rows.Count

          NumCol = .Columns.Count

          arrDati = .Value

       End With

       'termino la procedura se non sono rispettate alcune condizioni

       If arrDati(1, iColID) <> sIntestazioneID Then Exit Sub

       If NumRec <= 1 Then Exit Sub

       If NumCol < iColUltimoTurno Then Exit Sub

       'riporto i dati in una matrice trasposta

       NumRecTrasposti = NumRec * (iColUltimoTurno - iColTurno1 + 1)

       ReDim arrDatiTrasposti(1 To NumRecTrasposti, 1 To NumCampiDatiTrasposti)

       'intestazioni dei dati trasposti

       arrDatiTrasposti(1, 1) = "ID_Fruitore"

       arrDatiTrasposti(1, 2) = "Turno"

       cont = 1

       'inserimento dati trasposti

       For i = 2 To NumRec

          For j = 1 To (iColUltimoTurno - iColTurno1 + 1)

             cont = cont + 1

             arrDatiTrasposti(cont, 1) = arrDati(i, 1)

             arrDatiTrasposti(cont, 2) = arrDati(i, j + iColTurno1 - 1)

          Next j

       Next i

       'finestra di dialogo per salvare una nuova cartella di lavoro

       With Application.FileDialog(msoFileDialogSaveAs)

          If .Show = -1 Then

             sNomeFile = .SelectedItems(1)

          End If

       End With

       If sNomeFile <> "" Then

          Set NewWb = Application.Workbooks.Add(1)

          With NewWb

             .Worksheets(1).Range("A1").Resize(NumRecTrasposti, 2).Value = arrDatiTrasposti

             On Error GoTo GestisciErrori

             Application.DisplayAlerts = False

             .SaveAs Filename:=sNomeFile, FileFormat:=xlOpenXMLWorkbook

    RiprendiErrori:

             Application.DisplayAlerts = True

          End With

       End If

       Exit Sub

    GestisciErrori:

    Debug.Print Err.Description

       Select Case Err.Description

          Case "Impossibile salvare la cartella di lavoro con lo stesso nome " & _

               "di una cartella di lavoro o di un componente aggiuntivo aperto. " & _

               "Scegliere un nome differente o chiudere la cartella di lavoro aperta " & _

               "prima di salvare."

             MsgBox "Si sta cercando di salvare il file assegnando un nome di un file aperto." & vbNewLine & _

                    "Chiudere il file prima di salvarne uno nuovo con lo stesso nome.", vbExclamation, "Salvataggio File Dati Trasposti"

          Case Else

             MsgBox "Si è verificato un errore VBA imprevisto!" & vbNewLine & _

                    "Errore n. " & Err.Number & vbNewLine & _

                    Err.Description, vbCritical, "Errore VBA"

       End Select

       Resume RiprendiErrori

    End Sub

    '---

    La routine lavora sul foglio attivo (quindi utilizzabile anche per cartelle di lavoro diverse rispetto a quella in cui si trova al routine (es. nella cartella di lavoro personal associata ad un qualcue pulsante personalizzato nella barra di Excel o nella barra rapida).

    Con queste costanti puoi indicare rispettivamente in che indice di colonna dell'intervallo si trovano rispettivamente la colonna degli ID, la colonna del 1° turno e la colonna dell'ultimo turno (nel caso fosse variabile o ci fossero altre colonne successive da non considerare).

    Viene creata una matrice con i valori "trasposti", si apre una finestra di dialogo che consente di assegnare un nome ad un file (evenutalmente indicando anche un percorso diverso da quello proposto), crea una nuova cartella di lavoro, che viene salvata in formato xlsx, e riporta nel foglio 1 i valori trasposti.

    Prova a vedere se funziona con i tuoi casi reali.

    ciao

    p.s. rispetto alla richiesta di avera una procedura che possa essere facilmente adattata alle varie casistiche, almeno per me, è difficile pensarla senza sapere quali possano essere le altre casistiche.

    Questa procedura si basa sulla struttura che tu hai postato con possibilità di adattarla a più colonne di turni che siano tra loro però consecutive.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-01-26T11:56:11+00:00

    Ciao Nicola,

    Buongiorno, ho bisogno di traporre dei dati disposti su più colonne sul foglio principale (come da prima immagine allegata) e riportare su di un nuovo foglio (magari chiedendomi di salvarlo con nome ed in una determinata cartella) i dati cosi come sono riportati sull'immagine nr. 2 allegata.

    Quindi la mia esigenza è quella di dover creare un nuovo foglio solo con 2 colonne e che riportano le colonne chiamate ID_Fruitore e Turno.

    Spero di essere stato chiaro.

    Questi sono i dati disposti sul foglio principale.

    Questi sono i dati che dovrebbero essere salvati su di un nuovo foglio e posizionati in modo verticale per ogni ID_Fruitore.

    Ringrazio in anticipo chi mi vorrà aiutare in questo.

    P.S. fate voi se risolvere la mia esigenza con codice oppure con formula, per me va bene lo stesso.

    Quello che vi chiedo è di spiegarmi come adattare un eventuale vostro codice o formula poiché ho altri file uguali a questo e che necessitano di tirare fuori dati oltre le 2 colonne (come in questo caso).

    Cominciando con lo sfuttamento di un paio di semplice formule, prova qualcosa del genere:

    Nella cella (mettiamo) I2, immetti la formula:

    **** =INDICE(A:A;INT((RIF.RIGA(A1)+ 3 -1)/ 3 )+1)

    Nella cella J2, immetti la formula

    **** =SCARTO($E$2;I2-1;RESTO(RIF.RIGA(A1)-1; 3 ))

    Trascina le due formule in basso quanto necessario.

    Per adattare le formule per più colonne, sostituisci tutte le istanze del valore 3 nelle due formule con il numero di turni di interesse.

    Se preferiresti una soluzione VBA, chiedi pure.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-01-26T08:42:41+00:00

    Buongiorno a tutti. Avete la possibilità di aiutarmi in questa mia esigenza? Vi ringrazio e vi auguro buona giornata. Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2019-01-10T09:00:42+00:00

    Buongiorno a tutti.

    Vi chiedo la gentilezza di aiutarmi su questa mia esigenza, sto facendo varie ricerche su internet ma non riesco a capire come devo risolverela mia esigenza.

    Vi ringrazio per il tempo e l'aiuto che vorrete darmi.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento