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