VBA: como interceptar um Colar – Past Event

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


Como interceptar um Colar

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

Onde colocar o 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)
'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

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

Foto: © Microsoft.com
Artigo original publicado por pijaku. Tradução feita por ninha25. Última modificação: 23 de fevereiro de 2018 às 03:29 por pintuda.
Este documento, intitulado 'VBA: como interceptar um Colar – Past Event', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (https://br.ccm.net/) ao utilizar este artigo.
VBA: Variáveis das tabelas - funções úteis
VBA: Limites do método “Transpose”