Я думаю, что ключ в том, чтобы изящно заблокировать стандартную функцию вставки и повторить вставку контролируемым образом
Я слышал, что в более поздних версиях Excel есть событие «При вставке» (не уверен), но оно недоступно в 2003 году. Я перехватываю действия «Вставить» следующим кодом в 2003 году (который вызывается подходящим событием процедура, подобная Sheet_Activate ()):
Sub SetPasteTrap(Mode As Boolean)
' TRUE sets the trap, FALSE releases trap
If Mode Then
Application.CommandBars("Edit").Controls("Paste").OnAction = "TrappedPaste"
Application.CommandBars("Edit").Controls("Paste Special...").OnAction = "TrappedPaste"
Application.CommandBars("Cell").Controls("Paste").OnAction = "TrappedPaste"
Application.CommandBars("Cell").Controls("Paste Special...").OnAction = "TrappedPaste"
Application.OnKey "^v", "TrappedPaste"
Else
Application.CommandBars("Edit").Controls("Paste").OnAction = ""
Application.CommandBars("Edit").Controls("Paste Special...").OnAction = ""
Application.CommandBars("Cell").Controls("Paste").OnAction = ""
Application.CommandBars("Cell").Controls("Paste Special...").OnAction = ""
Application.OnKey "^v"
End If
End Sub
Этим мы фиксируем главное меню, контекстное меню и клавишу Ctrl-V - этого должно быть достаточно. Свойство OnAction переходит к подпрограмме, содержащейся в аргументе
Sub TrappedPaste()
If ActiveSheet.ProtectContents Then
' as long as sheet is protected, we don't paste at all
MsgBox "Sheet is protected, all Paste/PasteSpecial functions are disabled." & vbCrLf & _
"At your own risk you may unprotect the sheet." & vbCrLf & vbCrLf & _
"When unprotected, you can copy/paste from other text, WORD, HTML or EXCEL files." & vbCrLf & _
"All Paste operations will implicitly be executed as PasteSpecial/Values", _
vbOKOnly, "Paste"
Exit Sub
End If
' silently do a PasteSpecial/Values
On Error GoTo TryExcel
' try to paste text
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
Exit Sub
TryExcel:
On Error GoTo DoesntWork
Selection.PasteSpecial xlPasteValues
Exit Sub
DoesntWork:
MsgBox "Sorry - wrong format for pasting", vbExclamation + vbOKOnly, "PasteSpecial ..."
End Sub
Я добавляю это, потому что это показывает, что вам нужно немного заботиться о том, что находится в буфере (excel, text, html и т. Д.)
Вам потребуется заменить ядро процедуры TrappedPaste () кодом, который
1) вставляет содержимое в скрытый лист / диапазон (вы можете использовать код выше)
2) снимает защиту целевого листа
3) перемещает содержимое в ячейку целевого диапазона за ячейкой при условии, что
4) целевая ячейка удовлетворяет условию отсутствия блокировки, проверки или подобного
5) повторно защищает целевой лист
6) очистить скрытый лист / диапазон
Обратите внимание, что с такой конструкцией пользователь не сможет использовать функцию UNDO!
Надеюсь, это поможет - Удачи MikeD