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