首页 > 解决方案 > 使用偏移值复制/粘贴循环

问题描述

我们的大部分订单都通过我们的原始包装团队,他们使用这种合并格式来包装每个客户的订单。
在此处输入图像描述

一个新团队要求每个项目位于单独的一行,因此每个销售订单需要五行,一个用于我们销售的每种类型的小部件。他们需要它看起来像这样:
在此处输入图像描述

我记录了复制/粘贴命令的宏来记录第一个订单:

Sub GrabOrders()
'
' GrabOrders Macro
'

'
    Sheets("Raw Data").Select
    Range("B2").Select
    Selection.Copy
    Sheets("Ship Sheet").Select
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.AutoFill Destination:=Range("A2:A6"), Type:=xlFillDefault
    Range("A2:A6").Select
    Sheets("Raw Data").Select
    Range("F1:J1").Select
    Selection.Copy
    Sheets("Ship Sheet").Select
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Sheets("Raw Data").Select
    Range("F2:J2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Ship Sheet").Select
    Range("H2").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
End Sub

我现在需要要复制的单元格(在原始格式选项卡上)向下移动一行到下一个订单,并在新格式选项卡上粘贴以开始向下五行,以免覆盖前一个数据命令。

项目名称将保持固定(在原始选项卡上的 F1、G1 等),而其他要复制的单元格将移动。我需要这个循环,直到它到达一个空白的销售订单单元格。

标签: excelvbaloopscopypaste

解决方案


您应该首先删除代码中的所有选择语句。

   Range("B2").Select
   Selection.Copy

可以简化为

Sheets("Raw Data").Range("B2").Copy 

当您编写循环时,您需要从定义数据所在的范围开始。当您阅读有关避免选择语句的内容时,您将了解有关如何执行此操作的更多信息。您将想要定义您从中提取的数据的范围并避免重写您的代码,我将在循环中定义另一个最后一行,以说明您选择使用的自动填充命令。

我相信以下内容适用于您想要实现的目标,但您应该尝试返回并删除选择语句。

Sub GrabOrders()

Dim lrdata As Long
lrdata = Sheets("Raw Data").Range("A" & Rows.Count).End(xlUp).Row ' choose whichever column contains the last row of your data here
Dim i As Long

For i = 2 To lrdata ' for 2 to the number of rows in our data

Dim lastrow2 As Long
lastrow2 = Sheets("Ship Sheet").Range("a" & Rows.Count).End(xlUp).Row + 1 ' get the last row in your ship sheet then add one to avoid copying over your data

' from here, every instace of "2" you are going to change it to " & i "

Sheets("Raw Data").Select
    Sheets("Raw Data").Range("B" & i).Select
    Selection.Copy
    Sheets("Ship Sheet").Select
    Sheets("Ship Sheet").Range("A" & lastrow2).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.AutoFill Destination:=Range("A" & lastrow2, "A" & lastrow2 + 4), Type:=xlFillDefault ' plus five to your last row since there are only 5 colors you need to get data for
    Sheets("Raw Data").Select
    Range("F1:J1").Select
    Selection.Copy
    Sheets("Ship Sheet").Select
    Range("G" & lastrow2).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Sheets("Raw Data").Select
    Sheets("Raw Data").Range("F" & i, "J" & i).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Ship Sheet").Select
    Sheets("Ship Sheet").Range("H" & lastrow2).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
Next i

End Sub

推荐阅读