拦截共享工作簿上的“粘贴”事件并运行宏

时间:2016-03-15 15:48:42

标签: vba excel-vba excel

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

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

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

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

有没有人有任何想法(甚至包括用于拦截剪贴板操作的Windows API)?

1 个答案:

答案 0 :(得分:2)

如果它可以帮助任何人,我终于用一个"不是很好但工作正常的解决方案来解决上述问题":

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不是很好(不可靠,不稳定)。

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