Excel宏选择两个范围并进行比较

时间:2014-05-31 09:27:37

标签: excel vba excel-vba copy

这是一个在采访中被问到我的问题。我有一个excel列表。它被复制到另一个位置,然后错误地将新位置中的一行删除。

现在我需要编写一个宏来比较旧的和新的范围,然后提供缺失的数据作为结果。

我可以执行比较部分。但问题是我不知道如何将所选范围作为宏中的输入。

例如。一旦我选择一个范围,它应该作为输入发送到宏,然后宏应该等待另一个选择。一旦我选择了新范围,宏应该比较并找到新范围内的缺失行。

2 个答案:

答案 0 :(得分:2)

关于每次点击鼠标的选择,您可以查看the link I sent in the comments of the other answer。 Selection_Change是一个在您更改工作表选择时触发的事件(不仅是鼠标点击,而且还是按键移动)。进入的目标是您选择的单元格。您可以将此作为范围传递给函数。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        showMsg Target
    End Sub

    Private Function showMsg(r As Range)
        MsgBox r.Address
    End Function

您也可以使用其他事件,如BeforeDoubleClick或BeforeRightClick。查看Excel的事件,选择您认为最合适的事件。

如果您只希望在某个范围内触发该功能,则可以对其进行过滤。

If target.column <> 1 then exit function

如果您不希望事件在每次更改选择时触发您的功能,您可以选择一个单元格作为由同一事件触发的开关。

If target.address = "$A$1" Then Call toggleSearch()

使用toggleSearch作为切换功能。

答案 1 :(得分:0)

这是一个经典的差异(在那个简单的差异),你不应该用手或任何东西选择。只需以相同的方式对两个列表进行排序,然后运行一个Sub,它循环遍历源表中的行数,将每行与目标表中的相同行进行比较。你得到的第一个不匹配是缺失的一行。

此示例假设两个工作表位于同一工作簿中,但您可以轻松地对其进行调整

Public Sub diffThem()

    Dim src as Worksheet, trg as Worksheet
    Dim r as Range, i as Integer
    Set src = ThisWorkbook.Sheets("Source")
    Set trg = ThisWorkbook.Sheets("Destination")

    Set r = src.Range("A1")
    For i = 1 to ThisWorkbook.Sheets("Source").UsedRange.Rows.Count

        If r.EntireRow <> trg.Range("A" & r.Row).EntireRow Then 
            MsgBox("The missing row is " & r.Row)
            Exit Sub
        End if

    Set r = r.Offset(1,0)
    Next i

End Sub

如果由于布局不同或其他原因无法运行EntireRow,那么在那时循环列。