这是一个在采访中被问到我的问题。我有一个excel列表。它被复制到另一个位置,然后错误地将新位置中的一行删除。
现在我需要编写一个宏来比较旧的和新的范围,然后提供缺失的数据作为结果。
我可以执行比较部分。但问题是我不知道如何将所选范围作为宏中的输入。
例如。一旦我选择一个范围,它应该作为输入发送到宏,然后宏应该等待另一个选择。一旦我选择了新范围,宏应该比较并找到新范围内的缺失行。
答案 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,那么在那时循环列。