Notifications
Clear all

Calcular intervalo de datas

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

Pessoal estou começando a faculdade e surgiu um problema. O professor passou um exercicio para calcular intervalo de datas. Até ai blz. Mais quando vou rodar o programa o calculo não sai exato:

Exemplo: Data de nascimento: 26/11/1988
Data Atual: 26/08/2012
Resultado certo: 23
Resultado do Programa: 24

O que eu percebi é que esta pegando o intervalo de anos e não a data inteira para calculo.

Teria como pegar o intervalo inteiro "dd/mm/yyyy"?

Sub Exercicio4()

    Dim Nascimento As Date, AnoAtual As Date, Idade As Double, Idade2005 As Date, Idadeem2005 As Double
    Nascimento = InputBox("Informe a data de nascimento:")
    AnoAtual = InputBox("Digite o Ano Atual:")
    Idade = DateDiff("yyyy", Nascimento, AnoAtual)
    Idade2005 = "31 / 12 / 2005"
    Idadeem2005 = DateDiff("yyyy", Nascimento, Idade2005)
    MsgBox "Essa pessoa tem: " & Idade & Chr(13) & _
        "Sua idade em 2005 será: " & Idadeem2005
        
End Sub
 
Postado : 26/08/2012 11:56 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Cirogut,

Tente incluir a instrução abaixo no seu código:

    
    Const DiasDoAno  As Integer = 365

    With Application.WorksheetFunction
        'Calcular a quantidade de dias entre uma data e outra e dividir pela quantidade de dias no ano.
        Idade = .Days360(Nascimento, AnoAtual) / DiasDoAno
    End With

Como observação, altere a variável 'Idade' para byte, assim, o valor retornado será um número inteiro.
Sua variável AnoAtual induz o usuário a digitar apenas o ano, mas para que seu programa funcione o usuário deve digitar a data no formato "dd/mm/aaaa".

Espero ter ajudado.
Abraço

 
Postado : 26/08/2012 1:26 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Legal Felipe, porem eu não posso colocar esse códigos ainda, nem cheguei a aprender-las ainda, mais é uma saída.

Gostaria de saber se tem como mudar alguma coisa nesse "yyyy" que faça dar o resultado certo.

Idade = DateDiff("yyyy", Nascimento, AnoAtual)

 
Postado : 26/08/2012 1:39 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Cirogut,

Outra possibilidade é:

 Dim nascimento As Date
    Dim anoAtual As Date
    Dim Idade As Byte
    
    nascimento = "26/11/1988"
    anoAtual = "26/08/2012"
    Idade = Int(DateDiff("d", nascimento, anoAtual) / 365)

O 'd' da função indica a diferença em dias, que quando dividido por 365 retorna a quantidade de anos.
Nesse caso, o valor retornado é igual a 24 porque a função arredonda automaticamente, por isso o int() foi adicionado para evitar o arredondamento.

Não conheço uma forma de modificar o parâmetro 'yyyy', consultei inclusive a documentação do excel.

Abraço

 
Postado : 26/08/2012 2:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Felipe o que esse "int" pode fazer em outras ocasioes?

 
Postado : 26/08/2012 2:29 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Cirogut,

A função int() retorna o valor inteiro de um número.

 
Postado : 26/08/2012 2:36 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Felipe acabei de ver no site da microsoft que o Int(num) ele serve para arredondar um numero.

Exemplo: 23,5 na função Int() = 23

Ele sempre arredonda para o numero menor.

Valeu Felipe

 
Postado : 26/08/2012 2:39 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite!!

Outra tentativa..
Não testado.

 Sub AleVBA_Data()
    Debug.Print dhAge(CDate("26/11/1988"), CDate("26/08/2012"))
End Sub

Function dhAge(dtmBD As Date, Optional dtmDate As Date = 0) As Integer
    If dtmDate = 0 Then
        dtmDate = Date
    End If
    dhAge = DateDiff("yyyy", dtmBD, dtmDate) + _
     (dtmDate < DateSerial(Year(dtmDate), Month(dtmBD), _
      Day(dtmBD)))
End Function
 
Postado : 26/08/2012 4:01 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Ciro alem das alternativas dadas pelo Felipe e Alexandre, vc pode tb no codigo alterar no input "entre com o ano..." para "entre com a data..."
ou simplesmente no AnoAtual = Date (sem o inputbox)

Sub Exercicio4()
    Dim Nascimento As Date, AnoAtual As Date, Idade As Double, Idade2005 As Date, Idadeem2005 As Double
    Nascimento = InputBox("Informe a data de nascimento:")
    AnoAtual = Date 'InputBox("Digite o Data Atual:")
    Idade = DateDiff("yyyy", Nascimento, AnoAtual)
    Idade2005 = "31 / 12 / 2005"
    Idadeem2005 = DateDiff("yyyy", Nascimento, Idade2005)
    MsgBox "Essa pessoa tem: " & Idade & Chr(13) & _
        "Sua idade em 2005 era: " & Idadeem2005     
End Sub
 
Postado : 27/08/2012 6:33 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Ok Reinaldo mais uma coisa aprendida aqui, valeu pessoal!

 
Postado : 27/08/2012 8:36 am