ユーザーが貼り付けるのを禁止するが、値の貼り付けは許可する

ユーザーが貼り付けるのを禁止するが、値の貼り付けは許可する

私のワークブックには以下のコードがあり、これによりユーザーは何も貼り付けることができなくなります。

ニーズが変わったため、ユーザーが値のみを貼り付けられるようにしたいと考えています。

これを実現する方法はありますか?

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

これでコピーと貼り付けが可能になりますが、値のみが移動します。

関連情報