Ir ao conteúdo
  • Cadastre-se

Desabilitar Copiar/Colar VBA Excel


Posts recomendados

Pessoal, boa tarde.

 

Estou com um pequeno problema e agradeceria a ajuda.

 

Preciso que uma determinada planilha seja bloqueada a função de copiar e colar (não posso simplesmente proteger, pois preciso de um intervalo editável).

 

Entre vários códigos que procurei (inclusive por aqui), esse foi o melhor que encontrei:

 

___

 

Private Sub Workbook_Activate()
Dim oCtrl As Office.CommandBarControl
 
'Desabilita todos os comandos de Recortar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=21)
            oCtrl.Enabled = False
     Next oCtrl
 
'Desabilita todos os comandos de Copiar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = False
     Next oCtrl
 
        Application.CellDragAndDrop = False
 
End Sub
 
Private Sub Workbook_Deactivate()
Dim oCtrl As Office.CommandBarControl
 
'Habilita todos os comandos de Recortar
 
     For Each oCtrl In Application.CommandBars.FindControls(ID:=21)
            oCtrl.Enabled = True
     Next oCtrl
 
'Desabilita todos os comandos de Copiar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = True
     Next oCtrl
 
        Application.CellDragAndDrop = True
 
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    With Application
        .CellDragAndDrop = False
        .CutCopyMode = False 'limpa a área de transferência
    End With
End Sub
___
 
Para a função de proibir a cópia/cola, funcionou perfeitamente!
 
No entanto, quando fui executar outras macros da planilha deu errado. No formulário, há uma macro que copia o texto inserido e empilha depois em uma base e por causa desse Cutcopymode, o texto copiado se perde todo.
 
Tentei deixar essa parte da macro condicionada a alguma planilha ou células ou ser interrompida em determinado momento. Mas não consegui.
 
Se alguém puder me ajudar.
 
valeu!
 
Abs!
 
Link para o comentário
Compartilhar em outros sites

DJunqueira, obrigado pela resposta. Mas este não é o foco da minha duvida.

Eu não posso simplesmente proteger a planilha e deixar alguns intervalos editáveis porque essa permissão tb inclui colar e copiar.

Eu queria que o usuário pudesse escrever nas células, mas não copiar e colar.

Link para o comentário
Compartilhar em outros sites

Fernando,

E se você, ao invés de utilizar copiar e colar dentro da sua macro, utilizar as instruções de Range = Range?

Por exemplo, se você quiser copiar os dados do intervalo A1:A100 na aba "Plan1"  e colar na aba "Plan2" no intervalo "B1:B100", basta você passar esta instrução:

Sheets("Plan2").Range("B1:B100").Value = Sheets("Plan1").Range("A1:A100").Value

Abraço

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Fernando

 

No seu código, na operação que copia/cola, é utilizado o comando "Select"? Se sim, talvez substituindo esse comando seu problema seja solucionado.

Outras sugestões, ainda mantendo os seus códigos atuais:

opção1 - no seu código, antes do comando que copia/cola, reative a Área de Transferência e depois daquele comando volte a limpar aquela Área, assim:

......Application..CutCopyMode = True 'ativa a área de transferênciacomando que copia/colaApplication..CutCopyMode = False 'limpa a área de transferência......


opção2 - conforme sugeriu o "ScientiaArca" no post #4, substitua o seu comando copia/cola por um comando de igualdade, assim:
em lugar de um comando do tipo  copia de "A1" e cola em "X4"
utilize   "X4" = "A1"
 

Link para o comentário
Compartilhar em outros sites

Basole, obrigado pela resposta. A sua planilha, no entanto, gera a mesma dificuldade da que eu estou usando (o cutcopymode)!

 

ScientiaArca e Osvaldomp, muito obrigado também pela ajuda. A ideia do range = range foi ótima! Não conhecia esse código. Vou estudar a possibilidade de substituição na minha macro.

 

Mas ainda sobre o código que postei, alguém sabe me explicar essa função:

 

 For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = True
     Next oCtrl
 
Pelo que pesquisei, ela desabilita os botões que ficam na Barra de Ferramentas, certo? Sendo cada ID um controle.
Mas na macro ela parece não funcionar. Se eu conseguisse resolver isso, me ajudaria bastante nessa e em outras planilhas que estou trabalhando. Se alguém souber me explicar...
 
