2016-03-15 63 views
3

我想在用戶試圖將圖像粘貼到工作簿的一張表上時運行某個特定過程(宏)。在共享工作簿上攔截「粘貼」事件並運行宏

如果用戶只是將簡單文本粘貼到非共享工作簿的表單中,則可以通過Worksheet_ChangeWorkbook_SheetChange(通過一些技巧了解它是「粘貼」事件而不是簡單的文本手動輸入)。

然而,這裏的複雜性是由兩個因素加:

  • 如果我粘貼的圖像,即使在工作簿不共享時不會觸發事件Worksheet_Change;
  • 在共享工作簿中不可能粘貼圖像。因此,即使在檢測到事件之前,Excel的本地代碼似乎也會停止該操作。

有沒有人有任何想法(即使包括Windows API攔截剪貼板操作)?

+0

不知道這是否適合你,但看看[這裏](https://siddharthrout.wordpress.com/2011/08/15/vba-excelallow-paste-special-only/) –

回答

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這是衆所周知的不是很好(不可靠,不穩定)。

但是,對於我的具體用例來說,這是令人滿意的,所以我一直在考慮分享它作爲答案,因爲迄今爲止還沒有人想到更好的解決方案。

相關問題