web-dev-qa-db-ja.com

ExcelVBAワークシートに何かが貼り付けられたかどうかを検出する方法

まず、ExcelとVBAの使用経験は、学校で見たものに限定されていると言います。私はプログラミングの経験がありますが、他の言語で。

毎週入手するファイルがあります。このファイルの構造は常に同じです:ID、名前、日付、1から4までの値、関連性のないデータ。

このデータは、[すべて選択]ボタン(ワークシートの左上隅、MS Excel 2013のセル名の下にある小さな三角形)で選択され、別のデフォルトファイルにコピーされます。このファイルは、データを再加工して、に基づいて別のシートに表示およびフィルタリングします。 1-4の値と日付。

私の質問:データが貼り付けられている/貼り付けられていることを検出するにはどうすればよいですか? Worksheet.Changeイベントを試しましたが、貼り付けコマンド(CTRL + V)でChangeイベントがトリガーされません。また、データはどのようにコピーされますか?行ごと、セルごと(どちらの方向)、...を更新しますか?コピーコマンドを検出できたらデバッグすることで、最後の質問に対する答えを簡単に見つけることができますが、誰かが答えを知っているかどうかはわかりません。

これを行うための別の、より簡単な(またはより良い)方法はありますか?

必要に応じて、より多くのデータと情報を提供できます。

ご協力ありがとうございました。

編集:「...コピーされていますか?」本来の貼り付けに変更されました。

8
Nahbyr
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

これでうまくいきました。同様のものが必要で、リストのサイズを知っている人には、@ MaciejLosの回答も機能します。

13
Nahbyr

Worksheet_Change上書きされない数式をセルに追加すると、イベントがその役割を果たします。データがA1セルに貼り付けられ、5列を占めているとします。したがって、以下の式を6.列と行1に入力します。

=COUNTBLANK(A1:A1048576)

これで、貼り付けイベントを処理/検出できるようになりました;)

1
Maciej Los