Notifications
Clear all

Soma Condicional

6 Posts
1 Usuários
0 Reactions
1,461 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Olá pessoal.

Estou com mais um problema, vamos logo ao exemplo. Imaginem uma planilha em cada linha possua uma movimentação de uma conta, cada conta possui os seguintes dados: data de inclusão, descrição, tipo de conta, valor e status. Este último indica se a conta já foi paga ou não. A minha dúvida é a seguinte, eu preciso somar as contas que já foram pagas num determinado período e que sejam da mesma categoria. Por exemplo. Uma conta em 10/10/2011 do tipo bancária no valor de 100,00 e com o status PAGO, deve ser somado a conta de 09/10/2011 também do tipo bancária, no valor de 50,00 e com o status PAGO. O resultado vai ser colado em uma outra planilha que lista os tipos de conta, no exemplo usado, o "tipo bancária" terá seu valor atualizado de 150,00.

A minha linha de raciocínio me diz que devo classificar a tabela pelo status, depois pelo tipo de conta e depois pela data. Até esse ponto eu consegui resolver, o problema está em somar para cada tipo de conta, já que podem ser mais de 100 tipos, isso depende do cadastro de uma outra tabela. Imaginei que se usasse "For each...Next" conseguiria resolver o problema de criar variáveis suficientes para representar os tipos de contas, mas essa instrução pede uma coleção, então tentei usar "Definir Nomes" para criar essa coleção ai percebi que essa coleção é limitada e não pode ser uma lista formada pelo usuário (pelo menos não pode ser criada por um usuário iniciante como eu auhsuash)

Agradeço a ajuda.

 
Postado : 10/10/2011 4:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite cranio89

Não usei VBA, mas te envio em anexo um exemplo utilizando a função SOMARPRODUTO com os critérios periodo de datas, Status, tipo de conta.


Dê retorno.

Um abraço.

 
Postado : 10/10/2011 6:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Patropi, vc chegou muito perto. Mas há muitas variáveis que não foram consideradas. Em primeiro lugar, o numero de movimentações aumenta sempre que um formulário no vba é preenchido, dessa forma não posso ficar fixando as referencias. O tipo de conta também aumenta, por um outro formulário caso o usuário ache necessário, mas isso poderia ser resolvido colando a formula na nova categoria. As datas "inicial" e "final" devem ser omitidas ao usuário, na realidade sempre serão o primeiro e o último dia do mês respectivamente.

De qualquer forma sua ajuda me abriu a mente, já tenho idéia de como resolver esse problema via vba. Só falta saber se conseguirei sanar esse problema.

 
Postado : 10/10/2011 7:09 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Patropi, percebi uma dose exagerada de genialidade na sua idéia, eu já consegui resolver o meu problema, mas tive que criar várias limitações e o código ficou muito extenso para apenas uma simples atualização. Como ele é executado na abertura do meu sistema o meu código faz o programa rodar depois de uns 25 segundos caso exista um número grande de movimentações. Bom, com a sua idéia de usar a fórmula "somarproduto" o código ficaria bem reduzido, mas para usá-lo em vba está dando erro sempre, pois a variável que contém o texto "PAGO" não é substituída com as ASPAS para a fórmula, sendo assim, quando a rotina cola a fórmula o texto vai para a tabela sem ASPAS e a fórmula acaba dando o resultado errado tipo #NOME?

Abaixo segue um pedaço do código que exemplifica a minha dúvida.

Dim A
Dim B
A = ActiveCell.Offset(0, -4)
B = "PAGO"
ActiveCell.Formula = "=SUMPRODUCT((PAGARCATEGORIA = " & A & ")*(PAGARSTATUS = " & B & ")*(PAGARVALOR))"

PAGARCATEGORIA, PAGARSTATUS e PAGARVALOR, são regiões já definidas e que não estão erradas pois já testei.

Caso você, ou alguém, consiga resolver esse problema eu ficaria satisfeitíssimo

Muito obrigado.

 
Postado : 12/10/2011 9:17 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Sem macro. Não é necessário atualizar os combos. Basta ingressar os dados na base e restringir-se às células em vermelho (parâmetros).

Me diga se atende.

Abs,

 
Postado : 13/10/2011 3:33 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Não posso fazer isso sem VBA, estou criando um programinha de finanças e preciso que seja tudo automatizado, mas vendo o que o Mandrix mandou na tabela eu consegui resolver via vba.

