Excel 继续下一行中的代码

Excel 继续下一行中的代码,excel,vba,loops,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 =

我有以下代码:

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列中都有“是”时,才将所选范围复制到另一个名为“drop”的工作表中。对于表中的第一项,代码可以正常工作。但是,我需要为整个表(大约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行上运行,而是从第9行运行到第3800行(当然,可以根据您的喜好自定义您的值)。请注意,我假设前面的代码对第9行运行良好,因此它适用于所有其他行

chancea建议的编辑:


你不需要每次都选择范围和工作表,如果超过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
并循环到原始图纸的最后一行来启动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

如果您要手动执行此操作,您会对L列应用过滤器,仅显示“是”条目,然后将结果复制到“数据”表中吗?您不能使用最后一行而不是硬编码3800吗?如果去掉那些
Select
s,不是更好吗?@这两种方法都是正确的,但我假设用户不想触摸他的代码,只知道如何在代码行中重复使用。很高兴接受你的编辑,如果你提议的话@MatteoNNZ非常感谢您的回答和帮助。提议的编辑似乎不起作用。它再次复制第9行,但下面什么也没有。如果你们喜欢修改我的提案(例如,获得最后一行),我也很乐意接受,这可能是一个比最初创建的方案更智能的解决方案。@simon,我犯了一个愚蠢的错误。变量LCopyToRow在循环中,因此每次都会初始化它。现在就试试吧,应该会更好。谢谢你详细的评论和解释。我只是在尝试你的改变。我收到最后一部分的错误消息(语法错误):multiAreaRange.Copy(Sheets(“drop”).Rows(CStr(lcopytrow)&“&CStr(lcopytrow))我确信我在这里遗漏了一些明显的东西……请尝试
multiAreaRange.Copy destination:=Sheets(“drop”).Rows(CStr(lcopytrow)&“&CStr(lcopytrow))
。一般来说,我在明确说明事情方面比希望VBA理解自己的规则更幸运。上面建议的第一个答案很有效,但您有一点需要加快速度并防止工作簿翻转。对我来说,最后一次更改似乎仍然不起作用。但是……我已编辑了原始答案以包含sample sub正在为我工作。已尝试对我的示例文件进行编辑,现在确实可以工作。很高兴工作簿不再翻转。非常感谢您的帮助!