Альтернативный подход заключается не в переброске Ctrl-V
, а в использовании контекстного меню.
На листе, которым вы хотите управлять, поместите следующий обработчик событий:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim tHasLock As Boolean
If IsNull(Target.Locked) Then ' at least one locked cell
tHasLock = True
Else
tHasLock = Target.Locked ' will only be true if the cell(s) are locked
End If
If tHasLock And Application.CutCopyMode <> False Then
Cancel = True
CommandBars("MyMenu").ShowPopup
End If
End Sub
Это активируется, если что-то было вырезано или скопировано и , ячейка заблокирована. В противном случае вы получите нормальное меню.
В рабочей книге вы хотите создать «MyMenu». Вы можете сделать это только один раз в Приложении, и вам придется делать это каждый раз, когда вы запускаете приложение. Вы можете сделать это на Workbook_Open
.
Private Sub CreateMenu()
Dim tMyMenu As CommandBar
Dim tMenuItem As CommandBarControl
Set tMyMenu = Application.CommandBars.Add("MyMenu", msoBarPopup)
Set tMenuItem = tMyMenu.Controls.Add(ID:=370) ' Standard Paste values menu item
tMenuItem.Caption = "Paste &Values"
End Sub
Что должно произойти, так это то, что это позволит вставить в заблокированные ячейки.
При дальнейшем тестировании - это не вставляет, как ожидалось (я сам напишу вопрос об этом для других целей, потому что специальное меню, которое я сделал для работы, вставляет в заблокированные ячейки!). Альтернатива ниже.
Private Sub CreateMenu()
Dim tMyMenu As CommandBar
Dim tMenuItem As CommandBarControl
Set tMyMenu = Application.CommandBars.Add("MyMenu", msoBarPopup)
'Set tMenuItem = tMyMenu.Controls.Add(ID:=370) ' Standard Paste values menu item
'tMenuItem.Caption = "Paste &Values"
Set tMenuItem = tMyMenu.Controls.Add(msoControlButton)
With tMenuItem
.Caption = "Special Paste"
.OnAction = "PasteasValue" '"MySpecialPasteMacroName"
End With
End Sub
Если вы уже создали специальное меню и пытаетесь создать его заново, вы получите ошибку времени выполнения (ошибка времени выполнения «5»). Просто используйте Application.CommandBars("MyMenu").Delete
, и вам будет хорошо.