abaixo segue o código


Public Sub CALCULASALDO()
' CALCULA AO SALDO FINAL DAS CONTAS
' CLASSIFICA AS CONTAS
    Sheets("CADASTROCONTA").Select
    Range("A3:F53").Select
    ActiveWorkbook.Worksheets("CADASTROCONTA").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("CADASTROCONTA").Sort.SortFields.Add Key:=Range("C4:C53"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("CADASTROCONTA").Sort.SortFields.Add Key:=Range("F4:F53"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("CADASTROCONTA").Sort.SortFields.Add Key:=Range("B4:B53"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("CADASTROCONTA").Sort
        .SetRange Range("A3:F53")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' CLASSIFICA O FLUXO
    Sheets("FLUXO").Select
    Range("A3:K50003").Select
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("F4:F50003"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("G4:G50003"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("K4:K50003"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("FLUXO").Sort
        .SetRange Range("A3:K50003")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' SOMA O SALDO TOTAL DAS CONTAS DO USUÁRIO
    Dim DEBITO As Currency
    Dim CREDITO As Currency
    Dim LIN As Integer
    Dim LINB As Integer
    Dim CD As String
    Dim MSG As String
    DATA = 0
    DEBITO = 0
    CREDITO = 0
    LIN = 4
    LINB = 4
    Do While Worksheets("CADASTROCONTA").Cells(LIN, 2).Value <> ""
        If Worksheets("CADASTROCONTA").Cells(LIN, 2).Value = Worksheets("FLUXO").Cells(LINB, 7).Value And Worksheets("FLUXO").Cells(LINB, 6).Value = "FECHADO" Then
            If Worksheets("FLUXO").Cells(LINB, 8).Value = "C" Then
                If CDate(Format(Worksheets("FLUXO").Cells(LINB, 11).Value, "DD/MM/YYYY")) >= DateAdd("M", -1, CDate(Format(Worksheets("CADASTROCONTA").Cells(LIN, 6).Value, "DD/MM/YYYY"))) And CDate(Format(Worksheets("FLUXO").Cells(LINB, 11).Value, "DD/MM/YYYY")) <= CDate(Format(Worksheets("CADASTROCONTA").Cells(LIN, 6).Value, "DD/MM/YYYY")) Then
                    If Worksheets("FLUXO").Cells(LINB, 10).Value = "D" Then
                        DEBITO = DEBITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                        LINB = LINB + 1
                    ElseIf Worksheets("FLUXO").Cells(LINB, 10).Value = "C" Then
                        CREDITO = CREDITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                        LINB = LINB + 1
                    Else
                        LINB = LINB + 1
                    End If
                Else
                    LINB = LINB + 1
                End If
            Else
                If Worksheets("FLUXO").Cells(LINB, 10).Value = "D" Then
                    DEBITO = DEBITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                    LINB = LINB + 1
                ElseIf Worksheets("FLUXO").Cells(LINB, 10).Value = "C" Then
                    CREDITO = CREDITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                    LINB = LINB + 1
                Else
                    LINB = LINB + 1
                End If
            End If
        Else
            LINB = LINB + 1
        End If
        If Worksheets("FLUXO").Cells(LINB, 2).Value = "" Then
            Worksheets("CADASTROCONTA").Cells(LIN, 5).Value = CREDITO - DEBITO
            If Worksheets("CADASTROCONTA").Cells(LIN, 4).Value > Worksheets("CADASTROCONTA").Cells(LIN, 5).Value And Worksheets("CADASTROCONTA").Cells(LIN, 3).Value <> "N" Then
                MSG = MsgBox("A CONTA " & Worksheets("CADASTROCONTA").Cells(LIN, 2).Value & " ULTRAPASSOU O LIMITE ESTABELECIDO, POR FAVOR, VERIFIQUE POSSÍVEIS ERROS, OU SE É NECESSÁRIO A ATUALIZAÇÃO DA COTA, OU AINDA, SE O VALOR REALMENTE SERÁ LANÇADO NEGATIVO.", vbOKOnly, "CUIDADO LIMITE ULTRAPASSADO")
            End If
            LIN = LIN + 1
            LINB = 4
            CREDITO = 0
            DEBITO = 0
        End If
    Loop
End Sub

 
Postado : 08/02/2012 9:49 am