Excel - 将数据从多行转换为具有匹配值的单列

时间:2018-03-14 11:05:36

标签: excel vba excel-vba excel-formula transpose

好的,我有一些数据要从多行转换为多列。

我的输入数据看起来很像 -

+----------+----------------+-----------------+
|   SKU    | Attribute Name | Attribute Value |
+----------+----------------+-----------------+
| Product1 | Colour         | Black           |
| Product1 | Size           | Large           |
| Product1 | Height         | 20cm            |
| Product1 | Width          | 40cm            |
| Product2 | Colour         | Red             |
| Product2 | Width          | 30cm            |
| Product2 | Size           | Large           |
| Product3 | Height         | 25cm            |
| Product3 | Width          | 30cm            |
| Product3 | Length         | 90cm            |
| Product3 | Weight         | 5kg             |
| Product3 | Size           | Large           |
| Product3 | Colour         | Blue            |
+----------+----------------+-----------------+

我想要实现的是这样的输出 -

+----------+--------+--------+--------+-------+--------+-------+
|   SKU    | Colour | Height | Length | Size  | Weight | Width |
+----------+--------+--------+--------+-------+--------+-------+
| Product1 | Black  | 20cm   |        | Large |        | 40cm  |
| Product2 | Red    |        |        | Large |        | 30cm  |
| Product3 | Blue   | 25cm   | 90cm   | Large | 5kg    | 30cm  |
+----------+--------+--------+--------+-------+--------+-------+

我已经尝试过数据透视表,但是你只能返回数值,而不是我正在寻找的文本值。

我知道我可以使用一些查找值并填充它们来实现它,但我觉得应该有一种更简单的方法来实现这一点。也许这是在数据库而不是电子表格中实现的更好的东西。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用Powerquery在̶5̶̶s̶t̶e̶p̶s̶4步骤中执行此操作。这是针对2016年内置的,以及来自Microsoft的2013年免费插件(或2010 Professional Plus with Software Assurance)。请参阅信息https://www.microsoft.com/en-gb/download/details.aspx?id=39379

优点是您可以轻松地向源添加行,只需刷新查询。

1)您选择范围内的任何单元格,然后在2016年获取&转换选项卡,早期版本使用Powerquery选项卡,从表中选择数据。将弹出一个窗口,其中包含您的数据范围:

Step 1

2)变换>枢轴柱> “值”列中“属性值”的“属性名称”列(使用高级选项选择“不聚合”)

Pivot

3)将列拖动到所需的排列

Column order

4)主页>关闭并加载到工作表

这是没有列重新排序的版本

Image

编辑:

感谢@Ron Rosenfeld提醒我,真正的 null 值不需要替换为空白,因为它们在写入工作表时会显示为空白。

所以删除了这一步:

4)突出显示列以替换空值并转换为>替换值>和

要查找的值:null

替换为:

Find and replace nulls

答案 1 :(得分:0)

您可以使用帮助列执行此操作,然后使用index + match匹配它。并不像你想象的那么简单,但确实有效。

1)为您的数据添加帮助栏(称之为'助手')。 =concat(SKU,'Attribute Name')

2)使用数据透视表获取行中唯一的SKU列表,以便在数据更改后轻松更新。 (我假设这是在A列中,值从第4行开始)。

3)使用另一个数据透视表在另一个数据透视表旁边的列中获取唯一的属性列表。然后你有结果的结构。 (我假设第一个值在B3中)。

4)索引匹配表=index('Attribute Value', match(concat($A4,B$3),'Helper',0))

的值

请注意,这只适用于SKU和属性的每个组合都是唯一的。

答案 2 :(得分:0)

这假设数据在 A C 列中

Sub croupier()
    Dim i As Long, N As Long, vA As String, vB As String, vC As String
    Dim rw As Long, cl As Long

'                   setup column headers

    Columns(2).SpecialCells(2).Offset(1).Copy Range("D1")
    Columns(4).RemoveDuplicates Columns:=1, Header:=xlNo
    Columns(4).SpecialCells(2).Copy
    Range("E1").PasteSpecial Transpose:=True
    Columns(4).SpecialCells(2).Clear

'                   setup row headers

    Columns(1).SpecialCells(2).Copy Range("D1")
    Columns(4).RemoveDuplicates Columns:=1, Header:=xlYes

'                    deal the data

    N = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 2 To N
        vA = Cells(i, 1)
        vB = Cells(i, 2)
        vC = Cells(i, 3)
        cl = Rows(1).Find(what:=vB, after:=Range("A1")).Column
        rw = Columns(4).Find(what:=vA, after:=Range("D1")).Row
        Cells(rw, cl) = vC
    Next i
End Sub

enter image description here