0089-Otimizando códigos do tipo Copiar / Colar

Uma das coisas mais comuns nos códigos VBA é copiar células de um ponto para outro. Origem e destino podem estar na mesma planilha, em planilhas diferentes e até em arquivos diferentes.

Normalmente a estrutura destes códigos é algo parecido com estes aqui:

Sub Macro1()
    'Copiar célula A1 da Plan1
    'para D1 na planilha Plan1
    Sheets("Plan1").Select
    Range("A1").Select
    Selection.Copy
    Range("D1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub
Sub Macro2()
    'Copiar célula A1 da Plan1
    'para D1 na planilha Plan2
    'somente como valores
    Range("A1").Select
    Selection.Copy
    Sheets("Plan2").Select
    Range("D1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, _
    Operation:=xlNone, SkipBlanks:=False, _
    Transpose:=False
    Application.CutCopyMode = False
End Sub
Sub Macro3()
    'Copiar célula A1 da Plan1
    'para D1 na planilha Plan2
    'somente como valores
    Range("A1").Select
    Selection.Copy
    Range("D1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, _
    Operation:=xlNone, SkipBlanks:=False, _
    Transpose:=False
    Application.CutCopyMode = False
End Sub

Não há nada de errado com estes códigos. Todos foram obtidos através do gravador de macros e fazem exatamente aquilo para que foram elaborados.

No entanto, nenhum deles se aproveita de uma das principais vantagens do VBA ser uma linguagem orientada para objetos: não é necessário selecionar objetos para modificar suas propriedades ou ativar seu métodos!

A Macro1 pode ser substituída por esta versão aqui:

Sub Macro1()
[A1].Copy [D1]
End Sub

O mesmo resultado com uma linha de comando apenas, ao invés de seis linhas

A Macro2 também pode ser encurtada para:

Sub Macro2()
[A1].Copy Sheets("Plan2").[D1]
End Sub

Desta vez, foram sete linhas condensadas numa só.

Finalmente chegamos à Macro3

Sub Macro3()
[A1].Copy: [D1].PasteSpecial (xlPasteValues): Application.CutCopyMode = False
End Sub

Uma linha em substituição a 8 linhas de código.

O que se ganha com isso:

  • Menos linhas sendo executadas significa código mais rápido;
  • Menos linhas no código facilitam a sua leitura;
  • Menos linhas significa que o código é escrito mais rapidamente.

Pense nisso quando criar seus próximos códigos.

In Excel We Trust

Marcado com: , , , , , , ,
Publicado em Nível: Avançado
11 comentários em “0089-Otimizando códigos do tipo Copiar / Colar
  1. Flavio disse:

    Eu tenho uma planilha em Excel que eh um “banco de dados”
    contem 40 linhas e 100 colunas com numeros

    Por outro lado eu preciso usar uma formula numa outra planilha do Excel (procv) pra buscar um determinado numero deste “banco de dados”.

    O que eu gostaria eh que esta planilha “mae” estivesse na internet
    de modo que eu pudesse rodar planilhas que buscasse os dados desta “mae”.
    Desde que conectado aa internet, naturalmente.

    Eu nao sei se fui claro. Eu nao entendo muito de banco de dados
    mas, se existisse, seria ideal para a minha aplicacao que esta minha planilha mae – estes numeros – estivessem na internet
    Como isto seria possivel?
    qual outra ideia pra conduzir este assunto?

    • Olá, Flávio.
      Esta aplicação será particular ou numa empresa.
      Se for de uma empresa é necessário que você converse com o pessoal de TI.
      Caso seja particular, você pode incluí-la em um blog ou site como uma tabela, ou partir para um BD como mySQL.
      Também não é minha área, mas se puder passar mais detalhes, vou encaminhar tua dúvida para algum dos meus amigos que trabalha com este tipo de utilização para BD.
      Abraços

  2. Sidney disse:

    Cara,
    este código é extremanente mais agil do que padrão. Show de bola!!

    tem outras dicas para agilizar ainda mais na utilização do VBA?

    abçs…

    • Olá, Sidney.
      Pode pesquisar nos posts mais antigos e acompanhe os futuros, que há bastante material sobre o VBA.
      Abraços.

      • Paulo de Tarso mascarenhas disse:

        Me desculpe desenterrar o topico, mas muito me ajudaria se eu pudesse condensar essa rotina, nao vi como edita-la a este novo modo, pode auxiliar?

        Sub passo_3()
        r = Cells(Rows.Count, “W”).End(xlUp).Row
        For i = r To 4 Step -1
        If Cells(i, 23).Value “” Then
        Sheets(“combos”).Range(“A1:z32”).Copy
        Cells(i + 1, 1).Select
        ActiveCell.Insert Shift:=xlDown
        Application.CutCopyMode = False
        End If
        Next i
        End Sub

        as 30 primeiras linhas ate que é rapido, mas depois… fica mais lento que executando manualmente….

        a planilha possui 190 linhas de registro e a cada linha é uma copia do range

  3. Thiago Berto disse:

    Adilson,
    Preciso de pegar do internet explorer.
    como faço pra copiar uma tabela do IE, para o excel???

  4. Paulo de Tarso mascarenhas disse:

    Opa… consegui realizar a mudança… realmente o ganho de performance vale muito o aprendizado

  5. Roni disse:

    Boa tarde! Como eu faria para criar uma macro que abrisse uma janela para eu selecionar um arquivo de outra pasta de trabalho e abrir na plan1 da pasta de trabalho atual ?

    • Boa noite, Roni.
      Para exibir a janela de seleção de arquivos, você pode usar as linhas de comando a seguir:
      ‘Abrir caixa de diálogo para seleção do arquivo a ser aberto
      wkToOpen = Application.GetOpenFilename(FileFilter:=”Excel Files (*.xls*), *.xls*”, _
      Title:=”Selecione o arquivo com as informações mensais de vendas”)

      ‘Se não for selecionado nenhum arquivo, é exibida uma mensagem para o usuário
      ‘e o código é interrompibo
      If wkToOpen = False Then
      txtMsg = “Nenhum arquivo foi selecionado!”
      MsgBox txtMsg, vbCritical + vbOKOnly
      Exit Sub
      End If

      ‘Abrir o arquivo selecionado
      Workbooks.Open wkToOpen

      Não entendi direito a parte de abris na plan1 da pasta atual…

      Seria para copiar o conteúdo para a plan1?

      [ ]s

  6. Adriano Sá disse:

    Bom dia,

    Preciso de uma ajuda, eu preciso copiar dados de uma linha para outra aba da planilha, mas preciso repetir essa linha de acordo com o valor que o usuário digite em uma determinada celula. Por exemplo tenho uma tabela de dados. em uma das celulas o usuários vai digitar um valor, tipo “10”, com isso na aba dois essa linha terá que repetir 10 vezes. Obrigado.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Visitas dos usuários
  • 1,963,899

Clique para assinar este blog e receber notificações de novos artigos por email.

Junte-se a 1.476 outros seguidores

Aumente sua interação

Siga-nos do twitter (@usuariosdoexcel).

Acesse o nosso fórum e compartilhe as suas dúvidas.

Curta nossa página no Facebook.

Junte-se ao grupo do LinkedIn.

Visite-nos utilizando o seu smartphone ou tablet.

Recomende este Blog
Visualizar notícias
Site monitorado:
Real Time Web Analytics

Clicky

%d blogueiros gostam disto: