Excelmacrosselect两个范围并进行比较

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

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

我可以执行比较部分。 但问题是我不知道如何获得选定的范围作为一个macros的input。

例如。 只要我select一个范围,它应该作为input发送到macros,然后macros应该等待另一个select。 只要我select新的范围,macros应该比较,并find新的范围内缺失的行。

关于每次点击鼠标的select,你可以看看我在其他答案的评论中发送的链接 。 Selection_Change是一个事件,当您更改工作表的select时(不仅是鼠标点击,而且也是按键移动),触发事件。 进入的目标是你select的单元格。 你可以把这个作为一个范围传递给一个函数。

    私人小组Worksheet_SelectionChange(BYVAL目标作为范围)
         showMsg目标
    结束小组

    私有函数showMsg(r作为范围)
         MsgBox r.Address
    结束function

您可以使用另一个事件,如BeforeDoubleClick或BeforeRightClick。 检查Excel的事件,并select一个你觉得最合适的。

如果您只希望某个范围内的function被触发,您可以对其进行过滤。

If target.column <> 1 then exit function

如果您不希望事件在每次更改select时触发您的function,则可以select一个单元作为由同一事件触发的开关。

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

toggleSearch是切换function。

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

这个例子假定两张纸都在同一个工作簿中,但是你可以很容易地调整它

 Public Sub diffThem()

    昏暗的src作为工作表,trg作为工作表
     Dim r as Range,i as Integer
    设置src = ThisWorkbook.Sheets(“Source”)
    设置trg = ThisWorkbook.Sheets(“目标”)

    设置r = src.Range(“A1”)
    对于i = 1到ThisWorkbook.Sheets(“Source”)。UsedRange.Rows.Count

        如果r.EntireRow <> trg.Range(“A”&r.Row).EntireRow Then 
             MsgBox(“缺less的行是”&r.Row)
            退出小组
        万一

    设置r = r.Offset(1,0)
    接下来我

结束小组

如果EntireRow由于布局不同或其他原因无法运行,则在此处循环使用列。