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

Hoe combineer ik waarden uit meerdere rijen in één enkele rij in Excel?

Ik heb een gegevensdump in Excel die bestaat uit jaarlijkse klantgegevens voor twee verschillende waarden. De gegevens werden voorzien van een aparte rij voor de waarde voor elk jaar en elke klant. Het ziet er dus als volgt uit:

Ik zit opgescheept met een rij voor klant 1 voor waarde A in 2009 en een separate rij voor waarde B voor same klant in same jaar.

In sommige gevallen is er geen Waarde A of Waarde B. In het voorbeeld hierboven kun je zien dat Klant 1 geen Waarde B heeft in 2011, dus daar is geen rij voor gegenereerd. En, hoewel niet weergegeven in het voorbeeld, zullen sommige klanten geen gegevens hebben voor een van beide waarden in een jaar (en dus geen rij voor die klant in dat jaar). In die situatie is het ontbreken van een rij voor die klant in dat jaar prima.

Ik wil dit in een werkblad krijgen waar er één rij is voor beide waarden voor elk jaar en elke klant. Ik bedoel, ik wil dat de gegevens er zo uitzien:

Wat is de meest effectieve manier om dat resultaat te krijgen?

Antwoorden (5)

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

Dit is VBA, of een macro die je op je werkblad kunt uitvoeren. U moet alt+F11 indrukken om de Visual Basic for Application prompt op te roepen, ga naar uw werkmap en right click - insert - module en plak daar deze code in. Vervolgens kunt u de module vanuit VBA uitvoeren door op F5 te drukken. Deze macro heet “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

Hiermee doorloop je een gesorteerd spreadsheet en combineer je opeenvolgende rijen die zowel met de klant als met het jaar overeenkomen en verwijder je de nu lege rij. De spreadsheet moet gesorteerd zijn zoals je hem hebt gepresenteerd, klanten en jaren oplopend, deze specifieke macro kijkt niet verder dan opeenvolgende rijen.

Bewerken - het is heel goed mogelijk dat mijn with statement helemaal niet nodig is, maar het schaadt niemand…

REVISITED 02/28/14

Iemand gebruikte dit antwoord in een andere vraag en toen ik terugging vond ik deze VBA slecht. Ik heb het opnieuw gedaan -

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

Opnieuw gevraagd Hoe combineer je waarden uit meerdere rijen in een enkele rij? Heb een module, maar heb de variabelen nodig om uit te leggen en weer is het vrij slecht.

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
  • *

Afhankelijk van het probleem kan het echter beter zijn om step -1 op een rijnummer te zetten, zodat niets wordt overgeslagen.

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

Een andere optie:

  1. Selecteer kolom B, druk op CTRL+G -> Special-> Blanks -> OK
  2. Type = druk op ↑, dan CTRL+ENTER
  3. Selecteer kolom C, druk op CTRL+G -> Special-> Blanks -> OK
  4. Type =IF( druk op ← type = druk op ← type , type ,0) druk op ↓ type Copy dan CTRL+ENTER
  5. Selecteer alle gegevens en Paste Special as Values en Value A
  6. Verwijder duplicaten.

EDIT:

Uitleg: Ik probeer gebruik te maken van GoTo Blanks optie. Als u eenmaal lege cellen hebt geselecteerd, kunt u dezelfde formule invoeren voor alle geselecteerde lege cellen. Wat betreft OP’s vraag, de gegevens lijken consistent lege cellen te hebben, d.w.z.: CustomerID kolom lege cellen hebben dezelfde Value B als boven niet lege rij. Op dezelfde manier hebben CustomerID kolom blanco’s dezelfde 0x6& als onder een niet blanco rij.

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

Hier zijn de stappen voor het maken van een aparte tabel met de gecondenseerde gegevens.

  1. Kopieer je hele tabel en plak hem op een nieuw blad.
  2. Selecteer uw nieuwe tabel en verwijder doublures (Gegevenslint -Doublures verwijderen) in de kolommen Customer en Year. Dit zal het kader vormen voor de gecondenseerde tabel.
  3. In B2 (de eerste vermelding voor Value A) voert u het volgende in:

  4. Vul de formule onderaan de kolom. Vul dan over om ook de Value B kolom te vullen. Voila!

Een paar aantekeningen:

  • Je zult natuurlijk de adressen moeten aanpassen aan je gegevens. Ter referentie, Blad1 is de originele data in kolommen A tot en met D.
  • Ik ga ervan uit dat je data (of headers) beginnen bij Rij 1. Dit is waarschijnlijk waar als dit een data dump is. De formule zal moeten worden aangepast als dit niet het geval is.
  • Ik ga ervan uit dat je tabel minder dan een miljoen rijen heeft. Als je er op de een of andere manier meer hebt, verander dan de 1000000s in de formule in iets dat groter is dan je aantal rijen.
  • Indien uw tabel vele duizenden rijen heeft (100.000+), kunt u overwegen om in plaats daarvan een VBA oplossing te gebruiken aangezien array formules vast kunnen lopen met grote arrays.
0
0
0
2016-07-15 16:44:30 +0000

Iedereen gebruikt hiervoor een hoop VBA code of ingewikkelde functies. Ik heb een methode die een seconde kost om uit te voeren, maar die veel begrijpelijker is en heel gemakkelijk aan te passen afhankelijk van diverse andere mogelijkheden.

In het voorbeeld dat je hierboven hebt gegeven, plak je deze (4) functies in de cellen, respectievelijk E2, F2, G2 en H2 (de F&G functies verwijzen naar cellen hierboven):

=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, ""))

Sleep deze formules zo ver naar beneden als nodig is. Het genereert een enkele rij gegevens telkens als er 2 rijen aanwezig zijn, waarbij enkele rijen ongemoeid worden gelaten. Plak speciaal de waarden (om de formules te verwijderen) van de kolommen E-F-G-H elders en sorteer ze op klant om alle extra rijen te verwijderen.

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

De meest effectieve manier om dit te doen is om alle gegevens in een draaitabel te dumpen en ‘Klant’ in rijlabels te zetten, gevolgd door de andere kolommen. U kunt het ‘Jaar’ in de kolomkop laten vallen als u de uitsplitsing per jaar wilt zien

Draaitabellen vindt u onder Invoegen in Excel 2010