Página 1 de 1

Macro copia e cola linha por linha [Resolvido]

Enviado: Sáb Mai 11, 2019 5:31 pm
por DANIELDDK
Prezados, boa tarde! Tudo bem?

Gostaria de saber se alguém pode me ajudar:

Tenho uma planilha que contém duas abas, sendo que na aba 1 contém 60mil linhas, da coluna A até O, bem acontece que, gostaria de copiar linha por linha da aba 1 e colar no intervalo da aba 2, o intervalo desta ultima aba é de a2:o2, pois nesta seriam realizados alguns calculos, os números copiados da aba 1 sempre serão lançados neste intervalo, na aba 2. Tipo um loop, quando finalizar os calculos ela procuraria a próxima linha da aba 1 e colaria no intervalo da aba 2.

Já esgotei todas as fontes e nenhuma traz linha por linha, somente até a ultima linha preenchida.

Desde já agradeço

Re: Macro copia e cola linha por linha

Enviado: Sáb Mai 11, 2019 8:14 pm
por srobles
DANIELDDK,

Você quer copiar todas as 60mil linhas da aba 1 para a aba 2? Apenas uma linha? A cópia possui algum critério?

Informe com mais detalhes, ou se possível, disponibilize um modelo com poucos dados (fictcios).

Aguardo retorno.

Abs

Re: Macro copia e cola linha por linha

Enviado: Sáb Mai 11, 2019 11:45 pm
por DANIELDDK
srobles,

Primeiramente, obrigado pela atenção.

Preciso que, por exemplo:



Copie o que está na ABA 1 no intervalo A2:O2 e seja colado na ABA 2, no intervalo A2:O2;
Após, copie o que está na ABA 1 no intervalo A3:O3 e seja colado na ABA 2, no intervalo A2:O2;
Após, copie o que está na ABA 1 no intervalo A4:O4 e seja colado na ABA 2, no intervalo A2:O2;
até que chegue no ultimo intervalo preenchido da ABA 1 e finalize a cola na ABA 2.

Observe que na ABA 2 a cola será sempre no mesmo intervalo, pois nesta aba serão feitos alguns cálculos que posteriormente serão transcritos em uma outra aba (ABA 3).

Mais uma vez agradeço a atenção

Re: Macro copia e cola linha por linha

Enviado: Dom Mai 12, 2019 3:25 am
por srobles
DANIELDDK,

Esses cálculos utilizarão sempre as mesmas fórmulas / funções?
Pergunto isso pois, fazer a cópia do desse intervalo para a outra aba, aguardar o cálculo ser feito, copiar novamente para a outra aba, para só então passar para a próxima linha da aba 1, á meu ver, não vai ficar algo prático.

Se pudessemos elaborar a rotina já com as etapas de cálculos embutidas no código, já exportariamos o resultado direto para a outra aba, tornando o processo mais ágil e poupando a elaboração de um código mais extenso e sujeito á falhas.

Abs

Re: Macro copia e cola linha por linha

Enviado: Dom Mai 12, 2019 8:07 am
por DANIELDDK
srobles, bom dia, sim utilizarão sempre os mesmos calculos.

Em anexo as imagens para ficar mais claro, não consegui anexar o arquivo em Excel devido ao seu tamanho.

As formulas utilizadas na aba 2 é o cont.ses(); que verifica se as bolas que são a base para o calculo, sairam nos resultados.

Dai como não tenho muita prática em VBA, fiz uma "pequena solução de contorno :D ", criando a aba 4 para que possa trazer os resultados e assim servir de base para a aba 2.

Atenciosamente,

Re: Macro copia e cola linha por linha

Enviado: Ter Mai 14, 2019 3:04 pm
por srobles
DANIELDDK,

Acredito que você já tenha os campos formulados com cont.ses() na aba de validação, correto?

Experimente o que deixo abaixo, adicionando um módulo á pasta de trabalho, e depois chame a macro através de um botão :

Código: Selecionar todos

Sub validarDados()
    With ThisWorkbook
        'Variáveis para controle e manipulação dos dados
        Dim rangeValidacao, rangeValidado As Range
        Dim linhaOrigemInicio, linhaOrigemFinal, linhaDestino As Long
        
        Application.ScreenUpdating = False
        
        'Aba que contém os dados de Origem
        With .Sheets(1)
            'Linha inicial
            linhaOrigemInicio = 2
            'Ultima linha da aba
            linhaOrigemFinal = .Cells(Rows.Count, 1).End(xlUp).Row
        End With
        
primeiraEtapa:
        'Desabilitamos o modo copia do Excel
        Application.CutCopyMode = False
        
        'Com a Aba 1
        With .Sheets(1)
            'Ativamos
            .Activate
            
            'Laço a ser feito em cada linha da aba
            'enquanto a linha atual for diferente da ultima
            While linhaOrigemInicio <= linhaOrigemFinal
                'Selecionamos a linha da coluna A até a O
                .Range("A" & linhaOrigemInicio & ":O" & linhaOrigemInicio).Select
                
                'Copiamos os dados
                With Selection
                    .Copy
                End With
                
                'Incrementamos o valor para a proxima linha
                linhaOrigemInicio = linhaOrigemInicio + 1
                
                'Vamos para a etapa de validação
                GoTo proximaEtapa
                
            Wend
            
        End With
        
        'Ao término, exibimos a mensagem
        MsgBox "Operação concluída com sucesso!", vbInformation, "Validação de dados"
        
        Application.ScreenUpdating = True
        
        'E saimos da rotina
        Exit Sub
        
