Ir ao conteúdo
  • Cadastre-se

Problema com automatização de planilha no Excel


Ir à solução Resolvido por Visitante,

Posts recomendados

Galera,

To com um probleminha já tentei resolver de várias formas, menos por VBA pois não tenho muito conhecimento, até tenho, mas não suficiente. (talvez a solução esteja aí).

O problema é o seguinte, eu tenho uma tabela na qual atualizo dezenas de valores, estes estão separados por meses e são baseados no valor de uma única célula que é atualizada todos os meses. Para deixar mais claro ver imagem em anexo. post-725006-0-89047400-1401364345_thumb.

 

Gostaria que o valor das células AB5, AC5, AD5... até DEZ (e as respectivas para os outros projetos) fossem preenchidas automaticamente. O valor delas é formado da seguinte maneira: H5-(soma de todos os meses anteriores).

 

Porém, o grande problema é que, a cada vez que eu atualizar o valor de H5, o resultado não passa para o mês seguinte, ele fica sempre no mês que foi colocado a fórmula.

PS.: os valores até MAR foram colocados à mão, já os valores de abril é dado por uma fórmula (de novo, que não se “perpetua” para os meses seguintes). E existem muito mais células do que isso, apenas resumi para facilitar.

Espero ter sido o mais claro possível.

Como posso resolver isso?

Grato

Link para o comentário
Compartilhar em outros sites

Experimente e veja se entendi corretamente.

Instale o código abaixo no módulo da planilha, assim:
1. copie o código daqui
2. clique com o direito na guia da planilha de interesse e escolha 'Exibir código'
3. cole o código na janela em branco que vai se abrir
4. feito! 'Alt+Q' para retornar para a planilha e testar

funcionamento - ao alterar o valor na coluna "H", em qualquer linha, o código vai lançar na primeira coluna vazia, mesma linha, o valor de "H" menos os valores existentes naquela linha a partir de "Y".

obs. considerei que após a coluna "AJ" as linhas estão vazias
 

Private Sub Worksheet_Change(ByVal Target As Range)  Dim LC As Long    If Target.Count > 1 Then Exit Sub      If Target.Column = 8 Then        LC = Cells(Target.Row, Columns.Count).End(xlToLeft).Column          If LC < 25 Then Cells(Target.Row, 25) = Cells(Target.Row, 8): Exit Sub          Cells(Target.Row, LC + 1) = Cells(Target.Row, 8) - _            Application.Sum(Range(Cells(Target.Row, 25), Cells(Target.Row, LC)))      End IfEnd Sub
Link para o comentário
Compartilhar em outros sites

Olá, Osvaldo

Muito obrigado pela resposta, mas não deu certo não.

 

Vou te mandar a planilha e talvez fique mais fácil pra você ver...

 

A ideia (funcionamento) do seu código está correta, porém por alguma razão não funcionou aqui...

 

Além do cálculo baseado em H (Avanço físico) existe um outro baseado na coluna J (avanço financeiro), sendo que o de cálculo do avanço físico tem um range Y:AJ enquanto que o avanço financeiro tem um range AK:AV. Ignorar a última parte "IP Ponderado"

 

Espero que fique mais claro e que você possa me ajudar :D

PLANILHA TESTE PROJ.xlsx

Link para o comentário
Compartilhar em outros sites

... mas não deu certo não.

O código que sugeri atende ao que você solicitou no post #1. Mas com base no que você relata aí abaixo, parece que agora você quer cálculos que não foram citados antes... :confused:

 

Vou te mandar a planilha e talvez fique mais fácil pra você ver...

Não ajuda em nada postar uma planilha com toneladas de dados com a esperança que eu adivinhe o que você quer após perder longo tempo para analisar. :P

Disponibilize uma planilha simplificada, com poucos dados, 5 ou 6 linhas, coloque os resultados desejados com as explicações na própria planilha de como obteve tais resultados. ;)

 

A ideia (funcionamento) do seu código está correta, porém por alguma razão não funcionou aqui...

O código que sugeri atende ao que você solicitou no post #1. Mas com base no que você relata aí abaixo, parece que agora você quer cálculos que não foram citados antes... :confused:

 

Além do cálculo baseado em H (Avanço físico) existe um outro baseado na coluna J (avanço financeiro), sendo que o de cálculo do avanço físico tem um range Y:AJ enquanto que o avanço financeiro tem um range AK:AV. Ignorar a última parte "IP Ponderado"

Desculpe, não entendi. <_<

 

Espero que fique mais claro e que você possa me ajudar :D

Link para o comentário
Compartilhar em outros sites

Tentei esclarecer o máximo possível.

  :aplausos:   :D

 

Fala, Antonio.

Testaí e retorne se precisar de algum ajuste.

Substitua o código anterior por este:

