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