基于其他单元格值复制/粘贴n次

时间:2014-05-14 21:54:41

标签: excel vba loops iteration copy-paste

我遇到了这个问题。尽管像this one那样的帖子与Kioskea上的非常相似或this one,我根本无法在过滤单元格和基于公式结果的复制之间连接点。需要做这项工作。这是数据表 - 简化 - 我正在使用:

     A    B   C        D     E      F    G    H
 R1 Name Num Status   #Orig #InPro #Act #Rem #RemStatus
 R2 ABC  032 Complete 22    0      11   11   Purged
 R3 LMN  035 In Prog  25    21     4    21   Pending Scan
 R4 XYZ  039 Not Act  16    16     0    16   Not Active

这描绘了纸质文件盒的状态及其处置方式:

  • D列是计划扫描的方框数
  • E列是扫描的框数
  • 列F是实际扫描的方框数

G列和H列可以有三种含义,基于状态:

  • 如果状态为“未激活”,则列G和H匹配,并且不需要执行任何操作
  • 如果状态为“正在进行”,则假设列G中的数字是待审核的框数(原始减去实际数量)
  • 如果状态为“完成”,则假定G列中的数字是不需要扫描且已清除的框数

我的代码(如下所示)应该迭代遍历范围中的每一行(A2:H61)。如果状态为“未激活”,则可以忽略该行,并将其移至下一行。如果状态为“正在进行”或“完成”,则宏在其“正在读取”的任何行中都需要复制单元格A,B和H并将其粘贴(列)“G”次在另一个工作表中 - 在同一工作簿中 - 从下一个可用行开始。 深呼吸

我知道。它也伤害了我的大脑。这是我到目前为止的代码:

Sub TEST_Copy_Process()

Dim srcrange As Range
Dim wb As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet

Set wb = ActiveWorkbook
Set ws1 = Worksheets("SIS Agregate")
Set ws2 = Worksheets("Center Detail")
Set srcrange = Range(wb.ws2.Cells("A2:H61"))


For Each Row In srcrange.Rows

If Row = "Not Active" And Row.Offset(0, 3) = SectorType Then
Continue
ElseIf Row = "In Progress" And Row.Offset(0, 3) = SectorType Then

ElseIf Row = "Complete" And Row.Offset(0, 3) = SectorType Then

End If

    Set LastCell = wb.ws1.Cells(wb.ws1.Rows.Count, "A").End(xlUp)
    LastCellRowNumber = LastCell.Row + 1

Next Row

End Sub

一旦我找到了实际执行grunt工作的代码,我就没有足够的知识去理解哪个是最好的。如上所述,像this这样的帖子已经帮我了。我慢慢开始理解我在Mr. Excel找到的东西。这个人似乎正在做If / Then工作,但我不明白它是如何复制或粘贴的。

我感谢任何帮助。即使你能指出一个有助于解释这个问题的资源(除了关于亚马逊的书籍:),这将是一个很大的帮助!

1 个答案:

答案 0 :(得分:1)

让我们看看这是否能让你走上正轨。你的代码看起来非常适合不太了解的人,所以也许你是一个快速的学习:)

我很困惑为什么你使用.Offset(0, 3)(在你的解释中似乎没有提到),以及为什么你要比较代码中的SectorType这是一个未定义的变量你提供了。 我将假设这些是不必要的,并且无意中从其他示例中复制了(如果我弄错了,请告诉我。)

我还没有测试过,但我会更改此作业:

Set srcrange = Range(wb.ws2.Cells("A2:H61"))
对此,如果没有其他原因,那就更直接了。我也将此范围更改为引用列H,因为这是您的逻辑居中的列轮(注意:我们始终可以使用Offset访问其他单元格和/或Resize方法)。

Set srcrange = wb.ws2.Range("H2:H61")

你的逻辑就在这个区块,请注意删除Row.Offset(9, 3) = SectorType。我也将使用Select Case代替If/Then。当有多于一个或两个条件需要测试时,我发现这些更容易阅读/理解:

For Each Row In srcrange.Cells  '## In this case, Cells/Rows is the same, but I use Cells as I find it less ambiguous
    Select Case Row.Value
        Case "Not Active"
        '## If the status is Not Active, Column G and H match it, and nothing needs to be done
            'Do nothing

        Case "In Progress", "Complete"
        '## If the status is In Progress or Complete, ... copy cells A, B, and H _
        '    and paste it (column)"G" number of times in another worksheet - _
        '    within the same workbook - starting in the next available row.

        '# Get the next empty cell in column A of the ws1
        '  I modified this to use Offset(1, 0), to return the cell BENEATH
        '  the last cell.
            Set LastCell = wb.ws1.Cells(wb.ws1.Rows.Count, "A").End(xlUp).Offset(1)

        '## copy the values from columns A, B, H to ws1
        '## Column A goes in column A
            LastCell.Value = Row.Offset(0, -7).Value 
        '## Column B goes in column B
            LastCell.Offset(0, 1).Value = Row.Offset(0, -6).Value 
        '## Column H goes in column C (because you did not specify)
            LastCell.Offset(0, 2).Value = Row.Value 
    End Select
Next Row