当前位置: 首页 > 知识库问答 >
问题:

在for-each循环中复制动态范围

东方嘉木
2023-03-14

为了完成这项任务,我花了几周时间试图从其他建议中拼凑出一个完整的VBA,但现在我要向大家寻求答案。我试图从ws2中的a:K列中复制一个范围,该行以值c开头,该值与ws1中的值I匹配,该行以ws1中的值I开头。正在复制的条件是1和0。它基本上是一个美化的循环v形查找,粘贴动态范围。

我弄清楚了循环机制,现在我只需要帮助编写代码来复制选定的单元格。

这是我到目前为止所拥有的:

For Each i In ws1.Range("A4:A26")
    For Each c In ws2.Range("A8:A28")
        If i.Cells.Value <> c.Cells.Value Then
            'select columns A:K in the row with the value c in ws2
            'open ws1
            'paste selection to[starting at] column D in ws1
            Exit For

        End If
    Next c
Next i

共有3个答案

龚振濂
2023-03-14

当比较2个工作表中2列中的值时,您有Application. Match函数。不是有两个耗时的For循环,您可以有一个For并使用Application。匹配而不是另一个。

同时,复制

代码

Option Explicit

Sub CompareColumns()

Dim ws1 As Worksheet
Dim ws2 As Worksheet

Dim MatchRng As Range, C As Range
Dim MatchRow As Long

Set ws1 = Worksheets("Sheet1") ' change "Sheet1" to your sheet's name
Set ws2 = Worksheets("Sheet2") ' change "Sheet2" to your sheet's name

' set the matched range
Set MatchRng = ws1.Range("A4:A26")

With ws2
    For Each C In .Range("A8:A28")
        ' use Match to see if there's a match
        If Not IsError(Application.Match(C.Value, MatchRng, 0)) Then
            MatchRow = Application.Match(C.Value, MatchRng, 0) + MatchRng.Row - 1 ' get the row of the match (add 4 since the range starts at row 4)

            ' copy >> paste is a 1-line command
            .Range(.Cells(C.Row, "A"), .Cells(C.Row, "K")).Copy Destination:=ws1.Range("D" & MatchRow)
        End If
    Next C
End With

End Sub
令狐凌
2023-03-14

不确定这是否是您的目标。如果您可以澄清“选择以ws1中的值c开头的行、列A: K”的含义,那可能会有所帮助。我假设Exit For是如果值不匹配,则您希望在执行IF语句中的所有操作后转到下一个i

使用记录宏功能可能会有所帮助。

For Each i In ws1.Range("A4:A26")
    For Each c In ws2.Range("A8:A28")
        If i.Cells.Value <> c.Cells.Value Then
            'select the row, columns A:K that starts with the value c in ws2
            ws2.Range(Cells(c.Cells.Value, "A"), Cells(c.Cells.Value, "K")).Copy
            'open ws1
            ws1.Activate
            'paste selection, starting from column D in ws1, into ws1
            ws1.Cells(i.Cells.Value, "D").Select
            ActiveSheet.Paste
            Exit For
        End If
    Next c
Next i
End Sub
勾炜
2023-03-14

如果您真的想要匹配项,并且一旦找到匹配项,则退出For。
这无需激活或选择即可完成

     For Each i In ws1.Range("A4:A26")
         For Each c In ws2.Range("A8:A28")
             If i.Value = c.Value Then
                 'select the row, columns A:K that starts with the value c in ws2
                 ws2.Range("A" & c.Row & ":K" & c.Row).Copy ws1.Range("A" & i.Row)
                 Exit For
             End If
         Next c 
     Next i 
 类似资料:
  • For Each循环用于为数组或集合中的每个元素执行语句或一组语句。 For Each循环类似于For循环; 但是,为数组或组中的每个元素执行循环。 因此,步进计数器将不存在于这种类型的循环中。 它主要用于数组或在File系统对象的上下文中使用,以便递归操作。 语法 (Syntax) 以下是VBA中For Each循环的语法。 For Each element In Group [state

  • 在上面的代码中,我根据天气与否计算每个指数,每个指数都是=到零。然而,它总是在foreach循环中运行false,在for循环中运行true。有人能解释一下幕后发生了什么让这一切发生吗? 我不是按顺序运行它们,它们都是为了演示目的。

  • 我得到的错误是“缺少return语句”,代码如下: 有人能帮帮我吗?多谢.

  • 我正在尝试将POJO的jackson JSON字符串转换为JSON文件以导入MySQL。 我遇到的问题是,即使我在控制台中返回了JSON字符串,并且。json文件创建后,MySQL workbench抛出一个未处理的错误异常:bool()类型的对象没有长度 作为一个json文件,行为“true”。 如果我做文件被正确导入,但数据库中没有数据,如果被视为json,则只有一行。 我的POJO

  • 问题内容: 以下两个循环之间的性能差异(如果有)是什么? 和 问题答案: 版本1.5中引入的for-each循环通过完全隐藏迭代器或index变量,消除了混乱和出错的机会。结果成语同样适用于集合和数组: 当你看到冒号(:)时,将其读为“ in”。因此,上面的循环读为“对于元素中的每个元素e”。请注意,即使对于数组,使用for-each循环也不会降低性能。实际上,在某些情况下,它可能只比普通的for

  • 问题内容: 我在进行函数调用时试图找到for-each循环的工作方式。请参阅以下代码, 在版本1中,我在for- each循环中调用returnArr()方法,在版本2中,我显式调用returnArr()方法并将其分配给数组,然后对其进行迭代。两种方案的结果都相同。我想知道哪个更有效以及为什么。 我认为版本2会更高效,因为我不会在每次迭代中都调用method。但是令我惊讶的是,当我使用版本1调试代