为了完成这项任务,我花了几周时间试图从其他建议中拼凑出一个完整的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
当比较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
不确定这是否是您的目标。如果您可以澄清“选择以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
如果您真的想要匹配项,并且一旦找到匹配项,则退出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调试代