Excel VBA如何检测工作表中是否粘贴了某些内容

时间:2015-01-07 11:11:42

标签: excel vba excel-vba copy-paste

我首先要说的是,我在Excel和VBA方面的经验仅限于我在学校看到的内容。我有编程经验,但在其他语言。

我每周都有一个文件。该文件的结构始终相同: ID,名称,日期,1到4之间的值,非相关数据。

通过“全选”按钮(工作表的左上角,MS excel 2013中单元名称下方的小三角形)选择此数据,然后将其复制到另一个默认文件中,该文件重新编制数据以显示和过滤不同的数据基于1-4值和日期的工作表。

我的问题:如何检测何时粘贴数据?我已经尝试过Worksheet.Change事件,但粘贴命令(CTRL + V)不会触发Change事件。 另外,如何复制数据?它是逐行更新,逐个单元(哪个方向),......? 我知道一旦我能够检测到复制命令,我就可以通过调试来轻松找到最后一个问题的答案,但你永远不知道是否有人知道答案。

还有另一种更简单(或更好)的方法吗?

如果需要,可以提供更多数据和信息。

感谢您的帮助。

编辑:'......有/正在被复制?'改变为粘贴,因为它应该是。

2 个答案:

答案 0 :(得分:12)

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'答案也会奏效。

答案 1 :(得分:1)

如果您向单元格中添加一个永远不会被覆盖的公式,

Worksheet_Change 事件将完成此任务。我们假设您的数据被粘贴到A1单元格中并占据了5列。因此,请在6列和第1行中输入以下公式。

=COUNTBLANK(A1:A1048576)

现在,您已能够处理/检测粘贴事件;)