为一行运行的代码创建一系列行的循环

时间:2017-08-22 23:54:11

标签: excel vba excel-vba loops range

我正在构建一个宏,它将通过从另一个工作表(名为" CW33 17& #34)。我已经构建了为源表单行运行的代码,因此它只为一行创建报表(每行代表一个订单)。我想要一个行的报告,所以我需要扩展我的代码以申请一系列行。所以,假设这个范围被称为myRange,它包括第2行到第70行。因此,我的报告必须包含所有这些行。我的代码如下。我也包含了标题,因此报告从第2行开始。宏运行的行现在是第2行。为了更清楚地说明,报告必须从源中选择的每一行乘以6 (6个副本,一个在另一个之下),从下面的宏可以看出,因为在预测列和预测数量列中,每个订单(行)必须具有6周的值。我希望我已经澄清了!任何想法如何让它发挥作用?..到目前为止,我已经悲惨地失败了......非常感谢!

报告看起来像这样(一行 - 因为它乘以6),其他行应该以相同的方式放在下面。

Report interface for one row

Sub RCCP_INPUT()

Sheets("RCCP INPUT").Select

    range("C1").Value = "T-Lane ID"                    'Column C
    range("D1").Value = "Week of RCCP"                 'Column D
    range("E1").Value = "Forecast"                     'Column E
    range("F1").Value = "Forecast Quantity"            'Column F

    Sheets("CW33 17").Select
    range("D2:E2").Copy
    Sheets("RCCP INPUT").Select
    range("A2").Select
    ActiveSheet.Paste
    Dim rws As Long
    With range("A2:B2")
    rws = .Rows.Count
    .Resize(rws).Copy Destination:=.Offset(rws).Resize(rws * 5)
    End With
    range("C2").Select
    ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-2],RC[-1])"
    ActiveCell.Value = ActiveCell.Value
    With range("C2")
    rws = .Rows.Count
    .Resize(rws).Copy Destination:=.Offset(rws).Resize(rws * 5)
    End With
    Sheets("CW33 17").Select
    range("G2:L2").Select
    Selection.Copy
    Sheets("RCCP INPUT").Select
    range("F2:F7").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone,   SkipBlanks:=False, Transpose:=True
    Sheets("RCCP INPUT").Select
    i = 1
    For Each cell In range("E2:E7")
        cell.Value = "Week +" & i
        i = i + 1
    Next cell
    Sheets("RCCP INPUT").Select
    range("E2").Value = Sheets("CW33 17").range("G2").Value - 1
    With range("E2")
    rws = .Rows.Count
    .Resize(rws).Copy Destination:=.Offset(rws).Resize(rws * 5)
    End With

End Sub

1 个答案:

答案 0 :(得分:0)

为了概括你的代码,你需要以某种方式远离绝对地址。一种方法是分配范围,然后根据需要偏移它们以到达您需要的位置。下面的代码会持续numNeeded次,并在您提及时直接在下方添加。在第一次通过之后我对源数据一无所知,因此它现在只重复第一组数据。但是,您可以从不同的工作表中绘制新数据,或者使用源表上的偏移量来获取每次的新数据。我在代码中添加了许多r.select语句,以便您可以单步执行并轻松查看代码正在执行的操作,但是一旦您理解,这些语句就应该删除。

Sub reportGen()
  Dim destSh As Worksheet, sourceSh As Worksheet
  Dim sourceR1 As Range, sourceR2 As Range
  Dim r As Range, pasteR As Range
  Const numNeeded = 10
  Set sourceSh = Worksheets("CW33 17")
  Set sourceR1 = sourceSh.Range("D2:E2")
  Set sourceR2 = sourceSh.Range("G2:L2")
  Set destSh = Worksheets("RCCP INPUT")
  Set r = destSh.Range("A1").Offset(7 * j, 0)
  r.Select
  r.Offset(0, 2) = "T-Lane ID"
  r.Offset(0, 3) = "Week of RCCP"
  r.Offset(0, 4) = "Forecast"
  r.Offset(0, 5) = "Forecast Quantity"
  For j = 0 To numNeeded
    Set r = destSh.Range("A2").Offset(j * 6, 0)
    r.Select
    sourceR1.Copy
    destSh.Paste
    Set pasteR = Selection
    pasteR.AutoFill destSh.Range(pasteR, pasteR.Offset(5, 0))
    Set r = r.Offset(0, 2)
    r.Select
    r.FormulaR1C1 = "=CONCATENATE(RC[-2],RC[-1])"
    r = r.Value
    r.AutoFill destSh.Range(r, r.Offset(5, 0))
    Set r = r.Offset(0, 3)
    r.Select
    sourceR2.Copy
    r.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    Set r = r.Offset(0, -1)
    r.Select
    For i = 1 To 6
      r.Offset(i - 1, 0) = "Week +" & i
    Next i
    r = sourceR2(1) - 1
    r.AutoFill destSh.Range(r, r.Offset(5, 0))
    r.Select
  Next j
End Sub

(顺便说一句,我认为在For Each cell...循环之后可能会出现错误,因为它会对数据进行写入,但我不确定是否只保留了它的方式)