Tag Archives: Copiar

VBA – Criando uma cópia somente dados de uma planilha no Excel

Mais uma que saiu do nosso fórum.

O pessoal precisou de uma macro no VBA para criar uma cópia dos dados da planilha (Worksheet) em uma nova, mas somente os dados, sem fórmulas. Como alguns devem saber, isso é simples usando o recurso Colar Especial->Valores. Mas como o mundo é exigente, precisamos fazer isso a “rodo”, e é nesse caso que as macros ajudam.

A macro abaixo faz uma cópia da planilha atual, copiando somente seus dados:

Sub CopiaSomenteConteudo()
    Dim NewSheet As Worksheet, CurrentSheet As Worksheet
    'pega a planilha atual
    Set CurrentSheet = ActiveSheet
    'cria uma nova planilha
    Set NewSheet = ThisWorkbook.Worksheets.Add
    NewSheet.Name = CurrentSheet.Name & "2"
    'copia todas as células da planilha ativa
    CurrentSheet.Cells.Copy
    'cola só os valores na nova planilha
    NewSheet.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'zera os objetos
    Set NewSheet = Nothing
    Set CurrenSheet = Nothing
End Sub

Simples, rápido, eficaz. Isso é Excel + VBA.

Bom proveito!

VBA – Copiando comentários de uma planilha para outra no Excel

Os fóruns de discussão são bacanas por gerarem situações das mais diversas, o que por consequência acaba gerando soluções que são de igual teor e variedade.

Mais uma que surgiu da necessidade de um colega, a macro abaixo copia todos os comentários de uma planilha do Excel para uma outra informada:

Sub CopiarComentarios(ByVal PlanilhaOrigem As String, ByVal PlanilhaDestino As String)
    Dim wsOrigem As Worksheet, wsDestino As Worksheet
    Dim c As Comment
    Dim r As Range
 
    Set wsOrigem = ThisWorkbook.Worksheets(PlanilhaOrigem)
    Set wsDestino = ThisWorkbook.Worksheets(PlanilhaDestino)
 
    For Each c In wsOrigem.Comments
        Debug.Print c.Parent.Address
 
        Set r = wsDestino.Range(c.Parent.Address)
 
        r.AddComment
        r.Comment.Visible = c.Visible
        r.Comment.Text Text:=c.Text
    Next
End Sub

Sem muito segredo, o código percorre a coleção de comentários (Comments) existente na planilha origem informada. Para cada comentário encontrado, é criado um na planilha destino com os mesmos dados e referências de célula.

Para fazer uma chamada a esta macro, segue um exemplo:

Sub Teste()
    Call CopiarComentarios("Plan1", "Plan2")
End Sub

Que solicita obviamente que os comentários da planilha de nome Plan1 sejam copiados para a planilha de nome Plan2. Para testar, é só copiar o código para um módulo VBA, inserir alguns comentários na Plan1 e executar a macro Teste.

Bom proveito!

Impedir Copiar / Colar no Excel com VBA

Não é raro ver essa necessidade em fóruns de Excel que frequento. Por isso, coloco abaixo uma possível solução.

O código abaixo impede via VBA que o usuário utilize a funcionalidades Copiar e Colar no Microsoft Excel. De quebra, ainda desabilita os botões copiar, e recortar das barras de ferramenta padrão do Excel.

Especificamente, o código trata os principal evento de navegação entre células, desativando o contexto CutCopyMode, o que faz com que a marcação do copiar e consequentemente a opção de colar do usuário. Para não atrapalhar o funcionamento de outras planilhas, o código trata também os eventos Workbook_Activate e Workbook_Deactivate, reativando o contexto e os botões das operações em questão.

Todo o código deve ser colocado no módulo EstaPasta_de_Trabalho no VBA (ThisWorkbook em inglês).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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

Nem preciso dizer que é preciso ativar as macros para a que o código funcione. Também não preciso lembrar que não ha como ativar as macros automaticamente, a não ser que utilize o recursos de certificados digitais do Office.

Abraços

Tomás Vásquez
http://www.tomasvasquez.com.br