Notifications
Clear all

Somar com critério na listview.

9 Posts
2 Usuários
0 Reactions
2,112 Visualizações
(@bracinho)
Posts: 0
New Member
Topic starter
 

Pessoal, bom dia!

O meu projeto de despesas pessoais possibilita que o usuário faça pesquisas por inúmeros critérios.

Ao apresentar os resultados de determinada pesquisa, o mesmo calcula o valor total das programações conforme imagem abaixo:

Observa que o cálculo descrimina as programações de:

ENTRADA REALIZADA
ENTRADA A REALIZAR
e
SAÍDA REALIZADA
SAÍDA A REALIZAR

Para isso, a listview carrega e oculta os dados de 4 colunas da sheets e calcula os valores através desse código:

Private Sub somar()
        Dim i As Long
        Dim valor2 As Double
        Dim valor3 As Double
        Dim valor4 As Double
        Dim valor5 As Double
          
        On Error Resume Next
   
        For i = 1 To Me.lslista.ListItems.Count
             On Error Resume Next

             valor2 = valor2 + CDbl(Me.lslista.ListItems(i).ListSubItems(11))
             valor3 = valor3 + CDbl(Me.lslista.ListItems(i).ListSubItems(12))
             valor4 = valor4 + CDbl(Me.lslista.ListItems(i).ListSubItems(13))
             valor5 = valor5 + CDbl(Me.lslista.ListItems(i).ListSubItems(14))
   
        Next i
        
        TextBox56.Text = valor2
        TextBox57.Text = valor3
        TextBox54.Text = valor4
        TextBox53.Text = valor5
        
        TextBox51.Text = CDbl(TextBox53.Text) + CDbl(TextBox54.Text)
        TextBox55.Text = CDbl(TextBox56.Text) + CDbl(TextBox57.Text)
        
         
    End Sub

O problema é que o meu projeto já tem cerca de 1500 linhas preenchidas e, por ter essas 4 colunas que efetuam esse cálculo, o mesmo fica pesado e, as vezes, aparece até a mensagem que o Excel ficou sem recursos para avaliar as fórmulas.

O que eu quero é o seguinte:

1° : Não precisar dessas 4 colunas. Vejam abaixo:

2° : Usar um código que faça tipo um somases/SOMARPRODUTO através do valor da programação, do tipo da Programação (entrada ou saída) e do status da mesma (EFETUADO OU A REALIZAR).

 
Postado : 19/10/2015 5:37 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não sei se entendi direito, mas para eliminar a soma atraves da rotina que postou, você poderia criar uma formula com as funções que citou na aba ou em outra efetuando a soma conforme os criterios selecionados nos textbox e depois puxar o resultado para o campo que deseja.
Mas uma outra duvida é que citou somente os criterios :
faça tipo um somases/SOMARPRODUTO através do valor da programação, do tipo da Programação (entrada ou saída) e do status da mesma (EFETUADO OU A REALIZAR)
Não teria os campos datas "Previsão de Pagamento" e "Vencimento" tambem como Criteiros ?

Tambem não entendi o que quis dizer com não precisar de 4 colunas.

[]s

 
Postado : 20/10/2015 6:43 am
(@bracinho)
Posts: 0
New Member
Topic starter
 

Mauro,

As quatro colunas referidas encontram-se na sheets.

