Как в рабочей книге заблокировать стандартные кнопки, команды и горячие клавиши, которые отвечают за копирование?

Для того, чтобы в нужной рабочей книге "заблокировать" использование команд Вырезать, Копировать, Вставить, Специальная вставка и Формат по образцу, а также горячих клавиш CTRL+X, CTRL+C, CTRL+V скопируйте нижеприведенный код в модуль ThisWorkbook (ЭтаКнига) нужной рабочей книги.

code: #vba
Private Sub Workbook_Activate()
    ChangeEnvironment
End Sub
 
Private Sub Workbook_Deactivate()
    RestoreEnvironment
End Sub
 
Private Sub ChangeEnvironment()
 
Dim iCommandBar As CommandBar
Dim iFindControl As CommandBarButton
 
With Application
     .OnKey Key:="^x", Procedure:="No_Copy" ' ""
     .OnKey Key:="^c", Procedure:="No_Copy" ' ""
     .OnKey Key:="^v", Procedure:="No_Copy" ' ""
     .CellDragAndDrop = False 'Снятие опции перетаскивать ячейки
     For Each iControlID In Array(19, 21, 22, 108, 369, 370, 755)
         For Each iCommandBar In .CommandBars
             Set iFindControl = iCommandBar.FindControl _
             (Id:=iControlID, Visible:=False, Recursive:=True)
             If Not iFindControl Is Nothing Then
                 iFindControl.OnAction = "No_Copy"
                 If (iCommandBar.Protection And msoBarNoCustomize) = 0 Then _
                 iCommandBar.Protection = msoBarNoCustomize
             End If
         Next
     Next
End With
 
End Sub
 
Private Sub RestoreEnvironment()
 
Dim iCommandBar As CommandBar
Dim iFindControl As CommandBarButton
 
With Application
     .OnKey Key:="^x": .OnKey Key:="^c": .OnKey Key:="^v"
     .CellDragAndDrop = True 'Установка опции перетаскивать ячейки
     For Each iControlID In Array(19, 21, 22, 108, 369, 370, 755)
         For Each iCommandBar In .CommandBars
             Set iFindControl = iCommandBar.FindControl _
             (Id:=iControlID, Visible:=False, Recursive:=True)
             If Not iFindControl Is Nothing Then
                 iFindControl.Reset
                 If (iCommandBar.Protection And msoBarNoCustomize) <> 0 Then _
                 iCommandBar.Protection = msoBarNoProtection
             End If
         Next
     Next
End With
 
End Sub
 
Private Sub No_Copy(): End Sub 'В любом стандартном модуле

В принципе тоже самое, только во второй версии передача аргументов осуществляется по позиции, а не по имени, как в первом случае, кроме того здесь не используется метод Reset объекта CommandBarButton, увеличивается количество обращений к объекту Application и нет проверок - защищена или нет панель инструментов, на которой находится найденная кнопка, последнее, естественно, приводит к тому, что мы лишний раз мучаем объект CommandBar (т.е., к примеру, 'защищаем' объект CommandBar у которого значение свойства и так msoBarNoCustomize)

code: #vba
Private Sub Workbook_Activate()
    DisabledCopyPaste msoBarNoCustomize
End Sub
 
Private Sub Workbook_Deactivate()
    DisabledCopyPaste msoBarNoProtection, ""
End Sub
 
Private Sub DisabledCopyPaste(iProtection%, Optional iMacros$ = "No_Copy")
    Dim iCommandBar As CommandBar
    Dim iFindControl As CommandBarButton
 
    If iProtection = msoBarNoCustomize Then
       Application.OnKey "^x", iMacros
       Application.OnKey "^c", iMacros
       Application.OnKey "^v", iMacros
    Else
       Application.OnKey Key:="^x"
       Application.OnKey Key:="^c"
       Application.OnKey Key:="^v"
    End If
    Application.CellDragAndDrop = Not CBool(iProtection)
 
    For Each iControlID In Array(19, 21, 22, 108, 369, 370, 755)
        For Each iCommandBar In Application.CommandBars
            Set iFindControl = iCommandBar.FindControl(, iControlID, , False, True)
            If Not iFindControl Is Nothing Then
                iFindControl.OnAction = iMacros
                iCommandBar.Protection = iProtection
            End If
        Next
    Next
End Sub
 
Private Sub No_Copy(): End Sub 'В любом стандартном модуле

Данный пример нельзя использовать в MS Excel 95, т.к. там отсутствует семейство CommandBars, и он неактуален для применения в MS Excel 2000, XP по причине появления в этих версиях буфера обмена.

Поделиться:

Похожие статьи: