【问题标题】:Excel macro select two ranges and compareExcel宏选择两个范围并比较
【发布时间】:2024-01-20 16:11:01
【问题描述】:

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

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

我也许可以执行比较部分。但问题是我不知道如何在宏中获取选定范围作为输入。

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

【问题讨论】:

  • 面试是为了什么,出于兴趣?
  • @Cor_Blimey 实际上是它的数据管理配置文件,其中包括很多 excel。文档和所有......
  • @simoco :其实我一开始尝试使用输入框,但要求是用鼠标选择范围并发送到宏进行比较。我们不必手动输入行、列详细信息。
  • 没有必要to manually enter row,column,当使用InputBoxType:=8范围选择with mouse这样:Set myRange = Application.InputBox(prompt := "Sample", type := 8)

标签: vba excel copy


【解决方案1】:

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range) showMsg 目标 结束子 私有函数 showMsg(r As Range) MsgBox r.Address 结束功能

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

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

If target.column <> 1 then exit function

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

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

toggleSearch 是切换功能。

【讨论】:

    【解决方案2】:

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

    此示例假定两个工作表都在同一个工作簿中,但您可以轻松调整它

    公共子 diffThem() 将 src 调暗为工作表,将 trg 调暗为工作表 Dim r 为 Range,i 为 Integer 设置 src = ThisWorkbook.Sheets("Source") 设置 trg = ThisWorkbook.Sheets("Destination") 设置 r = src.Range("A1") 对于 i = 1 到 ThisWorkbook.Sheets("Source").UsedRange.Rows.Count If r.EntireRow trg.Range("A" & r.Row).EntireRow Then MsgBox("缺少的行是" & r.Row) 退出子 万一 设置 r = r.Offset(1,0) 接下来我 结束子

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

    【讨论】:

    • 这实际上有助于比较,因此我会为此给你+1,但箭头表示声誉不够。 :3 尽管如此,问题仍然有点悬而未决,我希望通过鼠标选择选定的范围,它可能位于工作表中的任何位置(不是特别是在 A1 处)并发送到宏进行比较。你的回答真的很有帮助,如果你能告诉我发送选定的范围作为输入,我将非常感激,而无需在任何输入框等中手动输入详细信息。