Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Leiom

Macro copiar e colar tabelas em abas diferentes

Recommended Posts

Opa pessoal, estou pesquisando sobre esta macro em vários locais e até agora ainda não consegui colocar ela para funcionar (basicamente não achei exatamente o que quero), por isso estou criando este tópico.

Tenho dois arquivos com várias abas iguais dentro deles (uma aba para cada dia do mês) e existe uma tabela em cada aba dessa que quero copiá-las em sequencia em um novo arquivo. 
O detalhe importante que ainda não consegui implementar foi copiar as tabelas a partir da primeira linha vazia da tabela copiada anteriormente, pois as tabelas nem sempre estão 100% preenchidas (ou fazer a macro ler e copiar somente as linhas com valores, mas achei que esse modo seria mais complicado). A macro teria que ser do modo:

- Abrir 'Arquivo1'
- Ler e copiar 'Tabela1.1' em Plan1
- Colar 'Tabela1.1' em 'ArquivoTabelas'
- Mudar de aba e ler e copiar 'Tabela1.2' em Plan2
- Colar 'Tabela1.2' em 'ArquivoTabelas' / começando a partir da primeira linha vazia da Tabela1.1
- Fechar 'Arquivo1'

- Abrir 'Arquivo2'
- Ler e copiar 'Tabela2.1' em Plan1 
- Colar 'Tabela2.1' em 'ArquivoTabelas' / começando a partir da primeira linha vazia da Tabela1.2
- Mudar de aba e ler e copiar 'Tabela2.2' em Plan2
- Colar 'Tabela2.2' em 'ArquivoTabelas' / começando a partir da primeira linha vazia da Tabela2.1
- Fechar 'Arquivo2'

Lembrando que essas tabelas possuem o mesmo tamanho e estão localizadas com início e fim nas mesmas linhas e colunas nas abas.

Tentei explicar bem o que quero e basicamente é isso que eu precisaria, a macro no final seria maior para incrementar com outras abas e arquivos, mas com essa base funcionando já é mais do que o suficiente!

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Pessoal, consegui fazer a colagem a partir da primeira linha vazia da colagem anterior como eu queria. A macro esta em anexo para quem quiser dar uma olhada, está 100% funcional.

    Sub Teste()
    Workbooks.Open Filename:="C:\Users\leonardo.pontes\Desktop\Nova pasta\Pasta1.xlsx"
    Windows("Pasta1.xlsx").Activate
    Sheets("Plan1").Range("A1:C6").Copy
    Windows("Macro.xlsm").Activate
    Range("A1").Select
    ActiveSheet.Paste
    Windows("Pasta1.xlsx").Activate
    Sheets("Plan2").Range("A1:C3").Copy
    Windows("Macro.xlsm").Activate
    Range("A1").Select
    Do
            If ActiveCell <> "" Then
            ActiveCell.Offset(1, 0).Select
            End If
        Loop Until ActiveCell = ""
        ActiveCell.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
    Windows("Pasta1.xlsx").Activate
    Sheets("Plan3").Range("A1:C6").Copy
    Windows("Macro.xlsm").Activate
    Range("A1").Select
    Do
            If ActiveCell <> "" Then
            ActiveCell.Offset(1, 0).Select
            End If
        Loop Until ActiveCell = ""
        ActiveCell.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
        Application.CutCopyMode = False
        
    Windows("Pasta1.xlsx").Activate
    ActiveWindow.Close
    End Sub


    O problema que me resta é que preciso ler 30 abas no mesmo arquivo e do modo que fiz até agora minha macro ficaria muito extensa. Existe algum modo de otimizar a mudança de abas nessa macro (talvez fazer um loop para mudança de abas e dentro dele esse loop que já usei para colar a partir da primeira linha vazia)? Estou chamando o arquivo base e mudando a aba e o arquivo destino "manualmente" por enquanto.

    Macro.txt

    Editado por Leiom

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Obrigado @Wendell Menezes! Vou tentar estudar o exemplo que voce deu nesse post e tentar aplicar, só não sei se vai ser tão rápido pois é um nível de macro que ainda não possuo.

    Editado por Leiom
    Esqueci o mencionar

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Pessoal, passei o dia inteiro hoje tentando mil modificações e modos diferentes, e consegui montar uma macro perfeita pro que eu estava querendo, segue o código para quem interessar.
     

    Sub Teste()
    
    Workbooks.Open Filename:="P:\3. Check list_QHH\Nova pasta\Pasta1.xlsx"
    
        For i = 1 To 30
            dias = CStr(i)
    Worksheets(dias).Select
    Range("A88:K120").Copy
    Windows("Macro.xlsm").Activate
    Range("A1").Select
    
    		Do
            	If ActiveCell <> "" Then
            	ActiveCell.Offset(1, 0).Select
            	End If
        	Loop Until ActiveCell = ""
        	ActiveCell.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
        	Application.CutCopyMode = False
    
    Windows("Pasta1.xlsx").Activate
    
        Next i
    
    Windows("Pasta1.xlsx").Activate
    ActiveWindow.Close
    
    End Sub

     

    Obrigado a todos que ajudaram. Podem fechar o tópico moderadores.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Eu trocaria essa parte:

     

    Range("A1").Select
    
    		Do
            	If ActiveCell <> "" Then
            	ActiveCell.Offset(1, 0).Select
            	End If
        	Loop Until ActiveCell = ""
        	ActiveCell.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False

    Por:

     

    Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteAll

     

    O método anterior precisa checar linha-a-linha qual é a próxima vazia, ou seja, quanto mais dados forem colados mais tempo vai levar pra macro rodar.

     

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×