запретить пользователю вставлять данные, но разрешить вставлять значения

запретить пользователю вставлять данные, но разрешить вставлять значения

В моей рабочей книге есть следующий код, который не позволяет пользователю вообще что-либо вставлять.

Теперь мои потребности изменились, и я хочу иметь возможность разрешить пользователю только вставлять значения.

Есть ли способ этого добиться?

Private Sub Workbook_Activate()
    Application.CutCopyMode = False
    Application.OnKey "^c", ""
    Application.CellDragAndDrop = False
End Sub
Private Sub Workbook_Deactivate()
    Application.CellDragAndDrop = True
    Application.OnKey "^c"
    Application.CutCopyMode = False
End Sub
 Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    Application.CutCopyMode = False
    Application.OnKey "^c", ""
    Application.CellDragAndDrop = False
End Sub
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
    Application.CellDragAndDrop = True
    Application.OnKey "^c"
    Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Application.OnKey "^c", ""
    Application.CellDragAndDrop = False
    Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Application.CutCopyMode = False
End Sub
Private Sub Workbook_Open()
    MsgBox "Copying and Pasting into the skills matrix has been disabled to prevent changes in the workbook functionality."
End Sub

решение1

Этот код VBA должен это сделать:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    On Error Resume Next
    Target.PasteSpecial xlPasteValues
    Application.CutCopyMode = True
End Sub

решение2

Исходя из моего предыдущего ответа, будет ли это работать?

Поэтому мы проверяем, вставлено ли что-то, затем сохраняем значение, отменяем вставку и повторно вставляем только значение.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim UndoList As String, StoreValue As String
UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)
If Left(UndoList, 5) = "Paste" Then
    StoreValue = Target.Value
    With Application
        .EnableEvents = False
        .Undo
    End With
    Target.Value = StoreValue
End If
Application.EnableEvents = True
End Sub

Если предложение в комментариях не является лучшим решением.

решение3

Другой подход, который я успешно опробовал, может быть таким:

Перехват сочетания клавиш CTRL+C и CTRL+V, чтобы можно было вставлять только специальные значения.

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

Application.OnKey "^c", ""

с

Application.OnKey "^{v}", "pasteValues"
Application.OnKey "^{c}", "copyValues"

Затем создайте модуль со следующим содержимым:

Public copyVal As String
Private Sub pasteValues()
selection = copyVal
End Sub
Private Sub copyValues()
copyVal = selection
End Sub

Теперь вы можете копировать и вставлять, но это только переместит значение.

Связанный контент