Copiar fórmula até ...
 
Notifications
Clear all

Copiar fórmula até última linha que possua conteúdo.

8 Posts
2 Usuários
0 Reactions
1,830 Visualizações
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Prezados,
boa tarde!

Uma dúvida simples eu acredito, mas que não consegui encontrar uma solução boa. Tenho uma base com um template montado, em determinado grupo de células, possuem algumas fórmulas... A idéia é sempre que eu imputar outra base nesse template, as fórmulas dessas células, sejam replicadas até a última linha desse arquivo imputado...

Vejam o anexo para melhor entendimento... Eu tentei fazer com o gravador de macros, mas como essa base a ser imputada sempre mudará o número de linhas, não consegui montar uma lógica...

Obrigado!

 
Postado : 03/05/2018 1:13 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

ericksant,

Veja se é assim.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 03/05/2018 1:44 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 
Option Explicit
Sub CopiarFórmula()
    Dim i As Long
    Dim UltimaLinha As Long
    
    UltimaLinha = Sheets("Planilha1").Cells(Cells.Rows.Count, 11).End(xlUp).Row
    If UltimaLinha < 8 Then UltimaLinha = 8
    
    Range("I8:N8").Select
    For i = 9 To UltimaLinha
        Selection.AutoFill Destination:=Range("I8:N" & i), Type:=xlFillDefault
    Next
    Range("A6").Select
End Sub

Funcinou, desculpe minha ignorância, mas você poderia comentar as linhas do código, pois não consegui entender pq vc cita "i8" se as fórmulas estão nas ranges l8:n8...

Estou tentando adaptar para outro arquivo.

OBRIGADO

Correção:

O código certo seria:

Option Explicit
Sub CopiarFórmula()
    Dim i As Long
    Dim UltimaLinha As Long
    
    UltimaLinha = Sheets("Planilha1").Cells(Cells.Rows.Count, 11).End(xlUp).Row
    If UltimaLinha < 8 Then UltimaLinha = 8
    
    Range("L8:N8").Select
    For i = 9 To UltimaLinha
        Selection.AutoFill Destination:=Range("L8:N" & i), Type:=xlFillDefault
    Next
    Range("A6").Select
End Sub

Obrigado!

 
Postado : 03/05/2018 1:55 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

ericksant,

Bom dia!

Ok. Código abaixo, na íntegra, devidamente comentado. Por gentileza, vote positivamente clicando na mãozinha ao lado da ferramenta CITAR.

Sub CopiarFórmula()
    'Declara variável contadora para laço do tipo Long
    Dim i As Long
    'Declara variável para armazenar a últimalinha com dados do tipo long
    Dim UltimaLinha As Long
    
    'Armazena na variável o número da última linha com dados pela coluna 11 (K)
    UltimaLinha = Sheets("Planilha1").Cells(Cells.Rows.Count, 11).End(xlUp).Row
    
    'Verifica se a coluna k realmente possui dados e se os mesmos começam na linha 8
    If UltimaLinha < 8 Then UltimaLinha = 8
    
    'Seleciona a faixa de células com as fórmulas a serem copiadas
    Range("I8:N8").Select
    
    'Laço para varrer toda a planilha a partir da linha que receberá a primeira cópia das fórmulas
    For i = 9 To UltimaLinha
        'Pega a faixa de células com fórmulas selecionadas e arrasta para a linha a copiar (i)
        Selection.AutoFill Destination:=Range("I8:N" & i), Type:=xlFillDefault
    Next
    'Seleciona a célula A6 para desfazer a seleção das fórmulas
    Range("A6").Select
End Sub

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 04/05/2018 5:03 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Wagner,
bom dia,

Essa solução funcionou, porém a base que estou lidando, possui mais de 20 mil linhas, com esse if, fica bastante lento...
Não teria a opção de criar um código onde pegasse e copiasse a fórmula, dai descia até a última linha da coluna q possui valor, dps volta para a coluna da fórmula, e cola a fórmula ?

 
Postado : 04/05/2018 6:44 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

ericksant,

Não é o IF que está tornando a execução lenta pois ele só faz a verificação uma única vez e de uma única variável. Pode até ser que seja porque estou utilizando o recurso de arrastar fórmulas, uma vez que sua planilha tem muitas linhas.

Fiz de uma outra forma, inserindo apenas as fórmulas das coluna L, M e N uma vez que as outras colunas as fórmulas já estão inseridas. Veja se assim melhora a performance.

Outra maneira de fazer também seria efetuar os cálculos das fórmulas diretamente no VBA e inserir nas células apenas os resultados. Todavia, como existem nas fórmulas muitas condições (o que geraria no VBA muitos IF's, SELECT CASES e FOR), isso talvez possa tornar a execução ainda mais lenta.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 04/05/2018 8:13 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

ericksant,

Segue mais uma versão com o código fazendo os cálculos e inserindo nas células. Teste essa versão também para verificar como fica a performance.

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 04/05/2018 11:34 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Wagner,
boa tarde,

Muito obrigado pela ajuda! Entendi ambos os códigos, porém estou usando a seguinte lógica, veja:
Acredito que eu não especifiquei direito, a fórmula das células citadas, SEMPRE serão assim, então não há muito o que calcular e sim apenas copiar e colar ela para o resto das células que possuirem conteúdo...

Sub Macro1()

Dim lUltimaLinhaAtiva As Long

    Range("L8:N8").Select
    Selection.Copy
    Range("K8").Select
    UltimaLinhaAtiva = Planilha1.Cells(Planilha1.Rows.Count, 8).End(xlUp).Row
    Range("L" & UltimaLinhaAtiva).Select
    Range(Selection, Selection.End(xlUp)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

Enfim, mesmo assim, MUITO OBRIGADO!!!!!!

Mais uma dúvida RESOLVIDA!!!

 
Postado : 04/05/2018 1:05 pm