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

如何在Excel中把多行的值合并成单行?

我在Excel中有一个数据转储,其中包括两个不同数值的年度客户数据。提供的数据中,每一年和客户都有单独的一行数值。即,它看起来像这样。

我在2009年为客户1提供了一行价值A的数据 而在同年为同一客户提供了另一行价值B的数据。

在某些情况下,没有价值A或价值B。在上面的例子中,你可以看到客户1在2011年没有价值B,所以没有为其生成记录。虽然在这个例子中没有体现出来,但是有些客户在某一年中没有任何一个值的数据(因此在那一年中没有该客户的记录)。在这种情况下,缺少该客户在该年的记录就可以了。

我想把它放到一个工作表中,在这个工作表中,每个年份和客户的两个值都有一行。也就是说,我想让数据看起来像这样。

要得到这样的结果最有效的方法是什么?

答案 (5)

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

这是VBA,或者说你可以在你的工作表上运行的宏。你必须按alt+F11键弹出Visual Basic for Application的提示,进入你的工作簿和right click - insert - module,然后把这段代码粘贴在那里。然后你可以在VBA内按F5键运行这个模块。这个宏名为 “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

这将运行一个排序的电子表格,并合并符合客户和年份的连续行,并删除现在的空行。电子表格必须按照你所提供的方式排序,客户和年份升序,_这个特殊的宏不会查看连续行以外的内容。

编辑–我的with statement完全有可能是完全不需要的,但它不会伤害任何人……

REVISITED 02/28/14

有人在另一个【问题】(https://superuser.com/questions/709091/how-to-combine-values-from-multiple-rows-into-a-single-row-using-module?lq=1)中使用了这个答案,当我回去的时候,我觉得这个VBA很差。我重新做了 -

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

再问一次 如何将多行的值组合成一行?有一个模块,但需要变量解释 ,又很差。

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

不过,根据问题的不同,可能在行号上step -1更好,这样就不会有什么东西被跳过。

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

0x1& * *
2
2
2
2013-07-17 18:08:36 +0000

另一个选项。

1.选择B列,按CTRL+G -/> Special-/> Blanks -/> OK 2. 输入0x6并按↑,然后CTRL+ENTER 3. 选择C列,按CTRL+G -> =-/> Special -> Blanks 4. 输入OK按←键输入=IF(按←键输入↓键输入=按↓键输入,然后CTRL+ENTER 5. 选择所有数据和,0)Copy 6. 删除重复的数据。

编辑:

解释:我正在尝试使用 GoTo Blanks 选项。一旦你选择了空白单元格,那么你就可以为所有选择的空白单元格输入相同的公式。关于OP的问题,数据看起来像有_一致的空白,即:Paste Special as Values列空白与上面的非空白行有相同的Value A。同样地,CustomerID列空白与下面的非空白行有相同的Value B

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

下面是用浓缩的数据创建一个单独的表格的步骤。

1.复制整个表格并粘贴到新的工作表上。 2. 选择您的新表,并在列CustomerYear上删除重复(数据功能区->删除重复)。这将为精简表提供框架。 3. 在B2(Value A的第一个条目)中输入以下内容。

  1. 将公式填入列下。然后再填入Value B列。瞧!

一些注意事项。

当然,你需要调整地址以适应你的数据。 - 我假设你的数据(或标题)是从第1行开始的。 如果这是数据转储,这可能是真的。如果不是这样的话,就必须调整公式。 - 我假设你的表的行数少于一百万行。如果你的表的行数超过了这个数,请将公式中的1000000s改为大于你的行数。 - 如果你的表有很多千行(100,000+),你可能要考虑使用VBA解决方案,因为数组公式可能会被大数组拖累。

0
0
0
2016-07-15 16:44:30 +0000

大家都在用大量的VBA代码或复杂的函数来实现。我有一个方法,它需要一秒钟的时间来实现,但更容易理解,而且非常容易根据其他各种可能性来调整。

在你上面给出的例子中,将这(4)个函数分别粘贴到E2、F2、G2和H2这几个单元格中(F&G函数参考上面的单元格):

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

将这些公式根据需要向下拖动。每次出现2行时都会生成单行数据,单行不受影响。将E-F-G-H列的值(删除公式)特别粘贴到其他地方,并按客户排序,以删除所有多余的行。

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

最有效的方法是将所有数据转储到一个数据透视表中,并将 “客户 "放入行标签中,然后用其他列进行跟进。如果你想查看按年份划分的数据,可以将 "年份 "放入列头

数据透视表可以在Excel 2010中的插入下找到。