在下一行继续代码
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
我有以下代码:
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