Elas verificam, através de um =SE(E se a programação é de saída e se o pagamento foi efetuado ou não.

Sendo:

ok?

Essas colunas são carregadas para o listview. Ao fazer uma pesquisa, o código abaixo calculará o valor de cada coluna e preencherá os textbox's. ok?

    Private Sub somar()
            Dim i As Long
            Dim valor2 As Double
            Dim valor3 As Double
            Dim valor4 As Double
            Dim valor5 As Double
             
            On Error Resume Next
       
            For i = 1 To Me.lslista.ListItems.Count
                 On Error Resume Next

                 valor2 = valor2 + CDbl(Me.lslista.ListItems(i).ListSubItems(11))
                 valor3 = valor3 + CDbl(Me.lslista.ListItems(i).ListSubItems(12))
                 valor4 = valor4 + CDbl(Me.lslista.ListItems(i).ListSubItems(13))
                 valor5 = valor5 + CDbl(Me.lslista.ListItems(i).ListSubItems(14))
       
            Next i
           
            TextBox56.Text = valor2
            TextBox57.Text = valor3
            TextBox54.Text = valor4
            TextBox53.Text = valor5
           
            TextBox51.Text = CDbl(TextBox53.Text) + CDbl(TextBox54.Text)
            TextBox55.Text = CDbl(TextBox56.Text) + CDbl(TextBox57.Text)
           
             
        End Sub

O que eu quero é excluir essas 4 colunas da Sheets e inserir um comando após a pesquisa que faça tipo um loop nos dados apresentados na listview, somando o valor de programações de Saídas e Entradas Realizadas e A realizar, carregando os textbox's, de acordo com a figura abaixo:

Quero fazer isso com o intuito de deixar o sistema mais leve, pois já tenho mais de 1.500 linhas preenchidas na sheets e, por serem 4 colunas de apoio, o excel calcula 6000 linhas.

 
Postado : 20/10/2015 10:18 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bracinho, não precisa ficar anexando novamente o mesmo ja postado anteriormente, assim economizamos espaço no servidor.

MAs é o seguinte, o assunto deste tópico é referente a Somar com criterio no Listview, e é o que a rotina que postou faz.
Então pergunto, seu problema é quanto as formulas na planilha que tem as 4 colunas que estão sobrecarregando a mesma ou sobre o listview ?

[]s

 
Postado : 20/10/2015 10:32 am
(@bracinho)
Posts: 0
New Member
Topic starter
 

Ok Mauro, concordo que é desnecessário a reincidência dos posts.

De fato a minha rotina funciona perfeitamente e as 4 colunas são peças fundamentais, porém deixa o projeto pesado.

Eu quero uma rotina que soma através dos dados apresentados na listview após as pesquisas realizadas.

Sendo assim, as invés de eu ter as 4 colunas, eu terei uma rotina que as substituam. Ok?

 
Postado : 20/10/2015 10:43 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bracinho, continuo não entendendo a razão de citar estas 4 colunas, então vou responder somente ao solicitado, que é Somar Coluna no ListView.

Se pesquisar por "Somar Listview" encontrara varios tópicos e um eles que eu cheguei a responder - viewtopic.php?f=23&t=2752&start=10 - a rotina abaixo atendeu :

Apos o preenchiomento do Listview esta rotina esta somando a Coluna 4 do ListView, lembrando que neste controle o valor inicial das colunas começa em "0" zero, ou seja se que somar a sua coluna "Valor" tem de alterar o 3 para "5" apesar de no listview se contar seria a coluna "6".

Sub SomarItens()

    For i = 1 To ListView1.ListItems.Count
        lngRunningTotal1 = lngRunningTotal1 + CDbl(ListView1.ListItems(i).ListSubItems(3))
    Next
    
    lblTotal.Caption = lngRunningTotal1

End Sub

espero que seja isto.

 
Postado : 20/10/2015 1:34 pm
(@bracinho)
Posts: 0
New Member
Topic starter
 

Mauro,

Agradeço o seu apoio, mas eu resolvi fazendo a seguinte rotina:

Dim soma As Double
     Dim I
     
     For I = 1 To lslista.ListItems.Count

'a coluna 4 da minha listview, apresenta o tipo da programação, ou seja, se ela é de SAÍDA ou de ENTRADA (despesas ou renda).
'a coluna 8 informa-nos se a programação já foi paga ou não, ou seja, EFETUADO ou A REALIZAR.

     If lslista.ListItems.Item(I).SubItems(4) = "ENTRADA" And lslista.ListItems.Item(I).SubItems(8) = "EFETUADO" Then
     
     
     soma = soma + lslista.ListItems.Item(I).SubItems(5)
   
    ' O textbox84.text apresenta a soma das programações que são de ENTRADA  e estão efetuadas. 
     TextBox84.Text = soma
     End If
       Next I

Mauro,

Com isso, eu pude excluir as 4 colunas de apoio que realizam a verificação dessas condições.

 
Postado : 20/10/2015 1:54 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bracinho, pelas imagens que postou do listview, o mesmo ja está carregado somente com os dados já filtrados pelo Tipo = SAIDA e Pagamento = EFETUADO, então entendeu-se que queria somar a coluna Tipo já filtrada, e pela rotina que diz que resolveu, da a entender que o listview está sendo carregado com todos os dados e consequentemente os dois Tipos Saída e Entrada e não filtrados, se for isto, deveria ter dito que o mesmo é carregado com todos os dados e queria somar sem filtrar pelos criterios que citou, teria sido mais fácil o entendimento, mas o importante é que já foi resolvido.

[]s

 
Postado : 20/10/2015 10:01 pm
(@bracinho)
Posts: 0
New Member
Topic starter
 

Sim Mauro,

A listview carrega todos os dados (descrição da programação, data de pagamento, status, tipo da programação e outras informações), inclusive as 4 colunas, as quais verificam o tipo das programações (ENTRADA ou SAÍDA) e o Status das mesmas (EFETUADO ou A REALIZAR).

Sendo que a listview, como dito acima, carrega todos os dados, tive a ideia de criar uma rotina que substituísse as 4 colunas e, consequentemente, o projeto ficaria mais rápido e leve.

Com a rotina que eu adaptei, obtive êxito na minha necessidade e, se eu não me engano, a retirei de um exemplo seu aqui no planilhando. Desculpa-me por não ter copiado o link do fórum.

Obrigado pelo interesse em ajudar-me!

Valeu!

 
Postado : 21/10/2015 7:07 am