2015-01-06 106 views
0

我有以下代码:继续下一行代码

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 

我的目的是选择的范围复制到被称为“水滴”只有在有“是”在每个相应的L列另一个工作表。该代码适用于表格中的第一项。不过,我需要为整个表格复制它(大约3800行)。我想避免复制整行,而只是复制上面定义的范围。我假设我将不得不定义一个代码可以跳转的循环,但我不知道如何去做。希望我的解释是有道理的,vba新手但很快学习。任何帮助将不胜感激。多谢你们。

+0

如果您要手动完成此操作,您是否将过滤器应用于列L以仅显示“是”条目,然后将结果复制到“数据”表中? –

回答

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循环。如果该行将不变,您可以简单地将其设置为该值,但如果它更改为“拉斯特罗”变量将是一个好主意。

例如,for循环中的第一行应该是:Set r1 = Sheets("data").Range("c" & i & ":i" & i),然后在将变量放入其他语句中时遵循相似的格式。

我建议的另一件事是在你的范围之前声明你的工作表,就像我在上面的例子中所做的那样,然后从代码中删除选择语句。这可以帮助您加快代码的执行速度,保持整洁,并有助于防止错误发生。此外,它还会阻止工作簿在工作表之间来回翻转,如果您正在观看过程运行,这可能会很烦人。

例如,而不是:

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 
+0

感谢您的详细评论和解释。我只是试图在你的改变中工作。我收到了最后一部分的错误消息(语法错误):multiAreaRange.Copy(表格(“drop”)。行(CStr(lcopytorow)&“:”&CStr(lcopytorow))我相信我错过了一些东西这里很明显... – Simon

+0

尝试'multiAreaRange.copy目的地:=表(“drop”)。行(CStr(LCopyToRow)&“:”&CStr(LCopyToRow))'。希望VBA能够理解自己的规则 –

+0

上面提到的第一个答案是有效的,但是你有一个加速点,防止工作簿翻转。但是,对于我而言,似乎仍然不适用于最后的更改... – Simon

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

编辑由chancea建议:

你并不需要选择范围和工作表每次,它只是做一个大无用的混乱,如果运行在3800行,因为你会看到屏幕上不断地从一个跳放在另一个地方。但我不会触摸代码,我会让你更新,如你所愿。

+0

难道你不能得到使用最后一行而不是硬编码3800?摆脱这些“选择”不是更好吗? – chancea

+0

@chancea对两者都适用,但我认为用户不想触摸他的代码,但只知道如何通过线路重新使用它。如果你提出这个建议,很高兴接受你的修改! –

+0

@MatteoNNZ非常感谢您的回答和帮助。拟议的编辑似乎不起作用。它再次复制第9行,但没有下面。如果你们更喜欢改变我的建议(例如获得最后一行),我也很乐意接受这个建议,它可能会是比最初创建的更智能的解决方案。 – Simon