Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 为每个循环复制动态范围_Vba_Excel_Foreach_Copy Paste - Fatal编程技术网

Vba 为每个循环复制动态范围

Vba 为每个循环复制动态范围,vba,excel,foreach,copy-paste,Vba,Excel,Foreach,Copy Paste,为了完成这项任务,我花了几周的时间试图从其他建议中拼凑出一个完整的VBA,但现在我要向大家寻求答案。我试图从ws2中的a:K列复制一个范围,该行以与ws1中的值I匹配的值c开头,该行以ws1中的值I开头。正在复制的条件是1和0。它基本上是一个美化的循环v形查找,粘贴一个动态范围 我弄明白了循环机制,现在我只需要帮助编写代码来复制选定的单元格 以下是我目前掌握的情况: For Each i In ws1.Range("A4:A26") For Each c In ws2.Range("A8

为了完成这项任务,我花了几周的时间试图从其他建议中拼凑出一个完整的VBA,但现在我要向大家寻求答案。我试图从ws2中的a:K列复制一个范围,该行以与ws1中的值I匹配的值c开头,该行以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
ws1.范围(“A4:A26”)中的每个i的

对于ws2.范围内的每个c(“A8:A28”)
如果i.Cells.Value c.Cells.Value那么
'在ws2中选择值为c的行中的A:K列
'打开ws1
'将所选内容粘贴到ws1中的[从]列D开始
退出
如果结束
下一个c
接下来我

不确定这是否是您的目标。如果您可以澄清“选择ws1中以值c开头的行、列A:K”的含义,这可能会有所帮助。我假设的
退出是如果值不匹配,则在执行
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
ws1.范围(“A4:A26”)中的每个i的

对于ws2.范围内的每个c(“A8:A28”)
如果i.Cells.Value c.Cells.Value那么
'选择ws2中以值c开头的行、列A:K
ws2.范围(单元格(c.Cells.Value,“A”)、单元格(c.Cells.Value,“K”))。复制
'打开ws1
ws1.激活
'将所选内容从ws1中的D列开始粘贴到ws1中
ws1.单元格(i.Cells.Value,“D”)。选择
活动表。粘贴
退出
如果结束
下一个c
接下来我
端接头

不确定这是否是您的目标。如果您可以澄清“选择ws1中以值c开头的行、列A:K”的含义,这可能会有所帮助。我假设
退出是如果值不匹配,则在执行
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
ws1.范围(“A4:A26”)中的每个i的

对于ws2.范围内的每个c(“A8:A28”)
如果i.Cells.Value c.Cells.Value那么
'选择ws2中以值c开头的行、列A:K
ws2.范围(单元格(c.Cells.Value,“A”)、单元格(c.Cells.Value,“K”))。复制
'打开ws1
ws1.激活
'将所选内容从ws1中的D列开始粘贴到ws1中
ws1.单元格(i.Cells.Value,“D”)。选择
活动表。粘贴
退出
如果结束
下一个c
接下来我
端接头

如果确实需要匹配项,并且一旦找到匹配项,请退出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。
这不需要激活或选择

     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 

比较两个工作表中两列中的值时,您有
Application.Match
功能。您可以使用一个
For
并使用
Application.Match
代替另一个,而不是使用两个
For
循环,因为这两个循环非常耗时

另外,Copy>>Paste是一个单行命令,无需
选择
激活
任何内容

代码

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

比较两个工作表中两列中的值时,您有
Application.Match
功能。您可以使用一个
For
并使用
Application.Match
代替另一个,而不是使用两个
For
循环,因为这两个循环非常耗时

另外,Copy>>Paste是一个单行命令,无需
选择
激活
任何内容

代码

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

您需要指定使用此代码试图实现的目标吗?将单元格从哪个工作表复制到哪里?标准是什么?如果没有信息,你不可能猜出你想做什么,只是一个不起作用的代码。请不要在注释中添加代码。所有进一步的解释都应该在原始问题中使用Hi-Shai,我试图从ws2中的a:K列复制一个范围,该行以值c开始,该值与ws1中的值I匹配,该行以ws1中的值I开始。正在复制的条件是1和0。它基本上是一个美化的循环v型查找。如果您需要更多信息,请告诉我。嗨,斯科特,谢谢您的编辑和耐心!我是新来的,所以我还没有完全掌握格式的变化。这对第一页中的大多数人来说不是真的吗?如果i.Cells.Value c.Cells.Value那么。你写的是想要匹配的,而不是不匹配的。“与值i匹配的值c”您需要指定使用此代码试图实现的目标吗?将单元格从哪个工作表复制到哪里?标准是什么?如果没有信息,你不可能猜出你想做什么,只是一个不起作用的代码。请不要在注释中添加代码。所有进一步的解释都应该在原始问题中使用Hi-Shai,我试图从ws2中的a:K列复制一个范围,该行以值c开始,该值与ws1中的值I匹配,该行以ws1中的值I开始。正在复制的条件是1和0。它基本上是一个美化的循环v型查找。如果您需要更多信息,请告诉我。嗨,斯科特,谢谢您的编辑和耐心!我是新来的,所以我还没有完全掌握格式的变化。这对第一页中的大多数人来说不是真的吗?如果i.Cells.Value c.Cells.Value那么。你写的是想要匹配的,而不是不匹配的。“与值i匹配的值c”请使用
ws1.Range(单元格(c