继续在下一行的代码

我有以下代码:

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列中都有“yes”。 该代码适用于表中的第一项。 但是,我需要复制整个表(约3800行)。 我想避免复制整行,而只是复制上面定义的范围。 我假设我将不得不定义一个代码可以跳转的循环,但我不知道该怎么做。 希望我的解释是有道理的,vba新,但快速学习。 任何帮助将不胜感激。 多谢你们。

你在正确的轨道上,你只需要简化你通过使用for循环和variables提供的例子。

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来设置variables。 看起来你想通过设置第9行i = 9并循环到原始表单的最后一行来启动for循环。 如果这个行将是常数,你可以简单地将它设置为该值,但如果它改变使得“lastrow”variables将是一个好主意。

例如,for循环中的第一行是: Set r1 = Sheets("data").Range("c" & i & ":i" & i) ,然后在放置变成你的其他陈述。

我build议的另一件事是在你的范围之前声明你的工作表,就像我在上面的例子中所做的那样,然后从代码中删除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 

请纠正我,如果我误解了你的问题,但我认为你只需要在你的定义中的行号索引:

 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行工作正常,所以它适用于所有其他行。

编辑build议由偶然:

你不需要每次select范围和表单,如果运行超过3800行,就会造成无用的混乱,因为你会看到屏幕不断从一个地方跳到另一个地方。 但是我不会触摸代码,我会让你更新,如你所愿。