impedir que un usuario pueda pegar, pero permitir pegar valores

impedir que un usuario pueda pegar, pero permitir pegar valores

Tengo el siguiente código en mi libro de trabajo, que impide que un usuario pueda pegar nada.

Mis necesidades ahora han cambiado y quiero poder permitir que el usuario pegue valores únicamente.

Hay una manera de lograr esto ?

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

Respuesta1

Este código VBA debería hacer eso:

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

Respuesta2

Según mi respuesta anterior, ¿funcionaría esto?

Entonces verificamos si algo está pegado, luego guardamos el valor, deshacemos el pegado y volvemos a insertar solo el valor.

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

Si la sugerencia en los comentarios no es una mejor solución.

Respuesta3

Otro enfoque que probé con éxito podría ser este:

Secuestra CTRL+C y CTRL+V, haz que solo pegue valores especiales.

Entonces, usando el código de su libro de trabajo original, pero reemplazando

Application.OnKey "^c", ""

con

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

Luego haz un módulo con lo siguiente:

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

Y ahora puedes copiar y pegar, pero solo moverá el valor.

información relacionada