Gostaria de saber se posso criar uma fórmula para excluir uma linha que contenha uma data somada de 30 dias.

Anônima
2014-06-18T13:12:35+00:00

Quero criar uma lista de atividades, com uma data em A1 e a descrição da atividade em B1 e inserir uma fórmula para excluir a linha 1 (A1 e B1) se a data atingir 30 dias. Ou seja, ao abrir a pasta de trabalho as linhas que tiverem completadas 30 dias já estarão excluídas.

Microsoft 365 e Office | Excel | Para uso doméstico | Windows

Pergunta bloqueada. Essa pergunta foi migrada da Comunidade de Suporte da Microsoft. É possível votar se é útil, mas não é possível adicionar comentários ou respostas ou seguir a pergunta.

0 comentários Sem comentários

Resposta aceita pelo autor da pergunta

Anônima
2014-06-18T14:28:39+00:00

Olá André!

Não considero como uma boa prática no Excel apagar os valores da forma que você descreveu, pois você perderá todo o histórico de suas atividades. E falando sobre a sua pergunta, através de fórmula não é possível excluir linhas, o que você pode fazer é criar em outra planilha um relatório que te liste somente as atividades que ainda não completaram 30 dias.

Caso queira mesmo apagar as linhas, a sua necessidade só pode ser atendida através de algum código em VBA. Segue um exemplo de código abaixo para o modelo de tabela da imagem que contém na coluna C o cálculo dos dias corridos (fórmula em C2: =HOJE()-A2) :

Aperte ALT + F11 para abrir o VBA, localize do lado esquerdo a opção "Estapasta_de_trabalho" do arquivo que você está trabalhando, dê duplo clique para abrir a área de edição de código desta planilha e digite insira o Código VBA:

O código em texto é:

Private Sub Workbook_Open()

Sheets("Plan1").Select

Range("C1").Select

Do Until ActiveCell.Value = ""

If ActiveCell.Value >= 30 And IsNumeric(ActiveCell.Value) = True Then

 ActiveCell.Rows("1:1").EntireRow.Select

    Selection.Delete Shift:=xlUp

 ActiveCell.Offset(0, 2).Range("A1").Select

Else

ActiveCell.Offset(1, 0).Range("A1").Select

End If

Loop

Range("A1").Select

End Sub

Caso sua planilha de valores não seja "Plan1" é preciso substituir o nome na linha de código.

Mas ainda sou a favor de você trabalhar com a criação de outros relatórios na planilha do que VBA. Para que o código fique salvo no arquivo você deve salvar o arquivo como Pasta habilitada para macro do Excel.

Abraços!

Esta resposta foi útil?

0 comentários Sem comentários

12 respostas adicionais

