Option Explicit

'Variable to determine if cell with validation was pasted over
Dim bCopyReady As Boolean

'Variables to hold validation properties for reapplication
Dim vAlertStyle As XlDVAlertStyle
Dim vErrMsg As String
Dim vErrTtl As String
Dim vForm1 As String
Dim vForm2 As String
Dim vIgBlank As Boolean
Dim vInCell As Boolean
Dim vInpMsg As String
Dim vInpTtl As String
Dim vOperator As XlFormatConditionOperator
Dim vShwErr As Boolean
Dim vShwInp As Boolean
Dim vType As XlDVType

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim sTemp As String
    
    'Test to see if cell has validation
    On Error Resume Next
    sTemp = Target.Validation.ErrorMessage
    
    If Err.Number = 1004 Then 'it does not
    
        On Error GoTo 0
        
        If bCopyReady Then 'if it had validation before the paste
        
            'then add the validation back
            Target.Validation.Add vType, vAlertStyle, vOperator, vForm1, vForm2
            With Target.Validation
                .ErrorMessage = vErrMsg
                .ErrorTitle = vErrTtl
                .IgnoreBlank = vIgBlank
                .InCellDropdown = vInCell
                .InputMessage = vInpMsg
                .InputTitle = vInpTtl
                .ShowError = vShwErr
                .ShowInput = vShwInp
            End With
            
            'see if new pasted value is valid
            If Not Target.Validation.Value Then
                MsgBox "Value is not valid"
                SendKeys "{F2}" 'I hate sendkeys, but what to do
            End If
            
        End If
    End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim sTemp As String
    
    If Application.CutCopyMode Then 'user is ready to paste
    
        'See if cell has validation
        On Error Resume Next
        sTemp = Target.Validation.ErrorMessage
        
        If Err.Number = 0 Then 'Target has validation
        
            On Error GoTo 0 'reset error handling
            bCopyReady = True 'module level variable to store
                               'whether the cell had validation
        
            'Record all aspects of the validation
            With Target.Validation
                vAlertStyle = .AlertStyle
                vErrMsg = .ErrorMessage
                vErrTtl = .ErrorTitle
                vForm1 = .Formula1
                vForm2 = .Formula2
                vIgBlank = .IgnoreBlank
                vInCell = .InCellDropdown
                vInpMsg = .InputMessage
                vInpTtl = .InputTitle
                vOperator = .Operator
                vShwErr = .ShowError
                vShwInp = .ShowInput
                vType = .Type
            End With
        Else
            bCopyReady = False 'target did not have validation
        End If
    Else
        bCopyReady = False 'user is not ready to paste
    End If

End Sub