VBA:在循环中复制一个范围(逐行)并将其(逐行)插入到新的 sheet(循环 + if 语句)中
VBA: Copying a range (row-by-row) in a loop and inserting this (row-by-row) in a new sheet (loop + if statement)
在 VBA 中,我尝试 运行 一个带有 if 语句的循环。循环设置为一次 运行 一行,范围为 (wks "Data", B7:J25)。
对于每一行,如果列 C7:C25 的值为 1,我想复制该行(例如 B7:J7)并将其插入到工作表 "temp" 中时间。
我试过各种密码,例如:
Sub start()
Dim i As Integer
Dim wsData, wsCalcAndOutput, wsTemp As Worksheet
For i = 1 To 25
If Cells((7 + i), 3) = "1" Then
Worksheets("Data").Range("B7:J7").Copy _
Worksheets("temp").Range("B7:J7")
End If
Next
End Sub
但我只能复制并粘贴该范围的第一行。或者,我在 Whosebug 上找到了这个过程,但我似乎无法在每次迭代时粘贴我复制的内容:
将 wsData、wsCalcAndOutput 调暗为工作表
将 rSPX、rSX5E、rNKY、rUKX、rSMI、rEEMUP、testData 调暗为范围
Sub start()
Dim i As Integer
For i = 1 To 25
If Cells((7 + i), 3) = "1" Then
With ActiveSheet
.Range(.Cells((7 + i), 2), .Cells((7 + i), 10)).Copy
End With
End If
Next
End Sub
这是这样做的正确方法还是有更有效的方法?
此外 - 在数据集中,if 语句的条件实际上是一个名为 "TRUE" 或 "FALSE" 的字符串。 if 语句可以使用字符串而不是“1”作为信号吗?
一切顺利,
克里斯托弗
正如 BigBen 所说,使用 AutoFilter 会更快,但这是使用循环执行此操作的一种方法。添加了一些评论,希望能解释基础知识。
您的代码的一个问题是您没有更改目标单元格,因此它们会不断被覆盖。
Sub start()
Dim i As Long 'better than integer
Dim n As Long: n = 7
Dim wsData As Worksheet, wsCalcAndOutput As Worksheet, wsTemp As Worksheet 'specify each type
With Worksheets("Data")
For i = 7 To 25 'change as appropriate
If .Cells(i, 3) = 1 Then 'no need for quotes
Range(.Cells(i, "B"), Cells(i, "J")).Copy _
Worksheets("temp").Cells(n, "B") 'start at row 7?
n = n + 1 'update so that we don't overwrite next time
End If
Next
End With
End Sub
在 VBA 中,我尝试 运行 一个带有 if 语句的循环。循环设置为一次 运行 一行,范围为 (wks "Data", B7:J25)。
对于每一行,如果列 C7:C25 的值为 1,我想复制该行(例如 B7:J7)并将其插入到工作表 "temp" 中时间。
我试过各种密码,例如:
Sub start()
Dim i As Integer
Dim wsData, wsCalcAndOutput, wsTemp As Worksheet
For i = 1 To 25
If Cells((7 + i), 3) = "1" Then
Worksheets("Data").Range("B7:J7").Copy _
Worksheets("temp").Range("B7:J7")
End If
Next
End Sub
但我只能复制并粘贴该范围的第一行。或者,我在 Whosebug 上找到了这个过程,但我似乎无法在每次迭代时粘贴我复制的内容:
将 wsData、wsCalcAndOutput 调暗为工作表 将 rSPX、rSX5E、rNKY、rUKX、rSMI、rEEMUP、testData 调暗为范围
Sub start()
Dim i As Integer
For i = 1 To 25
If Cells((7 + i), 3) = "1" Then
With ActiveSheet
.Range(.Cells((7 + i), 2), .Cells((7 + i), 10)).Copy
End With
End If
Next
End Sub
这是这样做的正确方法还是有更有效的方法?
此外 - 在数据集中,if 语句的条件实际上是一个名为 "TRUE" 或 "FALSE" 的字符串。 if 语句可以使用字符串而不是“1”作为信号吗?
一切顺利, 克里斯托弗
正如 BigBen 所说,使用 AutoFilter 会更快,但这是使用循环执行此操作的一种方法。添加了一些评论,希望能解释基础知识。
您的代码的一个问题是您没有更改目标单元格,因此它们会不断被覆盖。
Sub start()
Dim i As Long 'better than integer
Dim n As Long: n = 7
Dim wsData As Worksheet, wsCalcAndOutput As Worksheet, wsTemp As Worksheet 'specify each type
With Worksheets("Data")
For i = 7 To 25 'change as appropriate
If .Cells(i, 3) = 1 Then 'no need for quotes
Range(.Cells(i, "B"), Cells(i, "J")).Copy _
Worksheets("temp").Cells(n, "B") 'start at row 7?
n = n + 1 'update so that we don't overwrite next time
End If
Next
End With
End Sub