当用户尝试将图像粘贴到我的工作簿工作表上时,我想运行某个过程(宏)。
如果用户只是将简单的文本粘贴到非共享工作簿的工作表中,那么我可以通过Worksheet_Change
的Workbook_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
(不可靠,不稳定)。
但是,对于我的特定用例来说,这是令人满意的,因此我考虑将其共享为答案,因为到目前为止还没有人想到更好的解决方案。