Very interesting. Not sure it's effective to code around training issues. Still, a very interesting scenario.
Okay, this one is a little tricky and requires a bit of tricky coding to work around so I've commented it a bit heavier than usual to make sure you'll be able to understand how it works.
Place the following code as the worksheet_change function of the worksheet you want to "protect":
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'Reverts any changed value back if not pasted from clipboard which requires DataObject functionality.
'To use DataObject add the reference (Tools>References): Microsoft Forms 2.0 Object Library
Dim oDataObj As New DataObject, oPos As Range, oAct As Range
Dim sFromClip As String, sValue As String, bRevert As Boolean
'The below commented if then shows how you can exit if not a specific column or row so only what you
'want to protect will be processed.
' if target.Row <> [Row you are protecting] or target.Column <> [column you are protecting] then exit sub
If Target.Count > 1 Then Exit Sub 'if cell range of source is > 1 cell then it's a copied range
'Selection and active cell will revert to changed cell if reversion occurs.
'To prevent this we'll manually store it and set it back if it does
Set oPos = Selection
Set oAct = ActiveCell
'Get clipboard content. If the format isn't recognized, revert value
oDataObj.GetFromClipboard
If oDataObj.GetFormat(1) = False Then
bRevert = True
Else
'If the format is recognized, strip out cr and lf from compare strings.
'An extra cr and lf are added to text value of range when range is copied
sFromClip = Replace(oDataObj.GetText(1), vbLf, "")
sFromClip = Replace(sFromClip, vbCr, "")
sValue = Replace(Target.Value, vbLf, "")
sValue = Replace(Target.Value, vbCr, "")
If sFromClip <> sValue Then bRevert = True
End If
If bRevert Then
Application.EnableEvents = False 'Disable events so undo doesn't fire this event
Application.Undo 'Undo to revert to previous
'Reselect and activate appropriate cell(s) after undo
oPos.Select
oAct.Activate
Application.EnableEvents = True 'Re-enable events to allow coded events to fire again.
End If
End Sub
Hope this helped and that the remarks within the code made what is being done more understandable.