我正在寻找一个VBA Excel宏,可以将完整的行复制到另一个工作表中。它将需要基于单元格整数值创建该行的其他重复副本。
当您要创建文档或标签的多个副本时,这在使用邮件合并时非常有用。我已经找到了几个接近的答案,但没有复制整行的答案
输入
col1 | col2 | col3 | col4
狗|喜欢|猫|1
老鼠|喜欢|坚果|3
猫|嚼|老鼠|2
输出col1 | col2 | col3 | col4
狗|喜欢|猫
老鼠|喜欢|坚果
老鼠|喜欢|坚果
老鼠|喜欢|坚果
猫|嚼|鼠
猫|嚼|鼠
输出col4中的值可能存在,对我的情况无关紧要
发布于 2012-07-17 23:03:23
假设包含数据的工作表的名称为'Sheet1',输出工作表的名称为'Sheet2‘,要复制的次数位于第D行-此代码将起作用。您首先需要修改它以满足您的需求!
Sub DuplicateRows()
Dim currentRow As Integer
Dim currentNewSheetRow As Integer: currentNewSheetRow = 1
For currentRow = 1 To 3 'The last row of your data
Dim timesToDuplicate As Integer
timesToDuplicate = CInt(Sheet1.Range("D" & currentRow).Value2)
Dim i As Integer
For i = 1 To timesToDuplicate
Sheet2.Range("A" & currentNewSheetRow).Value2 = Sheet1.Range("A" & currentRow).Value2
Sheet2.Range("B" & currentNewSheetRow).Value2 = Sheet1.Range("B" & currentRow).Value2
Sheet2.Range("C" & currentNewSheetRow).Value2 = Sheet1.Range("C" & currentRow).Value2
currentNewSheetRow = currentNewSheetRow + 1
Next i
Next currentRow
End Sub发布于 2013-06-14 00:42:52
我做了一些修改,并调整了Francis Dean的回答:
currentRow为Long,最后一行为Integer+1。然后,宏为:
Sub DuplicateRows()
Dim currentRow As Long
Dim currentNewSheetRow As Long: currentNewSheetRow = 1
For currentRow = 1 To 32768 'The last row of your data
Dim timesToDuplicate As Integer
timesToDuplicate = CInt(Worksheets("Sheet1").Range("J" & currentRow).Value)
Dim i As Integer
For i = 1 To timesToDuplicate
Worksheets("Sheet2").Range("A" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("A" & currentRow).Value
Worksheets("Sheet2").Range("B" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("B" & currentRow).Value
Worksheets("Sheet2").Range("C" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("C" & currentRow).Value
Worksheets("Sheet2").Range("D" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("D" & currentRow).Value
Worksheets("Sheet2").Range("E" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("E" & currentRow).Value
Worksheets("Sheet2").Range("F" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("F" & currentRow).Value
Worksheets("Sheet2").Range("G" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("G" & currentRow).Value
Worksheets("Sheet2").Range("H" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("H" & currentRow).Value
Worksheets("Sheet2").Range("I" & currentNewSheetRow).Value = Worksheets("Sheet1").Range("I" & currentRow).Value
currentNewSheetRow = currentNewSheetRow + 1
Next i
Next currentRow
End Sub发布于 2014-06-27 09:44:50
我调整了Francis的答案,使其只适用于当前活动的电子表格,并且只适用于选定的行。我的特定用例要求将每次复制的数量更改为1,因此"G“列被设置为1。
它仍然只适用于一组固定的列。
Sub MultiplySelectedRows()
'store reference to active sheet
Dim Source As Worksheet
Set Source = ActiveWorkbook.ActiveSheet
'create new sheet for output
Dim Multiplied As Worksheet
Set Multiplied = Sheets.Add(After:=Worksheets(Worksheets.Count))
'switch back to original active sheet
Source.Activate
Dim rng As Range
Dim lRowSelected As Long
Dim duplicateCount As Integer
Dim newSheetRow As Integer
newSheetRow = 1
For Each rng In Selection.Rows
lRowSelected = rng.Row
'Column holding number of times to duplicate each row is specified in quotes
duplicateCount = CInt(Source.Range("G" & lRowSelected).Value)
Dim i As Integer
For i = 1 To duplicateCount
'one copy statement for each column to be copied
Multiplied.Range("A" & newSheetRow).Value = Source.Range("A" & lRowSelected).Value
Multiplied.Range("B" & newSheetRow).Value = Source.Range("B" & lRowSelected).Value
Multiplied.Range("C" & newSheetRow).Value = Source.Range("C" & lRowSelected).Value
Multiplied.Range("D" & newSheetRow).Value = Source.Range("D" & lRowSelected).Value
Multiplied.Range("E" & newSheetRow).Value = Source.Range("E" & lRowSelected).Value
Multiplied.Range("F" & newSheetRow).Value = Source.Range("F" & lRowSelected).Value
'multiplier is replaced by 1 (16x1 instead of 1x16 lines)
Multiplied.Range("G" & newSheetRow).Value = 1
Multiplied.Range("H" & newSheetRow).Value = Source.Range("H" & lRowSelected).Value
Multiplied.Range("I" & newSheetRow).Value = Source.Range("I" & lRowSelected).Value
Multiplied.Range("J" & newSheetRow).Value = Source.Range("J" & lRowSelected).Value
Multiplied.Range("K" & newSheetRow).Value = Source.Range("K" & lRowSelected).Value
Multiplied.Range("L" & newSheetRow).Value = Source.Range("L" & lRowSelected).Value
newSheetRow = newSheetRow + 1
Next i
Next rng结束子对象
https://stackoverflow.com/questions/11524408
复制相似问题