在下一行继续代码

continue code in next line

我有以下代码:

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"。该代码适用于 table 中的第一项。但是,我需要为整个 table(大约 3800 行)复制它。我想避免复制整行,而是只复制上述定义的范围。我假设我必须定义一个循环,代码可以通过该循环跳转,但我不确定该怎么做。希望我的解释是有道理的,vba 的新手,但学得很快。任何帮助将不胜感激。多谢你们。

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

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 行的 运行ning 而是第 9 行到第 3800 行的 运行ning(根据您的喜好自定义您的值,课程)。请注意,我假设前面的代码在第 9 行工作正常,因此它适用于所有其他行。

偶然建议编辑:

您不需要每次都 select 范围和工作表,如果 运行 超过 3800 行,那只会造成一大堆无用的混乱,因为您会看到屏幕不断地从一个地方跳到另一个地方另一个。但我不碰代码,我让你随心所欲地更新。

您走在正确的轨道上,您只需要通过使用 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 并循环到原始 sheet 的最后一行来开始您的 for 循环。如果该行将保持不变,您可以简单地将其设置为该值,但如果它发生变化,则制作一个 "lastrow" 变量将是一个好主意。

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

我建议的另一件事是在你的范围前面声明你的 sheet ,就像我在上面的例子中所做的那样,然后从代码中删除 select 语句。这可以帮助加快您的代码速度,使其更清晰,并有助于防止错误。它还会阻止工作簿在 sheet 之间来回翻转,如果您正在观看 运行.

的过程,这可能会很烦人

例如,而不是:

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