【问题标题】:Copy/Paste Loop with offset values使用偏移值复制/粘贴循环
【发布时间】:2020-01-21 16:36:17
【问题描述】:

我们的大部分订单都经过我们原来的包装团队,他们使用这种合并格式来包装每个客户的订单。

新团队要求每件商品位于单独的一行,因此每个销售订单需要五行,用于我们销售的每种类型的小部件。他们需要它看起来像这样:

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

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 等),而其他要复制的单元格将移动。我需要这个循环,直到它到达一个空白的销售订单单元格。

【问题讨论】:

  • 你应该阅读How to avoid Select来提高你的效率。
  • 我们这里缺少的是信息。例如,数据是否总是在这些精确范围内?您能否重新排列数据以使复制和粘贴更容易?为什么不使用内置的 Excel 引用?我们并不真正理解这个问题,所以很难得到答案。

标签: excel vba loops copy paste


【解决方案1】:

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

   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

【讨论】:

  • 这非常有效。感谢您的帮助,@roses56
  • 我也感谢其他人的反馈。从这一切中获益良多。
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2016-11-09
  • 2019-05-20
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多