【问题标题】: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语句)
【发布时间】:2020-08-04 13:31:54
【问题描述】:

在 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

但是我只能复制和粘贴范围的第一行。或者,我在 stackoverflow 找到了这个过程,但我似乎无法在每次迭代时粘贴我复制的内容:

将 wsData、wsCalcAndOutput 调暗为工作表 Dim rSPX、rSX5E、rNKY、rUKX、rSMI、rEEMUP、testData As Range

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”吗?

一切顺利, 克里斯托弗

【问题讨论】:

  • 不要循环复制。过滤,然后复制可见单元格。宏记录器在这里可能会有所帮助。或使用高级过滤器。

标签: vba loops if-statement range copy-paste


【解决方案1】:

正如 BigBen 所说,使用 AutoFilter 会更快,但这是使用循环执行此操作的一种方法。添加了一些 cmets,希望能解释基础知识。

您的代码的一个问题是您没有更改目标单元格,因此它们会不断被覆盖。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多