如何使用Excel将一行拆分为多行?


9

我在Excel中有一个产品数据库,其中有数百个条目,每个条目都有1到3个“层”的定价:标准,豪华和高级。每层都有自己的SKU(在基本SKU的末尾添加了A,B或C)和价格。我的数据是这样的:

Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C
name1,      desc1,   14.95,   19.95,        , sku1A, sku1B, 
name2,      desc2,    4.95,    9.95,   12.95, sku2A, sku2B, sku2C
name3,      desc3,   49.95,        ,        , sku3A,      ,

我将如何使数据看起来像这样:

Name, Description,   SKU, Price
name1,      desc1, sku1A, 14.95
name1,      desc1, sku1B, 19.95
name2,      desc2, sku2A,  4.95
name2,      desc2, sku2B,  9.95
name2,      desc2, sku2C, 12.95
name3,      desc3, sku3A, 49.95

如果有帮助,我将把这些产品导入Magento安装。

在此先感谢您。


是否有几个相似的名称和描述?例如,两条线具有name1和,desc1但价格A,价格B,价格C等的价格不同
杰里(Jerry)

在原始数据中?不,我确定它们是独一无二的。但是,在新数据中肯定会有重复。
GreysonD

好的,我有一些想法,但事实证明,除非进行更多的操作以更正某些结果,否则它将无法正常工作。如果您很好奇,我正在尝试使用合并数据透视表,但是必须使用index / match / vlookup分别将Description字段和SKU字段拉出,这最终会使它很长。
杰里

Answers:


8

使用VBA,这些任务通常更快。实际上,我花了大约10分钟来完成设置。
我假设您的数据在A列到H列。

转到Excel » Developer » Visual Basic»在左侧窗格中打开sheet1(或)数据所在的表»在右侧窗口中插入代码»运行代码

VBA代码

1 |Sub NewLayout()
2 |    For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
3 |        For j = 0 To 2
4 |        If Cells(i, 3 + j) <> vbNullString Then
5 |            intCount = intCount + 1
6 |            Cells(i, 1).Copy Destination:=Cells(intCount, 10)
7 |            Cells(i, 2).Copy Destination:=Cells(intCount, 11)
8 |            Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12)
9 |            Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13)
10|        End If
11|        Next j
12|    Next i
13|End Sub

说明

我的意图是使代码尽可能简短,以更好地解释它。基本上,我们使用两个循环。外循环(i)用于行,内循环(j)用于价格列。

我们大量使用cells(rowNumber,columnNumber)读/写单元格。

  • 第2行| 从第2行到最后一行开始循环。我们遍历每行

  • 第3行| 从0到2开始第二个循环(实际上是3个循环,每个Price列一个)

  • 第4行| 我们使用此内部循环检查当前行和列Price A,然后Price B和最后一个循环Price C中的值。如果在Price列中找到值,则继续并复制单元格。如果没有插入价格,我们什么也不做,继续下一个价格列

  • 第5行| 计数一个计数器以知道我们已经复制了多少行,
    因此我们知道在哪一行之后我们可以复制当前行

  • 第6行| 复制名称列

  • 第7行| 复制说明列

  • 第8行| 根据当前的内部循环,复制价格A或B或C列

  • 第9行| 根据当前的内部循环,复制SKU A或B或C列

结果截图

在此处输入图片说明


1
这是太棒了!正是我所需要的。我的数据实际上比我的示例复杂一点,并且我是VBA的新手,因此您的解释会大有帮助。谢谢!
GreysonD

2

这是一个工作表功能解决方案。公式有点密集,因此请注意,但这会提供您想要的东西。

脚步:

  1. 在新表的第一行中的下方Name,输入Name对数据中第一行的直接引用。在您的示例中,您将输入=A2A2是数据中列出的名字。在下面提供的示例屏幕截图中,该公式为A8。以下所有公式将遵循屏幕截图中使用的布局。当然,您将必须更新所有范围参考以匹配您的图纸。
  2. 在下面的单元格中,输入以下公式:
    = IF(COUNTIF($ A $ 9:A9,A9)= COUNTA(OFFSET($ C $ 1:$ E $ 1,MATCH(A9,$ A $ 2:$ A $ 5,0),0)),INDEX($ A $ 2 :$ A $ 5,MATCH(A9,$ A $ 2:$ A $ 5,0)+1),A9)
    
    这基本上检查了上面列出的名称(在中A9)应有多少行,如果新表中已有的行数与此匹配,则它将移至下一个名称。否则,将添加上面名称的另一行。
    尽可能少地填写此公式(直到它返回0而不是名称)。
  3. 在下面的第一行中,Description输入以下公式并填写。
    = INDEX($ B $ 2:$ B $ 5,MATCH(A9,$ A $ 2:$ A $ 5,0))
  4. 在下面的第一行中SKU,将以下公式粘贴到公式栏中,然后按Ctrl+ Shift+ Enter
    = INDEX(OFFSET($ A $ 1:$ H $ 1,MATCH(A9,$ A $ 2:$ A $ 5,0),0),SMALL(IF(OFFSET($ F $ 1:$ H $ 1,MATCH(A9,$ A $ 2:$ A $ 5,0),0)<>“”,COLUMN($ F $ 1:$ H $ 1)),COUNTIF($ A $ 9:$ A9,$ A9)))
    这是一个数组公式;如果输入正确,公式将出现在大括号内的公式栏中。在表格中填写该公式(每个实例同样应出现在大括号中)。
  5. 类似地,在第一行下Price,粘贴以下公式代入公式栏,并输入它作为数组公式(通过按Ctrl+ Shift+ Enter)。
    = INDEX(OFFSET($ A $ 1:$ H $ 1,MATCH($ A9,$ A $ 2:$ A $ 5,0),0),SMALL(IF(OFFSET($ C $ 1:$ E $ 1,MATCH($ A9 ,$ A $ 2:$ A $ 5,0),0)<>“”,COLUMN($ C $ 1:$ E $ 1)),COUNTIF($ A $ 9:$ A9,$ A9)))
    填写,这将完成您的表格。

表格截图


令人印象深刻的公式!在这个和VBA答案之间,我几乎准备好了一切。谢谢!
GreysonD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.