
A função Colar em uma planilha não é um evento para o Excel, embora seja possível simulá-lo.

O que acontece quando o usuário realiza uma função de Colagem? Independentemente do tipo de Colagem (Colar, Colagem especial, etc.), essa função aciona uma mudança na planilha (são inseridos novos dados) e uma adição na lista de possíveis ações a serem canceladas (Undo). Qualquer alteração feita em uma planilha do Excel aciona o Workbook_SheetChange. Assim sendo, é possível interceptar o Colar através deste evento.
Aqui, vamos nos posicionar a nível da Planilha para controlar o Colar na planilha inteira. Você não pode fazer isso em uma única planilha utilizando o seu evento Worksheet_Change
Esse código usa um evento da planilha. Portanto, o certo é colocá-lo no módulo ThisWorkbook.
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Em qualquer mudança nas planilhas do arquivo Excel
Dim C As String, I As Long
'verifica-se na barra de ferramentas
With Application.CommandBars("Padrão")
I = .FindControl(ID:=128).Index
a última ação que é possível cancelar
C = .Controls(I).List(1)
End With
‘ Trata-se de um Colar > lançamos nosso procedimento
If C = "Colar" Then minhaMacro
End Sub
Neste exemplo, o usuário deseja interceptar o Colar, Cancelar e Recuperar o conteúdo da área de transferência para modifica-lo (mudança de linhas, colunas, etc.).
Observação: este procedimento requer assinalar a referência Microsoft Forms 2.0 Object Library (para o dataObject). Para isso, no VBE, vá em Ferramentas > Referências:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As String, I As Long
With Application.CommandBars("Padrão")
I = .FindControl(ID:=128).Index
C = .Controls(I).List(1)
End With
MsgBox C
If C = "Colar" Then minhaMacro
End Sub
Sub maMacro()
Dim Área_de_Transferência As String
'cancela-se o Colar
With Application
'desativar os eventos, caso contrário o Undo vai acionar novamente SheetChange
.EnableEvents = False
.Undo
'reativação dos eventos
.EnableEvents = True
End With
'recuperar o conteúdo da área de transferência
Área_de_Transferência = GetPressPapier
'Aqui a ação a realizar
MsgBox Área_de_Transferência
End Sub
Function Get Área deTransferência () As String
'Fonte: http://excel.developpez.com/faq/?page=Áreadetransferência#RecupÁreadetransferência
'necessita ativar a referência "Microsoft Forms 2.0 Object Library".
With New dataObject
.GetFromClipboard
Get ÁreadeTransferência = .GetText(1)
End With
End Function
Este dica também pode interceptar outras ações do usuário, tais como Células a Inserir. Se você quiser saber os nomes exatos da lista de ações para cancelar (Undo), use este código:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim C As String, I As Long
With Application.CommandBars("Padrão")
I = .FindControl(ID:=128).Index
C = .Controls(I).List(1)
End With
MsgBox C
End Sub
No entanto, através deste método, não podemos interceptar funções que não mudem a planilha, como o Copiar.
Foto: © Microsoft.com