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.