Classificar por: Mais útil
  1. Anônima
    2015-04-18T04:13:14+00:00

    Obrigado Rafael , agora esta mais claro.

    Tdao

    Esta resposta foi útil?

    0 comentários Sem comentários
  2. Anônima
    2015-04-17T12:40:50+00:00

    Olá Tadao!

    Explicando sua dúvida, da forma que havia feito:

    ActiveCell.EntireRow.Select'escrito anulando o Rows("1:1")

    Selection.Delete Shift:=xlUp

    O comando ActiveCell.EntireRow.Select seleciona toda a linha da célula ativa e a célula ativa da linha passa a ser a célula da coluna A. O próximo comando apaga a linha, e a célula ativa continua na coluna A, por isso é necessário fazer o deslocamento (offset) duas células para a direita para voltar para a coluna C. O comando rows("1:1") se tornou opcional, pois ele define a altura da seleção, ou seja, se o argumento fosse "1:3" ao invés de "1:1", seriam selecionadas as três linhas para baixo a partir da célula ativa, mas quando o argumento é omitido, o VBA interpreta como 1 linha só, por isso que retirei do código.

    Quanto troquei o trecho acima pelo trecho:

    ActiveCell.EntireRow.Delete Shift:=xlUp

    Neste comando o VBA já entende que é para deletar toda a linha da célula ativa e a célula ativa se mantém na coluna C, por isso não é necessário ser feito o deslocamento com o offset.

    A dica que dou para você entender a diferença dos códigos é realizar a depuração de cada um dos códigos pressionando a tecla F8 continuamente e com a janela do VBA reduzida de forma que você consiga ir enxergando na planilha as operações realizadas por cada linha de código. Desta forma ficará mais clara a diferença de cada código.

    Abraços!

    Esta resposta foi útil?

    0 comentários Sem comentários
  3. Anônima
    2015-04-17T08:52:41+00:00

    Obrigado pelo retorno Rafael.

    Acho que quando testei a primeira solucao eu tinha mudado o Range("c1"). select para Range(" c2"). select, por isso nao tinha dado problema de apagar o titulo.

    Antes de testar a rotina, nao estava entendendo o que seria o Rows(1:1) do codigo ActiveCell.Rows("1:1").EntiredRows.Select e para saber como o cursor agia, coloquei ActiveCell.Rows("1:1").Select para ver a posicao do cursor onde iria mover. Notei que o cursor continuava na coluna "C" e entao conclui que poderia cancelar o Rows("1:1") e coloquei no lugar o codigo ActiveCell.EntireRow.Select e rodei o programa.

    Acho que o Row("1:1") equivale ao Rows(1) que por sua vez equivale ao offset(0) ,Rows(2) equivale a offset(1),e assim por diante.

    Na sua ultima rotina voce resumiu as linhas

    ActiveCell.EntireRow.Select 'escrito anulando o Rows("1:1")

    Selection.Delete Shift:=xlUp

    para

    ActiveCell.EntireRow.Delete Shift:=xlUp

    que eu acho que e a mesma coisa, mas no primeiro caso a linha continua sendo selecionada e precisa do comando ActiveCell.Offset(0,2).Range("A1").Selectsenao  no proximo loop vai para a coluna "A", e na sua ultima rotina notei que voce nao colocou no programa a linha ActiveCell.Offset(0,2).Range("A1").Select .

    Porque deve acontecer isso?

    Sera que os comandos tambem tem suas delimitacoes e dao esses tipos de coisas?

    Desculpe por ser muito detalhista, e que eu estou tentando entender um pouco do assunto e se der para esclarecer na medida do possivel agradeceria.

    Tadao

    Esta resposta foi útil?

    0 comentários Sem comentários
  4. Anônima
    2015-04-15T12:33:41+00:00

    Olá Tadao!

    Sobre seus questionamentos:

    1-Sera que o codigo do programa " ActiveCell.Offset(0, 2).Range("A1").Select" esta a mais ou tem outra          finalidade?

    R: O comando Offset é o equivalente à função DESLOC do Excel, onde baseado num endereço de referência é feito o deslocamento de acordo com o número de linhas e colunas indicados e é possível definir a altura e largura do resultado indicando a quantidade de colunas e linhas. Nesse código, essa linha foi colocada porque existe uma linha anterior com o códigoActiveCell.Rows("1:1").EntireRow.Selecte devido este comando a célula ativa passa a ser na coluna A e não na C, por isso é necessário deslocar novamente a referência 2 colunas para a direita para voltar para a coluna C e continuar a análise no laço de repetição avaliando os valores da coluna C. A instrução .Range("A1") poderia ser retirada da fórmula, pois ela é a que indica a largura e altura, mas como quero uma única célula a instrução pode ser retirada, portanto essa linha poderia ser resumida porActiveCell.Offset(0, 2).Select

    2-Na linha do If "If ActiveCell.Value >= 30 And IsNumeric(ActiveCell.Value) = True Then", qual seria a   diferenca se tirasse a condicao And e escrevesse "If ActiveCell.Value >= 30 Then".R: O comando IsNumeric foi colocado com a intenção de não apagar o titulo, pois o laço foi inciado a partir da célula C1. Seria possível retirar esse comando se o laço começasse na célula C2.

    3-Na linha seguinte "ActiveCell.Rows("1:1").EntireRow.Select", se vai selecionar so a linha da celula ativa, porque coloca o Rows("1:1").

    R: Neste caso o comando Rows("1:1") pode ser retirado. O que ocorreu é que quando montei o código parti de uma macro gravada pelo gravador de macros utilizando referências relativas. Quando utilizamos esse recurso, nem sempre os códigos gerados são os mais resumidos e eficientes. Na época desse post reconheço que meu conhecimento em VBA era bastante limitado, e ainda é, mas tenho buscado estudar e desenvolver mais a cada dia.

    Quando se fala de Excel, existem muitas maneiras de chegar ao resultado. Algumas mais trabalhosas que outras. Neste caso, hoje se eu fosse fazer esse código novamente escreveria da seguinte forma:

    Sub Apagar_Linhas_Mais_de_30dias()

    Application.Goto Sheets("Plan1").Range("C2")

    Do Until ActiveCell.Value = ""

    If ActiveCell.Value >= 30 Then

    ActiveCell.EntireRow.Delete Shift:=xlUp

    Else

    ActiveCell.Offset(1, 0).Select

    End If

    Loop

    Range("A1").Select

    End Sub

    Te incentivo mesmo a continuar estudando. O Campo de VBA é muito amplo e a principio complexo, mas com o tempo e com dedicação a mente vai se abrindo.

    Abraços!

    Esta resposta foi útil?

    0 comentários Sem comentários