Mais uma vez, obrigado.
 
Abs!
Link para o comentário
Compartilhar em outros sites

Mas ainda sobre o código que postei, alguém sabe me explicar essa função:

 

 For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = True
     Next oCtrl
 
Pelo que pesquisei, ela desabilita os botões que ficam na Barra de Ferramentas, certo? Sendo cada ID um controle.
Mas na macro ela parece não funcionar. Se eu conseguisse resolver isso, me ajudaria bastante nessa e em outras planilhas que estou trabalhando. Se alguém souber me explicar...
 

 

Esse comando aí acima reativa o botão "Copiar" no menu. O outro comando, (ID:=21), refere-se ao botão "Recortar". Esses botões são desabilitados pela macro Sub Workbook_Activate(), que roda ao ativar o arquivo e são reabilitados pela macro Sub Workbook_Deactivate que roda ao desativar o arquivo. Essas macros atuam para impedir que o usuário faça o Copiar/Colar via menu.

 

Por outro lado, para impedir o Copiar/Colar e também o Colar por Arrastamento, via mouse, é este outro código que atua Sub Workbook_SheetSelectionChange, inibindo o arraste ou limpando a Área de Transferência.

 

O mais provável é que este último código é o que está provocando o problema, seja por utilizar a Área de Transferência seja por utilizar "Select".

 

Sugiro que você faça um teste assim: desabilite os dois primeiros códigos reproduzidos no post #1 e deixe somente o terceiro. Em seguida rode o seu código, aquele que Copia/Cola e veja o resultado.

 

Se você preferir, para facilitar a ajuda, disponibilize uma amostra do seu arquivo com todos os códigos instalados, mostrando o antes e o depois de rodar o seu código Copia/Cola.

Link para o comentário
Compartilhar em outros sites

@osvaldomp

 

Esse comando aí acima reativa o botão "Copiar" no menu. O outro comando, (ID:=21), refere-se ao botão "Recortar". Esses botões são desabilitados pela macro Sub Workbook_Activate(), que roda ao ativar o arquivo e são reabilitados pela macro Sub Workbook_Deactivate que roda ao desativar o arquivo. Essas macros atuam para impedir que o usuário faça o Copiar/Colar via menu.

 

Poise, Osvaldo, foi o que eu tinha entendido (apenas me confundi com o True e False)!

 

Mas o problema é que isso desabilita não a barra de ferramentas, mas o menu que se abre com o botão direito. Pelo que eu li em várias outras macros que usavam esse código e pelo próprio nome do comando (commandbars), eu esperava que desabilitasse aqueles botões na Barra de Ferramentas (na guia "Página Inicial").

 

Mas não é! Olha o que acontece:

 

5vrXSq.jpg

 

Existem três formas mais usadas para se copiar/colar: 1)Botão direito; 2) Atalho no teclado (ctrl + c/v); e 3)Barra de Ferramentas;

 

Esse código e um outro que eu testei conseguem desabilitar os dois primeiros, mas não consegui de jeito nenhum desabilitar a BF.

 

Se eu conseguisse, não precisaria usar o cutcopymode=false, que pode me atrapalhar em outras funções.

 

Acha que é possível desabilitar a BF?

 

Vou disponibilizar o arquivo mais tarde.

 

valeu... Abs!

Link para o comentário
Compartilhar em outros sites

Atraves do link q postei, seguindo o passo a passo consegui fazer um exemplo (anexo).

 

Baixei o editor de Ribbon : http://www.rondebruin.nl/win/winfiles/OfficeCustomUIEditorSetup.zip

Instalei o editor, criei uma nova planilha, renomei como teste, abri o editor e escolhi a opcao do meu office: 2010 (vide imagem)

UIEditor1.png

e inseri o codigo abaixo: 

<customUI  xmlns="http://schemas.microsoft.com/office/2006/01/customui" > <commands > <command enabled="false" idMso="ShowClipboard"/> <command enabled="false" idMso="Paste"/> <command enabled="false" idMso="Cut"/> <command enabled="false" idMso="Copy"/> <command enabled="false" idMso="FormatPainter"/> <command enabled="false" idMso="PasteMenu"/> </commands >  </customUI > 

teste.xlsx

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...