VBA: Como interceptar um Colar – Past Event

Novembro 2016

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


Método

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

Código

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)
'No momento de 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

Exemplo de uso

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

Conclusão

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 mudam a planilha, como o Copiar.

Foto: © Microsoft.com

Veja também :
Este documento, intitulado « VBA: Como interceptar um Colar – Past Event »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.