Notifications
Clear all

macro para somar conforme foi inserindo dados

7 Posts
3 Usuários
0 Reactions
2,002 Visualizações
(@barison28)
Posts: 0
New Member
Topic starter
 

Bom dia,

eu tenho esse codigo para ir somando conforme eu digito mas eu preciso que de certo com mais celulas mas não estou conseguindo mudar.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$30" Then Exit Sub
[C11] = [C11] + [C30]

eu digito na c30 um valor e vai somando na c11 acumulando mas eu preciso somar a as demais celulas abaixo:

digito na c31 e soma na c12
c32 -c13
c33 - c14
c34 - c15
c36 - c16
c37 - c38

alguem poderia me ajudar?

 
Postado : 21/11/2017 6:58 am
(@evilmaax)
Posts: 0
New Member
 

Coloca a planilha em anexo para facilitar

 
Postado : 21/11/2017 7:09 am
(@barison28)
Posts: 0
New Member
Topic starter
 

eu conseguir mudar o código para que desce certo mas agora eu queria que ao inves de clicar no botão para limpar os valores teria como digitar um valor a celular c30 soma acumulativo conforme vai digitando na c11 e apos digitar na c11 limpava o valor permanecendo em branco a celular para um novo valor.

 
Postado : 21/11/2017 8:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Seria algo próximo disso?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C30:C200")) Is Nothing Then
    '[C11] = [C11] + [C30]
        If Target.Address <> "" Then
            ActiveCell.Offset(-19, 0).Value = Target.Value + ActiveCell.Offset(-19, 0).Value
        End If
    End If
End Sub

Att

 
Postado : 21/11/2017 10:19 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo que entendi, se definiu o Range inicial para Digitação C30 e o que irá receber a Soma C11, então temos de trabalhar com os intervalos : Range("C11:C29") e Range("C30:C48"), já que ao se digitar em C49 não queremos alterar em C30 pois é o Range inicial.
Desta forma, e mais uma vez se entendi corretamente, ao se digitar entre C30 e C48 os valores serão lançados e ou somados no intervalo C11 a C29, e ao apagar entre o intervalo C11 a C29 limpar as celulas correspondentes no intervalo C30 a C48, se for isto, aproveitando a rotina do Alexandre e aprimorando para se evitar erros, podemos utiizar da seguinte forma:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo msgErro

    Application.EnableEvents = False

    'Refere-se ao Range "C11:C29"
    If Not Intersect(Target, Range("C11:C29")) Is Nothing Then
         
            'Captura a linha a ser limpa
            sLin = ActiveCell.Offset(19, 0).Row
            
            'Se for a linha maior ou igual a 49 sai da rotina
            If sLin >= 49 Then Exit Sub
            
            'Limpa a Celula
            ActiveCell.Offset(19, 0).ClearContents
            
    'Refere-se ao Range "C30:C48"
    ElseIf Not Intersect(Target, Range("C30:C48")) Is Nothing Then
         
        'Captura a linha a ser lançada o valor
        sLin = ActiveCell.Offset(-20, 0).Row
    
        'Se for a linha maior ou igual a 30 sai da rotina
        If sLin >= 30 Then Exit Sub
            
        ActiveCell.Offset(-20, 0).Value = Target.Value + ActiveCell.Offset(-20, 0).Value
    
    End If

continue:
    Application.EnableEvents = True
    Exit Sub
msgErro:
    MsgBox Err.Description
    Resume continue
    
End Sub

[]s

 
Postado : 21/11/2017 11:44 am
(@barison28)
Posts: 0
New Member
Topic starter
 

seria esse codigo para que de certo na planilha.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C30:C200")) Is Nothing Then
    '[C11] = [C11] + [C30]
        If Target.Address <> "" Then
            ActiveCell.Offset(-20, 0).Value = Target.Value + ActiveCell.Offset(-20, 0).Value
        End If
    End If
End Sub

mas eu quero que ao digitar algo nas celulas c30 a 37 apos digitar o valor ele seria apagado..... ex: digita na c30 soma na c11(acumulado pois tem varias pesagens no dia) e o conteudo que acabei de colocar na c30 fosse apagado mas manteria a soma na c11.

 
Postado : 21/11/2017 11:50 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Então não foi da forma que entendi, veja se agora acertamos :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sLin As Long
    
    Application.EnableEvents = False
    
    If Not Intersect(Target, Range("C30:C37")) Is Nothing Then
    '[C11] = [C11] + [C30]
        If Target.Address <> "" Then
            
            'Captura a linha a ser lançada o valor
            sLin = ActiveCell.Offset(-20, 0).Row
            
            'Se for a linha 30 sai da rotina sem somar
            If sLin >= 30 Then Exit Sub
            
            'Se for apagado (deletado) o valor sai da rotina sem alterar
            If Target.Value = "" Then GoTo fim
            
            ActiveCell.Offset(-20, 0).Value = Target.Value + ActiveCell.Offset(-20, 0).Value
        
        End If
        
    End If
    
fim:
    Application.EnableEvents = True
 
End Sub

[]s

 
Postado : 21/11/2017 12:16 pm