有条件地在Excel中复制行

时间:2017-08-17 08:01:58

标签: excel vba excel-vba parent-child

我有一个需要转换为父子列表的Excel文章列表。每篇文章具有相同的MPN和/或相同的名称,仅例如大小或颜色不同。 该列表如下所示:

MPN      name   size
1        foo    S
1        foo    M
1        foo    L
2        bar    S
2        bar    M
2        bar    XL

我自己插入了cols ID和pID,以便能够实现以下列表:

ID pID  MPN      name   size
1       1        foo
2  1    1        foo    S    
3  1    1        foo    M
4  1    1        foo    L
5       2        bar
6  5    2        bar    S  
7  5    2        bar    M
8  5    2        bar    L
9  5    2        bar    XL

因此,对于具有相同MPN(或名称)的所有行,复制块上方的第一行,并将新行的ID放入包含相同MPN的以下行的pID列中。

ID实际上是一个字符串,因此它们不必是顺序的。如果它更容易实现,比如......

ID pID  MPN      name   size
1       1        foo  
1S 1    1        foo    S
1M 1    1        foo    M
1L 1    1        foo    L

...也适用于我,基本上是CONCATENATE()pID和大小。

这样的事情可以用VBA完成吗?

1 个答案:

答案 0 :(得分:0)

Sub ConditionallyDuplicateRows()
Dim lRw As Long

Application.ScreenUpdating = False

Range("B1").EntireColumn.Insert
Range("A1").EntireColumn.Insert

Range("A1").Value = "ID"
Range("B1").Value = "pID"
Range("C1").Value = "MPN"

lRw = Range("B" & Rows.Count).End(xlUp).Row - 1

For i = lRw To 1 Step -1
    If Range("B" & i).Value <> Range("B" & i + 1).Value Then
       Range("B" & i).Offset(1).EntireRow.Insert
       'New MPN
       Range("B" & i).Offset(1, 1).Value = Range("B" & i + 2).Value
       'New Name
       Range("B" & i).Offset(1, 2).Value = Range("B" & i + 2).Offset(, 2).Value

       Range("B" & i).Offset(2, 1).Value = Range("B" & i).Offset(2).Value
    Else
        Range("B" & i).Offset(1, 1).Value = Range("B" & i + 1).Value
    End If
Next i

lRw = Range("C" & Rows.Count).End(xlUp).Row

With Range("A2:A" & lRw)
    .Formula = "=C2&E2"
    .Value = .Value
End With

Application.ScreenUpdating = True

End Sub