【问题标题】:Check if a value exists, if yes copy entire row to another sheet-VBA检查值是否存在,如果存在,则将整行复制到另一个工作表-VBA
【发布时间】:2017-06-19 14:01:16
【问题描述】:

更新: 我有 2 个工作表:base 和 référence。 référence 是恒定的,有 520 行。我应该将它与可以有 2000 行的基础进行比较。我应该匹配从我引用到基础的每一行。能够拥有例如对于第 1 行,从基础开始,在其旁边(第 1 行的最后一个单元格旁边)添加来自 référence 的匹配行,如果没有匹配,我将有一个空白。

所以,我正在尝试编写一个代码,如果该值存在于另一个工作表的另一列中,则该列的每个值都应该找到:引用。如果是,则复制整行引用并将其粘贴到第一个工作表中匹配的单元格旁边:base。

我有 1600 行以匹配参考表 520 行,我有两个表的公共列,我可以将其用作键。

我尝试了不同的方法,但都没有奏效:问题是它不会粘贴到单元格旁边,而是删除所有行并用引用替换它们!所以我不知道完全匹配的那个。或者我有一条错误消息:选择要粘贴的单元格!

这是我的代码:

Sub CopyPaste2()

Dim y, lastrow, c, firstAddress, i

Set y = Workbooks.Open("Z:\Base_de_données\Base_Para.xlsx")
lastrow = y.Sheets("Réf").Range("G" & Rows.Count).End(xlUp).Row
For i = 2 To lastrow
    With y.Worksheets("base").Cells(i, 7)
        Set c = .Find(y.Worksheets("Réf").Range("B" & i).Value, LookIn:=xlValues) 'this identifies the values in worksheet called R?f
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                'c.Entirerow.Copy
                c.y.Sheets("Réf").Range("A" & i & ":D" & i).Copy
                y.Worksheets("base").Range("A" & i).End(xlUp).Offset(1).PasteSpecial _
                    Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
Next i

End Sub

非常感谢您的帮助!

我添加了一个我应该得到什么结果的样本

Sample

【问题讨论】:

  • c.y.Sheets(... 可能是您的错误的来源之一。如果y 是一个工作簿,那么将c 放在它前面是行不通的。能否请您发布一些示例数据和预期输出?
  • 如果您使用For 循环扫描每一行,您可以使用Application.Match 而不是Find
  • @BruceWayne 我添加了一个示例
  • @BruceWayne 你检查样品了吗?清楚了吗?

标签: vba excel


【解决方案1】:

创建一个值数组以定位并使用 .AutoFilter 一次性收集所有值。

Option Explicit

Sub CopyPaste2()
    Dim vals As Variant, y As Workbook

    Set y = Workbooks.Open("Z:\Base_de_données\Base_Para.xlsx")

    With y.Worksheets("Réf")
        vals = Application.Transpose(.Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp)).Value)
    End With

    With y.Worksheets("base")
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Columns("G").Cells
            .AutoFilter field:=1, Criteria1:=vals, Operator:=xlFilterValues
            'check if there is anything to copy
            With .Resize(.Rows.Count - 1, 4).Offset(1, -6)
                If CBool(Application.Subtotal(103, .Cells)) Then
                    .Copy Destination:=.Parent.Worksheets("base").Range("A" & .rows.count).End(xlUp).Offset(1, 0)
                End If
            End With
        End With
        If .AutoFilterMode Then .AutoFilterMode = False
    End With

End Sub

【讨论】:

  • 谢谢!我运行它,它没有工作!没有错误消息,但结果我获得了我的表库的过滤器!
  • 我承认对于工作表的作用有些困惑。希望您可以修改上面的代码以满足您的要求或edit your question 更清楚一点。
  • 可以合并吗?
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2011-10-13
相关资源
最近更新 更多