VBA匹配并复制工作表之间的单元格值

时间:2017-04-12 00:19:39

标签: excel vba excel-vba

我有两张纸,一张标有“分配”,另一张标有“备份”。我想要实现的是将“分配”上的信息复制到“备份”以允许输入新数据。

但是,一旦复制到“备份”并且新信息提供给“分配”,我希望循环“备份”中A列中的每个项目,并将相邻单元格(列B)复制到找到的相应单元格值关于“作业”。

到目前为止,这是我的代码,但没有返回任何可行的结果:

Option Explicit
Sub Match()
Dim RNG As Range
Dim RI As Range
Dim WS As Worksheet
Dim f As Range
Set WS = ActiveWorkbook.Sheets("Assignments")
Set RNG = Sheets("Assignments Backup").Range("A2:A400")
For Each RI In RNG

With WS
    'RI.Select

    Set f = .Columns(1).SpecialCells(xlCellTypeConstants).Find(What:=Cells(Target.Row, 1), LookIn:=xlFormulas, LookAt:=xlWhole) '<--| try finding "Emp #" from Assignments sheet changed cell row column B in referenced sheet ("i.e. "Checklist") column "A" cells not blank cells

        If f Is Nothing Then '<--| if "Emp #" match not found



            'MsgBox "I couldn't find " & Cells(Target.Row, 1).Value & " in worksheet 'Checklist'"
        Else ' <-- if "Emp #" match found
            .Range("F:F").Rows(f.Row).Value = Range("F:F").Rows(Target.Row).Value '<--| paste "Assigmnents" sheet changed cell row columns "AA:AF" content in corresponiding columns of referenced sheet ("i.e. "Checklist") row where "Emp #" match was found
        End If

        End With
        Next


End Sub

我为延迟道歉,我已将示例文件上传到我的google云端硬盘。 [https://drive.google.com/open?id=0B0jgh8FwPVvkWk40TEczYVFjX0k][1]

您会注意到B列在两张纸之间包含不同的数据。但是,如上所述,我希望备份中B列的信息根据每列中A列中的数据替换分配中B列中的内容。我还包括下面的代码。

修改 我更新了上面的代码,因为我意识到我没有发布我最初尝试使用的正确代码。

1 个答案:

答案 0 :(得分:1)

亲爱的朋友,你的“代码”是一团糟 - 这是一种非常礼貌的方式。我花了半个小时来清理它。但这只是为了使问题可见。

Sub MatchEntries()

    Dim WsA As Worksheet                        ' Worksheet "Assignments"
    Dim WsB As Worksheet                        ' Worksheet "Assignments Backup"
    Dim WsC As Worksheet                        ' Worksheet "Checklist"
    Dim Cell As Range                           ' Cells in RngA
    Dim Fnd As Range                            ' Find match
    Dim R As Long, C As Long                    ' row and column

    With ActiveWorkbook
        Set WsA = .Worksheets("Assignments")
        Set WsB = .Worksheets("Assignments Backup")
        Set WsC = .Worksheets("Checklist")
    End With

    For Each Cell In WsB.Range("A2:A400")
        Set Fnd = WsC.Columns(1).Find(What:=Cell.Value, LookIn:=xlFormulas, LookAt:=xlWhole)
                  ' <--| try finding "Emp #" from Assignments sheet changed cell row column B
                  ' in referenced sheet ("i.e. "Checklist") column "A" cells not blank cells

        If Fnd Is Nothing Then '<--| if "Emp #" match not found
            MsgBox "I couldn't find " & Cell.Value & " in worksheet 'Checklist'"

        Else ' <-- if "Emp #" match found
            R = Fnd.Row
            For C = 27 To 32                ' columns AA to AF
                WsA.Cells(R, C).Value = WsC.Cells(R, C).Value
            Next C
'            .Range("Fnd:Fnd").Rows(Fnd.Row).Value = Range("Fnd:Fnd").Rows(Target.Row).Value
            ' <--| paste "Assigmnents" sheet changed cell row columns "AA:AF" content
            ' in corresponiding columns of referenced sheet ("i.e. "Checklist") row
            ' where "Emp #" match was found
        End If

    Next Cell
End Sub

首先,请勿调用您的子“匹配”。 Match是一个工作表函数,并且无法告诉Excel在满足“您的”名称选择时将执行的操作。

其次,你好像有3张。所以,我宣布了3张。从你的帖子来看,无法判断这个假设是否正确,但我相信你可以看到逻辑。此外,一旦你有这么多的变量,你需要有一些想象力的名字。你不能打电话给你所有的8个儿子John1,John2,John3等。出于同样的原因,我命名了你的一个范围Cell和另一个Fnd。您可以通过他们的名字来区分它们。

现在您可以看到您正在查看备份表(WsB)的A列中的所有单元格。这看起来不是一个好主意,因为可能会有很多空白单元格。将为他们找到匹配项。我冒昧地假设您正在查看清单表。如果这是错误的,现在可以很容易地更改工作表或列。

如果发现匹配,您想要做某事。我无法弄清楚你想要做什么,但是我在那里写了一些代码,你应该很容易理解和修改它,以便它能达到你真正想要的目的。