我有以下代码:
Sub rangeSelect()
Dim r1 As Range, r2 As Range, multiAreaRange As Range, lcopytorow As Long
Worksheets("data").Activate
Set r1 = Range("c9:i9")
Set r2 = Range("m9:af9")
Set multiAreaRange = Union(r1, r2)
LCopyToRow = 2
If Range("L9").Value = "yes" Then
multiAreaRange.Select
Selection.Copy
Sheets("drop").Select
Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow)).Select
ActiveSheet.Paste
LCopyToRow = LCopyToRow + 1
Sheets("data").Select
End If
End Sub
我的目的是将选定的范围复制到另一个名为" drop"的工作表中。只有有"是"在每个相应的L列中。该代码适用于表中的第一项。但是,我需要为整个表复制它(大约3800行)。我想避免复制整行,而只是复制上面定义的范围。我假设我必须定义一个代码可以跳过的循环,但我不知道该怎么做。希望我的解释有意义,对vba来说是新手,但要快速学习。任何帮助将受到高度赞赏。多谢你们。
答案 0 :(得分:2)
如果我误解了你的问题,请纠正我,但我认为你只需要在你的定义中索引行号:
Dim r1 As Range, r2 As Range, multiAreaRange As Range, copytorow As Long
Worksheets("data").Activate
LCopyToRow = 2
For j = 9 To 3800 'repeat this 3791 times, or use Range("c9").End(xlDown).Row to get the last line as suggested by chancea (definitely more flexible)
Set r1 = Range("c" & j & ":i" & j)
Set r2 = Range("m" & j & ":af" & j)
Set multiAreaRange = Union(r1, r2)
If Range("L" & j).Value = "yes" Then
multiAreaRange.Select
Selection.Copy
Sheets("drop").Select
Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow)).Select
ActiveSheet.Paste
LCopyToRow = LCopyToRow + 1
Sheets("data").Select
End If
Next j
以上是您之前使用的相同代码,但不是在第9行上运行,而是从第9行到第3800行(当然,根据您的喜好自定义您的值)。请注意我假设前面的代码在第9行工作正常,因此它适用于所有其他行。
由偶然提出的编辑:
你不需要每次都选择范围和表格,如果超过3800行就会造成很大的无用混乱,因为你会看到屏幕不断地从一个地方跳到另一个地方。但是我没有触及代码,我让你根据自己的喜好进行更新。
答案 1 :(得分:0)
您走在正确的轨道上,您只需要通过使用for循环和变量来概括您提供的示例。
for循环基本上像这样工作
For [some variable] = [starting number] to [ending number]
[Run some code while variable equals current value]
Next
基本上,您需要将整个代码包装在for循环中,以便它可以逐个评估每一行。在循环之外你唯一想要的是你的Dim
声明和LCopyToRow = 2
,这样它们就不会在循环的每次迭代中重置。
您可以通过说Dim i as Long
之类的内容来设置变量。您似乎想通过为第9行设置i = 9
并循环到原始工作表的最后一行来启动for循环。如果行是常量,你可以简单地将它设置为该值,但如果它改变了,那么制作一个“lastrow”变量将是一个好主意。
例如,for循环中的第一行是:Set r1 = Sheets("data").Range("c" & i & ":i" & i)
,然后在将变量放入其他语句时遵循类似的格式。
我建议的另一件事是在您的范围前声明您的工作表,就像我在上面的示例中所做的那样,然后从代码中删除select语句。这有助于加快代码速度,使代码更清晰,并有助于防止错误。此外,它还会阻止工作簿在工作表之间来回切换,如果您正在观看流程运行,这可能很烦人。
例如,而不是:
multiAreaRange.Select
Selection.Copy
Sheets("drop").Select
Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow)).Select
ActiveSheet.Paste
你可以简单地说:
multiAreaRange.copy destination:=Sheets("drop").Rows(CStr(LCopyToRow) & ":" & CStr(LCopyToRow))
编辑:我在示例工作簿中为我工作:
Sub test()
Dim r1 As Range, _
r2 As Range, _
multiAreaRange As Range, _
lcopytorow As Long, _
i As Long
lcopytorow = 2
For i = 9 To 100
Set r1 = Sheets("data").Range("c" & i & ":i" & i)
Set r2 = Sheets("data").Range("m" & i & ":af" & i)
Set multiAreaRange = Union(r1, r2)
If Sheets("data").Range("L" & i).Value = "yes" Then
multiAreaRange.Copy Destination:=Sheets("drop").Rows(lcopytorow & ":" & lcopytorow)
lcopytorow = lcopytorow + 1
End If
Next
End Sub