继续下一行代码

时间:2015-01-06 19:01:02

标签: excel vba loops

我有以下代码:

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来说是新手,但要快速学习。任何帮助将受到高度赞赏。多谢你们。

2 个答案:

答案 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