2016-03-15 3 views
3

Я хотел бы запустить определенную процедуру (макрос), когда пользователь пытается вставить изображение на листе моей книги.Перехватить событие «Вставить» в общую книгу и запустить макрос

Если пользователь просто вставляет простой текст в лист книги, не имеющей общего доступа, я мог бы легко обнаружить событие через Workbook_SheetChangeWorksheet_Change (с некоторыми трюками, чтобы понять, что это «Вставить», событие, а не простой ввод текста вручную).

Однако здесь сложность добавляется двумя факторами:

  • Если я вставить изображение, событие 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, который, как известно, не очень приятный (не надежный, нестабильный).

Однако это было удовлетворительно для моего конкретного случая использования, поэтому я подумал о том, чтобы поделиться им как с ответом, так как пока никто не думал о лучшем решении.

Смежные вопросы