2012-02-28 22:05:49 +0000 2012-02-28 22:05:49 +0000
10
10

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

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

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 c'è nessun valore A o valore B. Nell'esempio sopra, potete vedere che il cliente 1 non ha nessun valore B nel 2011, quindi non è stata generata nessuna riga per quello. E, sebbene non sia 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, la mancanza di una riga per quel cliente in quell'anno va bene.

Voglio ottenere questo in un foglio di lavoro dove c'è una riga per entrambi i valori per ogni anno e cliente. Cioè, voglio che i dati assomiglino a questo:

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

Risposte (5)

6
6
6
2012-02-29 12:18:49 +0000

Questo è VBA, o una macro che potete eseguire sul vostro foglio. Dovete premere alt+F11 per far apparire il prompt di Visual Basic for Application, andare nella vostra cartella di lavoro e right click - insert - module e incollarvi questo codice. Potete poi eseguire il modulo dall'interno di VBA premendo F5. Questa macro si chiama “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

Questa eseguirà un foglio elettronico ordinato e combinerà righe consecutive che corrispondono sia al cliente che all'anno e cancellerà la riga ora vuota. Il foglio di calcolo deve essere ordinato nel modo in cui lo avete presentato, clienti e anni in ordine crescente, questa particolare macro non guarderà oltre le righe consecutive.

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

REVISITED 02/28/14

Qualcuno ha usato questa risposta in un'altra domanda e quando sono tornato indietro ho pensato che questo VBA fosse povero. 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

Revisited 05/04/16

Chiesto di nuovo Come combinare valori da più righe in una sola riga? Ho un modulo, ma ho bisogno di spiegare le variabili e di nuovo, è piuttosto povero.

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 -1 su un numero di riga in modo che nulla venga saltato.

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
2
2
2013-07-17 18:08:36 +0000

Un'altra opzione:

  1. Selezionare la colonna B, premere CTRL+G -> Special-> Blanks -> OK
  2. Digitare = premere ↑, poi CTRL+INVIO
  3. Selezionare la colonna C, premere CTRL+G -> Special-> Blanks -> OK
  4. Digitare =IF( premere ← digitare = premere ← premere ↓ digitare , premere ↓ digitare ,0) poi CTRL+ENTER
  5. Selezionare tutti i dati e Copy e Paste Special as Values
  6. Rimuovete i duplicati.

EDIT:

spiegazione: Sto cercando di usare l'opzione GoTo Blanks . Una volta che hai selezionato gli spazi vuoti, allora puoi inserire la stessa formula per tutte le celle vuote selezionate. Per quanto riguarda la domanda di OP, i dati sembrano avere degli spazi vuoti consistenti, cioè: gli spazi vuoti di colonna Value A hanno lo stesso CustomerID della riga precedente non vuota. Allo stesso modo Value B spazi vuoti di colonna hanno lo stesso CustomerID di sotto della riga non vuota.

0
0
0
2012-02-29 18:12:36 +0000

Ecco i passi per creare una tabella separata con i dati condensati.

  1. Copia l'intera tabella e incollala su un nuovo foglio.
  2. Selezionate la vostra nuova tabella e rimuovete i duplicati (barra multifunzione Dati -> Rimuovi duplicati) sulle colonne Customer e Year. Questo fornirà la struttura per la tabella condensata.
  3. In B2 (la prima voce per Value A) inserite quanto segue:

  4. Riempite la formula lungo la colonna. Poi riempite per riempire anche la colonna Value B. Voilà!

Qualche nota:

  • Naturalmente dovrai adattare gli indirizzi ai tuoi dati. Per riferimento, Sheet1 sono i dati originali nelle colonne da A a D.
  • Sto assumendo che i tuoi dati (o intestazioni) inizino dalla riga 1. Questo è probabilmente vero se questo è un dump di dati. La formula dovrà essere aggiustata se questo non è il caso.
  • Sto assumendo che la tua tabella abbia meno di un milione di righe. Se in qualche modo ne avete di più, cambiate gli 1000000 nella formula con qualcosa di più grande del vostro numero di righe.
  • Se la tua tabella ha molte migliaia di righe (100.000+), potresti voler considerare l'uso di una soluzione VBA invece, dato che le formule di matrice possono impantanarsi con grandi matrici.
0
0
0
2016-07-15 16:44:30 +0000

Tutti usano un sacco di codice VBA o funzioni complicate per questo. Io ho un metodo che richiede un secondo per essere implementato, ma è molto più comprensibile e molto facile da adattare in base a 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 tanto in basso quanto necessario. Genera una singola riga di dati ogni volta che sono presenti 2 righe, lasciando inalterate le singole righe. Incollate i valori speciali (per rimuovere le formule) delle colonne E-F-G-H altrove e ordinateli per cliente per rimuovere tutte le righe extra.

0
0
0
2012-02-28 22:15:04 +0000

Il modo più efficace per farlo è quello di scaricare tutti i dati in una tabella pivot e far cadere ‘Cliente’ nelle etichette di riga e poi seguire con le altre colonne. Potete inserire l’“Anno” nell'intestazione della colonna se volete vedere la ripartizione per anno

Le tabelle pivot si trovano sotto Inserisci in Excel 2010