Come combinare valori da più righe in una singola riga in Excel?


10

Ho un dump di dati in Excel che consiste in dati annuali dei clienti per due valori diversi. I dati sono stati forniti con una riga separata per valore per ogni anno e cliente. Cioè sembra così:

inserisci qui la descrizione dell'immagine

Sono bloccato con una riga per il cliente 1 per il valore A nel 2009 e una riga separata per il valore B per lo stesso cliente nello stesso anno.

In alcuni casi non esiste alcun valore A o valore B. Nell'esempio precedente, si può vedere che il cliente 1 non ha valore B nel 2011, quindi non è stata generata alcuna riga per questo. E, sebbene non rappresentato nell'esempio, alcuni clienti non avranno dati per nessuno dei due valori in un anno (e quindi nessuna riga per quel cliente in quell'anno). In quella situazione, manca una fila per quel cliente in quell'anno va bene.

Voglio ottenere questo in un foglio di lavoro in cui c'è una riga per entrambi i valori per ogni anno e cliente. Vale a dire, voglio che i dati siano così:

inserisci qui la descrizione dell'immagine

Qual è il modo più efficace per creare quel risultato?

Risposte:


6

Questo è VBA o una macro che puoi eseguire sul tuo foglio. È necessario premere alt+ F11per visualizzare il prompt di Visual Basic, andare alla cartella di lavoro right click - insert - modulee incollare questo codice. È quindi possibile eseguire il modulo dall'interno di VBA premendo F5. Questa macro è denominata "test"

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

Questo verrà eseguito attraverso un foglio di calcolo ordinato e combinerà righe consecutive che corrispondono sia al cliente che all'anno ed eliminerà la riga ora vuota. Il foglio di calcolo deve essere ordinato nel modo in cui lo hai presentato, clienti e anni in ordine crescente, questa particolare macro non avrà un aspetto oltre le righe consecutive .

Modifica - è del tutto possibile che il mio with statementsia completamente inutile, ma non fa male a nessuno ..

RIVISITATO 28/02/14

Qualcuno ha usato questa risposta in un'altra domanda e quando sono tornato ho pensato che questo VBA fosse scarso. L'ho rifatto -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

Rivisitato il 05/04/16

Chiesto di nuovo Come combinare i valori di più righe in una singola riga? Avere un modulo, ma hanno bisogno delle spiegazioni delle variabili e, di nuovo, è piuttosto scadente.

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

Tuttavia, a seconda del problema, potrebbe essere meglio step -1su un numero di riga, quindi nulla viene ignorato.

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub

2

Un'altra opzione:

  1. Seleziona la colonna B, premi CTRL+G-> Special-> Blanks->OK
  2. Digitare =premere , quindiCTRL+ENTER
  3. Seleziona Colonna C, premi CTRL+G-> Special-> Blanks->OK
  4. Digitare =IF(premere digitare =premere premere tipo ,premere tipo ,0)quindiCTRL+ENTER
  5. Selezionare tutti i dati e CopyePaste Special as Values
  6. Rimuovi duplicati.

MODIFICARE:

Spiegazione: Sto cercando di utilizzare l' opzione GoTo Blanks . Dopo aver selezionato gli spazi vuoti, puoi inserire la stessa formula per tutte le celle vuote selezionate. Per quanto riguarda la domanda di OP, i dati sembrano avere spazi vuoti coerenti , vale a dire: gli Value Aspazi vuoti delle colonne hanno gli stessi della CustomerIDriga non vuota sopra. Allo stesso modo gli Value Bspazi vuoti delle colonne hanno lo stesso CustomerIDvalore della riga non vuota sottostante.


Ciao zx8754. Potresti aggiungere qualche spiegazione quale sia l'idea alla base della tua soluzione?
nixda,

@nixda Spiegazione aggiunta, scusa se i passaggi erano abbastanza chiari.
zx8754,

0

Il modo più efficace per eseguire questa operazione è scaricare tutti i dati in una tabella pivot e rilasciare "Cliente" nelle etichette delle righe, quindi seguire le altre colonne. È possibile eliminare "Anno" nell'intestazione della colonna se si desidera visualizzare la suddivisione per anno

Le tabelle pivot sono disponibili in Inserisci in Excel 2010


Incontrerai problemi anche con celle che non hanno valore nella colonna B perché Excel non avrà modo di sapere che il valore in B2 e B3 è in qualche modo correlato.
xXPhenom22Xx

Devo ammettere che ho poca esperienza con le tabelle pivot, ma non credo che le tabelle pivot risolvano il problema che ho. Voglio i dati per tutti i valori per un cliente in una riga all'anno in modo da poterli manipolare (ad es. Creare una colonna aggiungendo valore A + valore B), non solo cambiare il modo in cui li sto visualizzando tramite una tabella pivot. Voglio letteralmente strutturare i dati in modo diverso nel foglio di lavoro.
Greg R.

Sì, sarebbe difficile a meno che tu non abbia sempre avuto colonne alternate con dati mancanti come fai nell'esempio. Se questo non è il caso, allora non c'è modo per Excel di fare logicamente anche quello che vuoi.
xXPhenom22Xx

Greg - puoi risolvere il problema in questo modo: una volta che si trova nella tabella pivot nel formato desiderato, copialo dalla tabella pivot in un'altra posizione (stesso foglio o altro) - e quindi puoi manipolarlo come preferisci , inclusa l'aggiunta di colonne, formule, ecc.
yosh m

0

Ecco i passaggi per la creazione di una tabella separata con i dati condensati.

  1. Copia l'intera tabella e incollala su un nuovo foglio.
  2. Selezionare la nuova tabella e rimuovere i duplicati (barra multifunzione -> Rimuovi duplicati) nelle colonne Customere Year. Ciò fornirà la struttura per la tabella condensata.
  3. In B2 (la prima voce per Value A) inserire quanto segue:

    =IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")

    Immettere la formula come formula di matrice premendo Ctrl+ Shift+ Enter.

  4. Riempi la formula nella colonna. Quindi riempi per riempire anche la Value Bcolonna. Ecco!

Alcune note:

  • Ovviamente dovrai adattare gli indirizzi per adattarli ai tuoi dati. Per riferimento, Foglio1 sono i dati originali nelle colonne da A a D.
  • Suppongo che i tuoi dati (o intestazioni) inizino dalla riga 1. Questo è probabilmente vero se si tratta di un dump di dati. La formula dovrà essere modificata in caso contrario.
  • Suppongo che la tua tabella abbia meno di un milione di righe. Se in qualche modo ne hai di più, cambia la 1000000s nella formula in qualcosa di più grande del tuo numero di righe.
  • Se la tua tabella ha molte migliaia di righe (oltre 100.000), potresti prendere in considerazione l'utilizzo di una soluzione VBA, poiché le formule di array possono essere impantanate con array di grandi dimensioni.

0

Tutti usano molto codice VBA o funzioni complicate per questo. Ho un metodo che richiede un secondo per essere implementato ma è molto più comprensibile e molto facile da regolare a seconda di varie altre possibilità.

Nell'esempio che hai dato sopra, incolla queste (4) funzioni nelle celle, E2, F2, G2 e H2, rispettivamente (le celle di riferimento delle funzioni F&G sopra):

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

Trascina queste formule fino in fondo, se necessario. Genera una singola riga di dati ogni volta che sono presenti 2 righe, lasciando inalterate le singole righe. Incolla i valori speciali (per rimuovere le formule) delle colonne EFGH altrove e ordinali per cliente per rimuovere tutte le righe extra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.