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

Vba Excel-将数据从多行转换为具有匹配值的单列,vba,excel,excel-formula,transpose,Vba,Excel,Excel Formula,Transpose,好的,我有一些数据要从多行转换成多列 我的输入数据大致如下所示- +----------+----------------+-----------------+ | SKU | Attribute Name | Attribute Value | +----------+----------------+-----------------+ | Product1 | Colour | Black | | Product1 | Size

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

我的输入数据大致如下所示-

+----------+----------------+-----------------+
|   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  |
+----------+--------+--------+--------+-------+--------+-------+
我想要实现的是这样的输出-

+----------+----------------+-----------------+
|   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  |
+----------+--------+--------+--------+-------+--------+-------+
我尝试了Pivot表,但您只能返回数值,而不是我正在寻找的文本值

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


非常感谢您的帮助。

您可以使用helper列完成此操作,然后使用index+match进行匹配。不像你想象的那么简单,但确实有效

1) 将helper列添加到数据中(称之为“helper”)<代码>=concat(SKU,“属性名称”)

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

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

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


但请注意,这仅在SKU和属性的每个组合都是唯一的情况下才有效。

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

1) 将helper列添加到数据中(称之为“helper”)<代码>=concat(SKU,“属性名称”)

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

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

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


但请注意,这仅在SKU和属性的每个组合都是唯一的情况下才有效。

您可以使用Powerquery在“5”s“t”e“p”s“4个步骤中完成此操作。这是2016年的内置软件,从2013年起在wards(或2010 Professional Plus,带软件保证)上由Microsoft免费提供。参见信息

优点是您可以轻松地将行添加到源中,并且只需刷新查询即可

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

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

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

4) 主页>关闭并加载到图纸

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

编辑:

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

因此,这一步骤被删除:

4) 高亮显示要在中替换空值的列,然后转到变换>替换值>和

要查找的值:null

替换为:


使用Powerquery,您可以在4个步骤中完成此操作。这是2016年的内置软件,从2013年起在wards(或2010 Professional Plus,带软件保证)上由Microsoft免费提供。参见信息

优点是您可以轻松地将行添加到源中,并且只需刷新查询即可

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

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

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

4) 主页>关闭并加载到图纸

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

编辑:

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

因此,这一步骤被删除:

4) 高亮显示要在中替换空值的列,然后转到变换>替换值>和

要查找的值:null

替换为:


这假设数据在AC列中:

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

这假设数据在AC列中:

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

您是否可以将此数据加载到Access中?有一个非常简单的规范化查询,可用于在SQL中生成所需的输出。此外,我认为这可以通过pivot表实现,我只是不知道如何实现。如果您有Excel 2010/2013,您可以使用
Power Query
(一个免费的MS插件),或者在2016年
数据-->获取并转换为“pivot”在
属性名称
列上,选择值的
不聚合
,是否可以将此数据加载到Access中?有一个非常简单的规范化查询,可用于在SQL中生成所需的输出。此外,我认为这可以通过pivot表实现,我只是不知道如何实现。如果您有Excel 2010/2013,您可以使用
Power Query
(一个免费的MS插件),或者在2016年
数据-->获取并转换
属性名称
列上的“pivot”,并在2016年为找到的值选择
不聚合
,空值是真正的空值。当我结束查询时,工作表中的这些点中有空单元格