【问题标题】:Search for a match, copy entire row, and paste to corresponding搜索匹配,复制整行,并粘贴到对应的
【发布时间】:2020-08-20 06:59:53
【问题描述】:

“Sheet2”上的 Col B 包含 370 行数据。 从“Sheet2”单元格 B1 开始,我想在“Sheet1”上的 Col B 中搜索匹配值(它可以位于“Sheet1”Col B 的前 300 行中的任何位置)。 如果找到匹配项,则从“Sheet1”复制整行并粘贴到“Sheet2”上的 Row1。然后,移动到“Sheet2”单元格 B2 并重复搜索,这次将整个行从“Sheet1”粘贴到“Sheet2”上的 Row2。继续遍历“Sheet2”上的整个数据列,在“Sheet1”上搜索每个单元格的值。如果搜索未返回匹配项,则不要将任何内容粘贴到“Sheet2”上的该行,然后继续搜索“Sheet2”上的下一个单元格。 (例如,如果 Sheet1 Col B 不包含 Sheet2 Cell B3 的匹配项,则 Sheet2 Row3 中不会粘贴任何内容。)

我找到了以下示例,它开始对我有所帮助,但它指定了搜索值,并且不会像我试图做的那样循环遍历整个值列。

Sub CopyYes()
    Dim c As Range
    Dim j As Integer
    Dim Source As Worksheet
    Dim Target As Worksheet

    ' Change worksheet designations as needed
    Set Source = ActiveWorkbook.Worksheets("Sheet1")
    Set Target = ActiveWorkbook.Worksheets("Sheet2")

    J = 1     ' Start copying to row 1 in target sheet
    For Each c In Source.Range("E1:E1000")   ' Do 1000 rows
        If c = "yes" Then
           Source.Rows(c.Row).Copy Target.Rows(j)
           j = j + 1
        End If
    Next c
End Sub

【问题讨论】:

  • 使用Range.Find

标签: excel vba copy-paste


【解决方案1】:

这应该可以解决问题,而且要快:

Option Explicit
Sub CopyYes()

    'You need Microsoft Scripting Runtime library under Tools-References for this
    Dim arrPaste As Variant: arrPaste = Sheet2.UsedRange.Value
    Dim arrCopy As Variant: arrCopy = Sheet1.UsedRange.Value
    Dim MyMatches As New Dictionary: Set MyMatches = CreateDictionary(arrCopy)
    Dim i As Long
    For i = 1 To UBound(arrPaste)
        If arrPaste(i, 2) = vbNullString Then Exit For
        If MyMatches.Exists(arrPaste(i, 2)) Then PasteData arrPaste, arrCopy, i, MyMatches(arrPaste(i, 2))
    Next i
    Sheet2.UsedRange.Value = arrPaste
    Erase arrCopy
    Erase arrPaste

End Sub
Private Function CreateDictionary(arr As Variant) As Dictionary

    Dim i As Long
    Set CreateDictionary = New Dictionary
    For i = 1 To 300
        CreateDictionary.Add arr(i, 2), i
    Next i

End Function
Private Sub PasteData(arrPaste As Variant, arrCopy As Variant, i As Long, MyMatch As Long)

    Dim j As Long
    For j = 1 To UBound(arrCopy, 2)
        If arrCopy(MyMatch, j) = vbNullString Then Exit For
        arrPaste(i, j) = arrCopy(MyMatch, j)
    Next j

End Sub

【讨论】:

  • 我收到“编译错误:'arr As Variant' 当前范围内的声明重复...
  • 抱歉@DaveF 想更新代码但忘记了。代码现在已编辑,应该可以工作了。
  • 好的。这似乎解决了我的第一个错误(谢谢!)。但现在我得到“这个键已经与这个集合的一个元素相关联”的行'CreateDictionary.Add arr(i,2), i'
  • 这意味着,您的 sheet1 上有重复项,在 300 行之间,B 列有重复值。
  • 将 300 或 1000 更改为 Ubound(arr),但如果单元格为空,请确保写入 Exit For,以避免在运行脚本时花费大量时间。
【解决方案2】:
  1. 使用Range.Find 搜索匹配的单元格
  2. 使用Union 创建找到的行的集合
  3. 循环完成后,一次复制所有范围如果Union 不为空

Sub Shelter_In_Place()

Dim Source As Worksheet: Set Source = ThisWorkbook.Sheets("Sheet1")
Dim Target As Worksheet: Set Target = ThisWorkbook.Sheets("Sheet2")

Dim Found As Range, lr As Long
Dim CopyMe As Range

lr = Target.Range("B" & Target.Rows.Count).End(xlUp).Row

For i = 1 To lr
    Set Found = Source.Range("B:B").Find(Target.Range("B" & i), LookIn:=xlWhole)

    If Not Found Is Nothing Then
        If Not CopyMe Is Nothing Then
            Set CopyMe = Union(CopyMe, Target.Range("B" & i))
        Else
            Set CopyMe = Target.Range("B" & i)
        End If
    End If

    Set Fouund = Nothing
Next i

If Not CopyMe Is Nothing Then
    CopyMe.EntireRow.Copy
    Source.Range("A1").PasteSpecial xlPasteValues
End If

End Sub

【讨论】:

  • 'Set Found = Source.Range("B:B").Find(Target.Range("B" & i), LookIn 行出现“下标超出范围”错误:=xlWhole)'...
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 2010-11-05
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多