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由于布局不同或其他原因无法运行,则在此处循环使用列。