【问题标题】:Intercept "Paste" event on Shared workbook and run a macro在共享工作簿上拦截“粘贴”事件并运行宏
【发布时间】:2016-03-16 07:13:25
【问题描述】:

当用户尝试将图像粘贴到我的工作簿上时,我想运行某个过程(宏)。

如果用户只是将简单的文本粘贴到非共享工作簿的工作表中,那么我可以通过 Worksheet_ChangeWorkbook_SheetChange 轻松检测到该事件(通过一些技巧可以理解它是“粘贴”事件而不是简单的文本手动输入)。

然而,这里的复杂性是由两个因素增加的:

  • 如果我粘贴图像,即使工作簿未共享,也不会触发事件Worksheet_Change
  • 在共享工作簿中无法粘贴图像。因此,Excel 的本机代码似乎在检测到事件之前就停止了操作。

有没有人知道(甚至包括用于拦截剪贴板操作的 Windows API)?

【问题讨论】:

  • 不知道这是否适合你,但看看HERE

标签: vba excel


【解决方案1】:

如果它可以帮助任何人,我终于用“不是很好但可行的解决方案”解决了上述问题:

Workbook_Open 上,我为Ctrl+v 键添加了一个侦听器,它不会执行通常的粘贴,而是会调用一个单独的宏:

Application.OnKey "^{v}", "mySpecialPaste"

mySpecialPaste的代码为:

MakeExclusive '<-- procedure to make the workbook exclusive
Application.OnKey "^{v}" '<-- remove the "Ctrl+V" link to the macro
Application.SendKeys "^{v}" '<-- send a Ctrl+V to perform the paste
Application.OnKey "^{v}", "mySpecialPaste" '<-- re-link the Ctrl+V to this macro
MakeShared '<-- make the workbook shared once again

当然,这不是一个优雅的解决方案,因为它依赖于用户使用 Ctrl+V 键而不是例如右键单击/粘贴来执行图片粘贴的事实。另外,这将在任何 Ctrl+V 上触发(即使用户只是粘贴普通文本,即使在共享工作簿上也是正常操作)。最后,它依赖于SendKeys,众所周知它不是很好(不可靠,不稳定)。

但是,对于我的特定用例来说,它是令人满意的,所以我考虑将其作为答案分享,因为到目前为止还没有人想到更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2019-11-27
    • 2018-10-08
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多