Ir ao conteúdo
  • Cadastre-se

VBA - Cálculo com célula anterior


Posts recomendados

Pessoal, bom dia.

 

Mais uma dúvida: 

 

Tenho um código que faz os cálculos em Range específico, porém eu preciso que ele calcule com os dados da célula anterior, exemplo:

Ao colocar o valor em C1, ele soma 1750 e divide por B1, mas o código só calcula a divisão com uma célula específica, e eu queria que ele sempre fizesse com a coluna anterior, exemplo:

 

em C2 ele tem que dividir por B2, em C3 dividir por B3... acredito que seja alguma coisa com Colum 

Option Explicit
Public Valor As Variant, Interv As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
   Set Interv = Range("H11:H100") ' Estabelece o intervalo
   If Not Intersect(Target, Interv) Is Nothing Then
     If Target.Cells.Count > 1 Then Target(1, 1).Select
     Valor = Target(1, 1).Value
   End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Not Intersect(Target, Interv) Is Nothing Then
      If IsNumeric(Valor) And IsNumeric(Target.Value) Then
        Application.EnableEvents = False
          Target.Value = (Target.Value + 1750) / [F11]
        Application.EnableEvents = True
      End If
  End If
End Sub

Ficha de Análise - Pão de Milho.7z

Link para o comentário
Compartilhar em outros sites

Em 10/12/2016 às 21:15, CasaDoHardware disse:

Nao testei mas tente isso

 

Troque esta linha

 

Target.Value = (Target.Value + 1750) / [F11]

Por esta 

 

Target.Value = (Target.Value + 1750) / Target.Row

Fiz aqui e não deu certo.

 

@DJunqueira , tentei adequar a sua ideia a minha mas também sem sucesso.

Olhando a sua planilha, realmente seria mais fácil fazer com fórmula normal, mas o que eu queria era o mesmo que do outro tópico, que o resultado aparecesse na mesma célula que eu digito o valor. No meu caso, ao digitar 1000 na célula H11, ela deverá somar 1750 e dividir por F11, ou seja, ao colocar 1000 em H11, H11 se transformará em 5,5. 

 

É isso que eu preciso que a planilha faça

 

Ficha de Análise - Pão de Milho.7z

adicionado 24 minutos depois

Fazendo uns testes aqui agora, esse código funciona:

 

Option Explicit
Public Valor As Variant, Interv As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
   Set Interv = [H11:H100] ' Estabelece o intervalo
   If Not Intersect(Target, Interv) Is Nothing Then
     If Target.Cells.Count > 0 Then Target(1, 1).Select
     Valor = Target(1, 1).Value
   End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Not Intersect(Target, Interv) Is Nothing Then
      If IsNumeric(Valor) And IsNumeric(Target.Value) Then
        Application.EnableEvents = False
          Target.Value = (Target.Value + 1750) / 500 'Trocar esse 500 por um comando que leia a célula anterior a que está sendo digitada
        Application.EnableEvents = True
      End If
  End If
End Sub

Na parte de (Target.Value + 1750) / 500, estes 500 é que devem ser alterados para um comando que leia a célula a esquerda desta que estamos digitando.

Link para o comentário
Compartilhar em outros sites

Diego, bom dia.

você pode se referir à célula da esquerda, no lugar do 500, como Target.Offset(0,-1).Value. Note entretanto que você está com células mescladas, e a coluna Peso não está na coluna anterior e sim duas colunas à esquerda. Ou seja, ao invés de Offset(0,-1), teria q usar Offset(0,-2)

adicionado 24 minutos depois

Mais um detalhe

Como você não necessita armazenar o valor que estava na célula antes de ser atualizada, não se faz mais necessária a variável "Valor". Também como não será mais necessário a rotina no evento SelectionChange, então a range "Interv" não precisa mais ser global e pode ser interna à rotina do evento Change. Seu código poderia ser:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  Dim Interv As Range, Denominador As Variant
  Set Interv = Me.Range("H11:H100") 'Alterar intervalo interceptável aqui
  If Not Intersect(Target, Interv) Is Nothing Then
     Denominador = Target.Offset(0, -2).Value 'Usa o valor de 2 colunas à esquerda
                                              'e não 1, pois as células estão mescladas
     If IsNumeric(Target.Value) And _
        IsNumeric(Denominador) And _
        Denominador <> 0 Then
          Application.EnableEvents = False
            Target.Value = (Target.Value + 1750) / Denominador
          Application.EnableEvents = True
     End If
  End If
End Sub

 

  • Curtir 1
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...