misc.log

日常茶飯事とお仕事と

Excel VBAでペーストを検出する

※結論に到達していません。未解決。

teratailで、Excelでペーストを禁止したい、それも特定セルや列だけという質問が出ていました。

teratail.com

興味あったので少し調べてみたところ、Google検索「excell イベント paste」でstackoverflowの下記質問が出てきて……

stackoverflow.com

さらに、過去の下記質問回答が出てきました。

stackoverflow.com

ここで提示されているのは、ワークシートのチェンジイベントで

  • CommandBarの「"Standard"」→ Controls「"&Undo"」にあるアンドゥリストを見る。
  • アンドゥリストの1番目、先頭が「Paste」で始まる項目があれば「ペースとしようとしている」ということが検出できる。

という方針。ま、このあと実際にはペーストをキャンセルできるかといった話があるのですが、残念ながら今使っているOffice2016の日本語版ではこの回答にあった下記サンプルコードはそのまま動きませんでした。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim UndoList As String

  '~~> Get the undo List to capture the last action performed by user
  UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)

  '~~> Check if the last action was not a paste nor an autofill
  If Left(UndoList, 5) = "Paste" Then
    'Do stuff
  End If
End Sub

デバッガーで追ってみたところ、Application,CommandBarsの「"Standard" 」はItem(10)にあり、また、&UndoはCaptionプロパティ「元に戻す??(&)」としてItem(14)にあるので、日本語と英語の違いかと思ったのですがうまくアクセスできず。また、Undo項目の下に「List」が無い。

面白いアプローチだとおもったのですがバージョン依存か何かでダメなのか、それとも何か根本的な勘違いをしているのか。ちょっとしたパズルとして保留しておきます。