excel - 根据单元格包含的内容插入多行,然后填充它们
问题描述
我有以下情况
1 Type 1 Data 1 Data 2 Data 3 Data 4
2 Type 1 Data 5 Data 6 Data 7 Data 8
3 Type 2 Data 9 Data 10 Data 11 Data 12
etc.
其中第一列是索引列,第三列是空的。(在第 3 列和数据开始的列之间还有 5 个空列。数据实际上从第 9 列开始,但出于显示目的,我这样写)。
我要做的是,根据B列的单元格,如果是Type 1,在下面添加5个空行,如果是Type 2,在下面添加8个空行。换句话说,类型 1 行有 5 个“子”行,类型 2 行有 8 个“子”行
现在我需要填写这些行。我有第二张表,其中列出了类型 1 的 5 个项目和类型 2 的 8 个项目:
item 1.1 item 2.1
item 1.2 item 2.2
item 1.3 item 2.3
item 1.4 item 2.4
item 1.5 item 2.5
item 2.6
item 2.7
item 2.8
我需要它看起来像这样(下面的空行仅用于此页面上的显示目的,实际工作表中不能有任何空行):
1 Type 1 Data 1 Data 2 Data 3 Data 4
2 Item 1.1 1 Data 2 Data 4
3 Item 1.2 1 Data 2 Data 4
4 Item 1.3 1 Data 2 Data 4
5 Item 1.4 1 Data 2 Data 4
6 Item 1.5 1 Data 2 Data 4
7 Type 1 Data 5 Data 6 Data 7 Data 8
8 Item 1.1 7 Data 6 Data 8
10 Item 1.2 7 Data 6 Data 8
11 Item 1.3 7 Data 6 Data 8
12 Item 1.4 7 Data 6 Data 8
13 Item 1.5 7 Data 6 Data 8
14 Type 2 Data 9 Data 10 Data 11 Data 12
15 item 2.1 14 Data 10 Data 12
16 item 2.2 14 Data 10 Data 12
17 item 2.3 14 Data 10 Data 12
18 item 2.4 14 Data 10 Data 12
19 item 2.5 14 Data 10 Data 12
20 item 2.6 14 Data 10 Data 12
21 item 2.7 14 Data 10 Data 12
22 item 2.8 14 Data 10 Data 12
etc.
请注意,已经进行了重新索引,并且第三列现在已经填充了“父”索引(父索引除外,如图所示,它将保持为空)。
关于B列的分布,通常我一共拥有所有类型1,然后是类型2。(作为这篇文章的设置)。
我已经做了几个月的宏,但我无法为此想出一个宏,因为重新索引和调整大小真的让我感到困惑。
提前致谢。
解决方案
尝试:
Sub test3()
Dim i As Long, j As Long, LastRow1 As Long, No As Long, LastRow2 As Long, Times As Long
Dim sType As String, Data As String, Data1 As String, Data2 As String, Data3 As String
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
Set ws2 = ThisWorkbook.Worksheets("Sheet2")
LastRow1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
Number = 1
For i = 2 To LastRow1
No = ws1.Range("A" & i).Value
sType = ws1.Range("B" & i).Value
Data = ws1.Range("C" & i).Value
Data1 = ws1.Range("D" & i).Value
Data2 = ws1.Range("E" & i).Value
Data3 = ws1.Range("F" & i).Value
If i = 2 Then
LastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
Else
LastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
End If
ws2.Range("A" & LastRow2 + 1).Value = Number
ws2.Range("B" & LastRow2 + 1).Value = sType
ws2.Range("D" & LastRow2 + 1).Value = Data
ws2.Range("E" & LastRow2 + 1).Value = Data1
ws2.Range("F" & LastRow2 + 1).Value = Data2
ws2.Range("G" & LastRow2 + 1).Value = Data3
If Right(sType, 1) = 1 Then
Times = 5
ElseIf Right(sType, 1) = 2 Then
Times = 8
End If
For j = 1 To Times
LastRow2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
ws2.Range("A" & LastRow2 + 1).Value = Number + j
ws2.Range("B" & LastRow2 + 1).Value = "Item " & Right(sType, 1) & "." & j
ws2.Range("C" & LastRow2 + 1).Value = Number
ws2.Range("E" & LastRow2 + 1).Value = Data1
ws2.Range("G" & LastRow2 + 1).Value = Data3
Next j
Number = Number + 6
Next i
End Sub