proximaEtapa:
        'Com a Aba 2
        With .Sheets(2)
            'Ativamos a aba
            .Activate
            
            'Definimos o range de destino
            'para colarmos os dados
            Set rangeValidacao = Range("A2:O2")
            
            'No intervalo determinado
            With rangeValidacao
                'Selecionamos
                .Select
                'E colamos as informações
                With Selection
                    .PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
                End With
            End With
            'Desabilitamos o modo de cópia
            Application.CutCopyMode = False
            
            'Após validarmos os dados
            'Definimos o range a ser transferido para a aba 3
            
            'Altere 2 para a linha que contém os dados já calculados
            Set rangeValidado = .Range("A2:O2")
            
            'Selecionamos o intervalo
            With rangeValidado
                .Select
                'Copiamos novamente o intervalo
                With Selection
                    .Copy
                End With
            End With
        End With
        
        'E com a Aba 3 (Aba de destino final do dados)
        With .Sheets(3)
            'Ativamos
            .Activate
            
            'Definimos qual linha irá receber os dados validados
            linhaDestino = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            
            'Selecionamos a linha na coluna A
            .Range("A" & linhaDestino).Select
                
                'Colamos os valores
                With Selection
                    .PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
                End With
                
                'Retornamos para o inicio do laço de validação
                GoTo primeiraEtapa
                
        End With
        
    End With
End Sub
Se atente para alterar a seguinte linha, onde creio que você tenha os campos com as fórmulas para validação.

Código: Selecionar todos

   'Altere 2 para a linha que contém os dados já calculados
   Set rangeValidado = .Range("A2:O2")
Espero ter ajudado.

Abs

Re: Macro copia e cola linha por linha

Enviado: Ter Mai 14, 2019 6:01 pm
por DANIELDDK
srobles, boa noite! Tudo bem?

Cara era exatamente isto que estava tentando fazer... Até encontrei um outro código neste meio tempo, mas o seu ficou perfeito...

Parabéns e sucesso,

Obrigado

srobles escreveu:
Ter Mai 14, 2019 3:04 pm
DANIELDDK,

Acredito que você já tenha os campos formulados com cont.ses() na aba de validação, correto?

Experimente o que deixo abaixo, adicionando um módulo á pasta de trabalho, e depois chame a macro através de um botão :

Código: Selecionar todos

Sub validarDados()
    With ThisWorkbook
        'Variáveis para controle e manipulação dos dados
        Dim rangeValidacao, rangeValidado As Range
        Dim linhaOrigemInicio, linhaOrigemFinal, linhaDestino As Long
        
        Application.ScreenUpdating = False
        
        'Aba que contém os dados de Origem
        With .Sheets(1)
            'Linha inicial
            linhaOrigemInicio = 2
            'Ultima linha da aba
            linhaOrigemFinal = .Cells(Rows.Count, 1).End(xlUp).Row
        End With
        
primeiraEtapa:
        'Desabilitamos o modo copia do Excel
        Application.CutCopyMode = False
        
        'Com a Aba 1
        With .Sheets(1)
            'Ativamos
            .Activate
            
            'Laço a ser feito em cada linha da aba
            'enquanto a linha atual for diferente da ultima
            While linhaOrigemInicio <= linhaOrigemFinal
                'Selecionamos a linha da coluna A até a O
                .Range("A" & linhaOrigemInicio & ":O" & linhaOrigemInicio).Select
                
                'Copiamos os dados
                With Selection
                    .Copy
                End With
                
                'Incrementamos o valor para a proxima linha
                linhaOrigemInicio = linhaOrigemInicio + 1
                
                'Vamos para a etapa de validação
                GoTo proximaEtapa
                
            Wend
            
        End With
        
        'Ao término, exibimos a mensagem
        MsgBox "Operação concluída com sucesso!", vbInformation, "Validação de dados"
        
        Application.ScreenUpdating = True
        
        'E saimos da rotina
        Exit Sub
        
proximaEtapa:
        'Com a Aba 2
        With .Sheets(2)
            'Ativamos a aba
            .Activate
            
            'Definimos o range de destino
            'para colarmos os dados
            Set rangeValidacao = Range("A2:O2")
            
            'No intervalo determinado
            With rangeValidacao
                'Selecionamos
                .Select
                'E colamos as informações
                With Selection
                    .PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
                End With
            End With
            'Desabilitamos o modo de cópia
            Application.CutCopyMode = False
            
            'Após validarmos os dados
            'Definimos o range a ser transferido para a aba 3
            
            'Altere 2 para a linha que contém os dados já calculados
            Set rangeValidado = .Range("A2:O2")
            
            'Selecionamos o intervalo
            With rangeValidado
                .Select
                'Copiamos novamente o intervalo
                With Selection
                    .Copy
                End With
            End With
        End With
        
        'E com a Aba 3 (Aba de destino final do dados)
        With .Sheets(3)
            'Ativamos
            .Activate
            
            'Definimos qual linha irá receber os dados validados
            linhaDestino = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            
            'Selecionamos a linha na coluna A
            .Range("A" & linhaDestino).Select
                
                'Colamos os valores
                With Selection
                    .PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
                End With
                
                'Retornamos para o inicio do laço de validação
                GoTo primeiraEtapa
                
        End With
        
    End With
End Sub
Se atente para alterar a seguinte linha, onde creio que você tenha os campos com as fórmulas para validação.

Código: Selecionar todos

   'Altere 2 para a linha que contém os dados já calculados
   Set rangeValidado = .Range("A2:O2")
Espero ter ajudado.

Abs

Re: Macro copia e cola linha por linha

Enviado: Ter Mai 14, 2019 6:08 pm
por srobles
DANIELDDK,

Opa que boa notícia amigo. Fico mais que satisfeito em saber que a macro tenha atendido sua necessidade.

Abs