Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
diego_janjao

VBA - Cálculo com célula anterior

Recommended Posts

diego_janjao    99

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

Editado por diego_janjao

Compartilhar este post


Link para o post
Compartilhar em outros sites
CasaDoHardware    130

Nao testei mas tente isso

 

Troque esta linha

 

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

Por esta 

 

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

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
diego_janjao    99
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Basole    483

    * foi enviado em duplicidade (por favor excluir, moderadores)

    Editado por Basole

    Compartilhar este post


    Link para o post
    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

     

    Editado por Edson Luiz Branco
    Anexo equivocado
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    diego_janjao    99
  • Autor do tópico
  • @Basole , infelizmente não consegui baixar o seu arquivo, mas te conhecendo com certeza atenderia minhas necessidades.

     

    @Edson Luiz Branco, funcionou perfeitamente. Muito obrigado pela ajuda e principalmente pela explicação.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

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

    ×