截获共享工作簿上的"Paste"事件并运行宏



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

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

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

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

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

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

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

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

最新更新