我遇到了这个问题。尽管像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
这描绘了纸质文件盒的状态及其处置方式:
G列和H列可以有三种含义,基于状态:
我的代码(如下所示)应该迭代遍历范围中的每一行(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工作,但我不明白它是如何复制或粘贴的。
我感谢任何帮助。即使你能指出一个有助于解释这个问题的资源(除了关于亚马逊的书籍:),这将是一个很大的帮助!
答案 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