Função Somases Com ...
 
Notifications
Clear all

[Resolvido] Função Somases Com Intervalo de Datas | VBA

4 Posts
2 Usuários
0 Reactions
2,716 Visualizações
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Pessoal,

Gostaria de pedir uma ajuda num projeto de controle de recebimento. O objetivo é somar todos os valores baseados em um intervalo de data, quando sinalizado com um X, porém quando uso a função fimmês (eomonth) dá erro. Anexei um exemplo para descrever melhor minha dificuldade.

Agradeço a colaboração.

Obrigado!

 
Postado : 23/04/2021 2:35 am
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Anderson,

Obrigado pelo retorno!

Sei que Excel não deve ser considerado para fins de banco de dados, entretanto, os dados que possuo não estão disponíveis em tabela Access. Sua indicação/referência de aprendizado é super válida, entretanto, não para a demanda que possuo no momento, que é basicamente sobre o problema na função eomonth do VBA (arquivo anexo).

Até pesquisei no Youtube, mas não obtive respostar para a aplicação que necessito, por isso recorri a esse canal, que sempre me ajudou ...

Como já descrevi o script, gostaria apenas de orientações sobre esse problema, o que entendi não saber ou não poder ajudar, o que mesmo assim sou grato pela atenção.

Sigo no aguardo de outra pessoa que possa ter a resposta para esse problema.

Grato!

 
Postado : 24/04/2021 10:20 am
(@anderson)
Posts: 203
Reputable Member
 

@JosenildoA

Uma coisa que estranhei é que em um campo está escrito Vrl e em outro está escrito Vlr.

Seu código é bem parecido com o do vídeo abaixo, talvez tenha se inspirado nele:

https://youtu.be/oGFh634OUaE

Do jeito que você fez o código, creio que vai gerar erro se a função SUMIFS não encontrar valores correspondentes.

Neste caso, indico que assista a este vídeo:

https://youtu.be/qSEjhOKIq4c

 

Você disse que por fórmula ficou lento.

Nunca vi um código VBA ser mais rápido que uma fórmula, mas, enfim, a planilha é sua e você faz o que achar melhor com ela.

Caso queira aprender a fazer um código que possa ser mais ágil, assista a este vídeo:

https://youtu.be/CTq_aV6XSwU

Corrigindo o seu código:

 

Option Explicit
Sub Carteira()
    Dim shDados As Worksheet
    Dim shBase As Worksheet
    
    Set shDados = Sheets("Dados")
    Set shBase = Sheets("Base")
    

    
    shDados.Range("C3") = Application.WorksheetFunction.SumIfs(shBase.Range("C:C"), _
        shBase.Range("B:B"), ">=" & CDate(shDados.Range("B3")), _
        shBase.Range("B:B"), "<=" & CDate(WorksheetFunction.EoMonth(shDados.Range("B3"), 0)))



End Sub

 

 

No campo Data, existe um espaço em branco, o que gerou um dos erros.

Outro erro foi que você se esqueceu de colocar WorsheetFunction.EoMonth.

Outro erro foi que você se esqueceu de colocar um ) após B3.

Fiz um vídeo corrigindo os erros:

https://youtu.be/ANcBH98DnS8

Sim, o VBA é feito de detalhes, o que faz muitas pessoas reclamarem que é difícil aprender VBA e até desistam.

 

Sub Carteira()
    Dim shDados As Worksheet
    Dim shBase As Worksheet
    
    Set shDados = Sheets("Dados")
    Set shBase = Sheets("Base")
    
    shDados.Range("C3") = Application.WorksheetFunction.SumIfs(shBase.Range("Tab_Base[Vrl Bruto]"), _
        shBase.Range("Tab_Base[Data ]"), ">=" & shDados.Range("B3"), _
        shBase.Range("Tab_Base[Data ]"), "<=" & WorksheetFunction.EoMonth(shDados.Range("B3"), 0))

End Sub

 

Por esses detalhes chatos do VBA é que evito usar funções prontas do Excel.

Inclusive, já vi muitas pessoas acharem mais fácil criar um código VBA que colocar uma fórmula em uma célula.

Eu mesmo faço as somas, contagens, médias, buscas... através de laços de repetição. Sem usar SUMIF, SUM, VLOOKUP etc.

Mas, se você prefere usar as funções prontas do Excel no VBA, fica a seu critério.

Fiz um vídeo sobre soma de acordo com o mês e o ano:

https://youtu.be/n5Q6VDkl-TU

Código que fiz:

 

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim LINHABASE As Long
Dim LINHADADOS As Long
Dim SOMAC As Double
Dim SOMAD As Double
Dim SOMAE As Double


LINHADADOS = 3



While shDados.Range("B" & LINHADADOS).Value <> ""

SOMAC = 0
SOMAD = 0
SOMAE = 0
If UCase(shDados.Range("F" & LINHADADOS).Value) = "X" Then

LINHABASE = 3



While shBase.Range("B" & LINHABASE).Value <> ""

If Month(shBase.Range("B" & LINHABASE).Value) = Month(shDados.Range("B" & LINHADADOS).Value) Then
If Year(shBase.Range("B" & LINHABASE).Value) = Year(shDados.Range("B" & LINHADADOS).Value) Then

SOMAC = SOMAC + shBase.Range("C" & LINHABASE).Value
SOMAD = SOMAD + shBase.Range("D" & LINHABASE).Value
SOMAE = SOMAE + shBase.Range("E" & LINHABASE).Value

shDados.Range("C" & LINHADADOS).Value = SOMAC
shDados.Range("D" & LINHADADOS).Value = SOMAD
shDados.Range("E" & LINHADADOS).Value = SOMAE

End If
End If



LINHABASE = LINHABASE + 1


Wend



End If


LINHADADOS = LINHADADOS + 1


Wend





End Sub
Este post foi modificado 4 anos atrás 21 vezes por Anderson

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 24/04/2021 6:02 pm
(@jalmeida)
Posts: 43
Trusted Member
Topic starter
 

Anderson, boa noite!

Desculpe a demora na resposta. 

Suas orientações foram super válidas e todo o processo funcionou.

Muito obrigado pela parceria e atenção na solução deste problema.

Obrigado também pela gentileza da postagem do vídeo, foi de extrema importância, não só para mim mas para todos os que tiverem a mesma dúvida que eu.

Obrigado a todos do canal que de certa forma, também apoiaram.

Abcs,

 
Postado : 24/06/2021 10:02 pm