Private Sub Worksheet_Change(ByVal Target As Range)  Dim LC As Long    If Target.Count > 1 Then Exit Sub      If Target.Column = 8 And Target.Value <> "" And Cells(Target.Row, "G") = "Real." Then        If Cells(Target.Row, "AJ") <> "" Then MsgBox "DEZ já está preenchido": Exit Sub        LC = Cells(Target.Row, "AJ").End(xlToLeft).Column          If LC < 25 Then Cells(Target.Row, 25) = Cells(Target.Row, 8): Exit Sub            Cells(Target.Row, LC + 1) = Cells(Target.Row, 8) - _              Application.Sum(Range(Cells(Target.Row, 25), Cells(Target.Row, LC)))      ElseIf Target.Column = 10 And Target.Value <> "" And Cells(Target.Row, "G") = "Real." Then        If Cells(Target.Row, "AV") <> "" Then MsgBox "DEZ já está preenchido": Exit Sub        LC = Cells(Target.Row, "AV").End(xlToLeft).Column          If LC < 37 Then Cells(Target.Row, 37) = Cells(Target.Row, 10): Exit Sub            Cells(Target.Row, LC + 1) = Cells(Target.Row, 10) - _              Application.Sum(Range(Cells(Target.Row, 37), Cells(Target.Row, LC)))      End IfEnd Sub

funcionamento :

1. ao inserir novo valor em células da coluna "H", e a célula da mesma linha na coluna "G" tiver o conteúdo "Real.", o código lançará na primeira coluna vazia após "Y", mesma linha, o valor inserido em "H" menos os valores existentes naquela linha no intervalo "Y:AJ".  ;)

2. ao inserir novo valor em células da coluna "J", e a célula da mesma linha na coluna "G" tiver o conteúdo "Real.", o código lançará na primeira coluna vazia após "AK", mesma linha, o valor inserido em "J" menos os valores existentes naquela linha no intervalo "Ak:AV". ;)

Link para o comentário
Compartilhar em outros sites

Vou precisar fazer o mesmo para alguns outros dados, em outra planilha. O que devo mudar no código?

 

Se a estrutura da outra planilha for idêntica e se os procedimentos a serem executados pelo código também serão idênticos àquela em que foi instalado o código, é só instalar o código no módulo da outra planilha. :)

Se não for, sugiro que você disponibilize a outra planilha com as explicações, de forma semelhante ao seu post #6 ( :joia: ).

Link para o comentário
Compartilhar em outros sites

Osvaldo,

ainda no mesmo problema, o de alterar o valor de um dado em uma célula e ele fazer a conta pra dar o resultado.

Gostaria de saber se é possível alterar a planilha na qual o valor é alterado.

 

Deixe-me explicar melhor:

 

- Atualmente o código que você fez qualquer alteração feita na coluna "H" na linha que tenha "Real." realiza uma operação de subtração deste valor de H e joga na próxima linha vazia no range Y:AJ.

- O que eu gostaria agora era que essa "coluna H" fosse em outra planilha, mas que a operação fosse realizada na mesma planilha (a que é feita atualmente), seria algo =MENU!H5-SOMA(Y5:AB5) ao invés de =H5-Soma(Y5:AB5).

 

Deu pra entender? :D

Link para o comentário
Compartilhar em outros sites

  • Solução

- Atualmente o código que você fez qualquer alteração feita na coluna "H" na linha que tenha "Real." realiza uma operação de subtração deste valor de H e joga na próxima linha vazia no range Y:AJ.

- O que eu gostaria agora era que essa "coluna H" fosse em outra planilha, mas que a operação fosse realizada na mesma planilha (a que é feita atualmente), seria algo =MENU!H5-SOMA(Y5:AB5) ao invés de =H5-Soma(Y5:AB5).

 

 

Instale este código no módulo da planilha na qual você fará os lançamentos nas colunas "H" e "J".

O código efetuará os cálculos com os dados existentes na planilha "MENU" e nela lançará os resultados.

O cálculo, bem como o resultado, serão efetuados na linha de mesmo número da linha em que houver a alteração em "H" ou "J" da planilha que contiver este código.

Caso o código postado antes esteja instalado no módulo da planilha "MENU" remova-o.

 

Private Sub Worksheet_Change(ByVal Target As Range)  Dim LC As Long    If Target.Count > 1 Then Exit Sub      If Target.Column = 8 And Target.Value <> "" And Cells(Target.Row, "G") = "Real." Then              With Sheets("MENU")        If .Cells(Target.Row, "AJ") <> "" Then MsgBox "DEZ já está preenchido": Exit Sub        LC = .Cells(Target.Row, "AJ").End(xlToLeft).Column          If LC < 25 Then .Cells(Target.Row, 25) = .Cells(Target.Row, 8): Exit Sub            .Cells(Target.Row, LC + 1) = .Cells(Target.Row, 8) - _              Application.Sum(.Range(.Cells(Target.Row, 25), .Cells(Target.Row, LC)))      End With            ElseIf Target.Column = 10 And Target.Value <> "" And Cells(Target.Row, "G") = "Real." Then              With Sheets("MENU")        If .Cells(Target.Row, "AV") <> "" Then MsgBox "DEZ já está preenchido": Exit Sub        LC = .Cells(Target.Row, "AV").End(xlToLeft).Column          If LC < 37 Then .Cells(Target.Row, 37) = .Cells(Target.Row, 10): Exit Sub            .Cells(Target.Row, LC + 1) = .Cells(Target.Row, 10) - _              Application.Sum(.Range(.Cells(Target.Row, 37), .Cells(Target.Row, LC)))      End With            End IfEnd Sub
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

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

×
×
  • Criar novo...