bollywood actresses hair loss hair rehab london contact number cheap hair extensions brazilian curly hair with closure hair extension fails human hair wigs black ponytail hairstyles 2018 sunny hair extensions uk hair extensions remy hair extensions weft koko one piece hair extensions clip hair
Cálculo de idade - anos, meses e dias

Cálculo de idade - anos, meses e dias

Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 2x no Cartão de Crédito. 

Veja como comprar e saiba mais sobre o material oferecido,  clicando aqui.

Open v3

 

Utilizei aqui, determinadas funções nativas do Access e fiz algumas combinações para obter a idade completa de uma pessoa.   O help do VBA fornece explicações detalhadas para cada uma destas funções! Sugiro que você assista a vídeo-aula deste meu artigo para conhecer a melhor forma de estudar o Access!  

Conheça um pouquinho das funções aqui utilizadas:

Date() Retorna à data atual do sistema. 
Year() Obtém o ano da data informada.

year(date) :::> retorna ao ano corrente.
dateDiff() Retorna a um intervalo de tempo entre duas datas específicas.
 

Retorna 1 ano:  dateDiff("yyyy",#15/05/2011#,#20/05/2012#)

Retorna 371 dias:  dateDiff("d",#15/05/2011#,#20/05/2012#)

dateSerial() Monta uma data específica. Sua estrutura: dateSerial(ano,mês,dia)

Exemplo: dateSerial(2012,05,18) :::> retorna 18/05/2012
 

Esta função é ótima para nos fornecer o último dia do mês, que pode ser 28,29,30 ou 31:

O primeiro dia do mês corrente:  DateSerial(Year(Date), Month(Date), 1)

O último dia do mês corrente: DateSerial(Year(Date), Month(Date) + 1, 0) 

O primeiro dia do mês anterior: DateSerial(Year(Date), Month(Date) - 1, 1)

O último dia do mês anterior:  DateSerial(Year(Date), Month(Date), 0)
 

Cdbl() Função que transforma uma expressão em um número do tipo Double.

 

Você sabia que a data e a hora, na verdade, são tratadas como número pelo Access?

Cdbl(#29/04/2012#) :::> retorna 41028

Cdbl(#13:53#) :::> retorna 0,578472222222222

Observe o resultado, se eu informar a date e a hora ao mesmo tempo:

Cdbl(#29/04/2012 13:53#) :::> retorna 41028,5784722222

A parte inteira corresponde a data e a fração corresponde as horas:

Cdbl(#07/04/2012# - #03/04/2012#) :::> retorna 122 dias

Estranhou o resultado? É que o VBA trabalha com padrão americano (mm/dd/yyyy).  O cálculo é 4 de julho menos 4 de março.

Format() Com a função format() posso obter qualquer parte de uma data.

 

format(#15/05/2012#,"dd") :::> retorna o dia 15

format(#15/05/2012#,"mm") :::> retorna o mês 05

format(#15/05/2012#,"yyyy") :::> retorna o ano 2012

format(#15/05/2012#,"mmdd") :::> retorna o mês, seguido do dia 0515

 

int() Obtém a parte inteira de um número.

 

int(41028,5784722222) :::> retorna 41028

Podemos obter a parte fracionada da seguinte forma:

(41028,5784722222 - int(41028,5784722222)) ::::> retorna 0,5784722222

1 ano 1 ano corresponde a 365 dias + aproximadamente 1/4 do dia, que equivale a 365,2425 dias

 

Um outro detalhe que você deve aprender sobre o VBA, é que podemos realizar perguntas e obter como resposta o valor verdadeiro ou falso.  Por exemplo, se pergunto ao VBA:

- Um é igual a zero? Ele me responderá que é Falso(False)

1=0 :::> Retorna Falso

Pergunto se 3 é maior que 2 e ele irá me responder que é Verdadeiro(true)

3 > 2 :::> retorna  Verdadeiro

False e True, na verdade, são números :::>  0 (false) e -1 (true)

Então, se montarmos o cálculo, conforme a forma abaixo:

5 + (3 = 2) :::> Isso é o mesmo que (5 + False), que é igual a (5 + 0).   Teremos como resultado o valor  5

E se montarmos o cálculo desta outra forma:

5 + (3 > 2) :::> Isso é o mesmo que (5 + true), que é igual a (5 + (-1)).   Teremos como resultado o valor 4

Veja na imagem, os valores obtidos do VBA, pela janela Verificação imediata:

Usando Access - Janela Imediata VBA

Agora que você conhece os ingredientes, vamos preparar a função para obter a idade. Vamos supor que eu tenha nascido em 15/05/1980 e que a data atual, utilizada para todos os cálculos abaixo, é 28/04/2012,  obtida da função date()

Para obter os anos, utilizamos a seguinte fórmula:

Int((Format(Date, "yyyymmdd") - Format(DataNascimento, "yyyymmdd")) / 10000)
 
Int((Format(28/04/2012, "yyyymmdd") - Format(15/05/1980, "yyyymmdd")) / 10000)
 
Int((20120428 - 19800515)/10000) :::> 31
 
Teremos o resultado de 31 anos

Agora, vamos aprender como obter os meses. 

Observe bem que quero calcular apenas os meses restantes, porque os 31 anos completos vão até a data do meu último aniversário (15/05/2011).  Então, a idéia é a de obter os meses entre 15/05/2011 e 28/04/2012.  Isto porque o meu dia/mês de aniversário, ultrapassou o dia/mês da data atual. 

E se a data do meu nascimento fosse 20/02/1980?  O meu último aniversário seria em 20/02/2012.  O intervalo para analisar os meses restantes seria entre 20/02/2012 e 28/04/2012.  A questão principal aqui é que o ano do meu último aniversário poderá cair no ano anterior ou no ano corrente, dependendo do meu dia/mês, comparado ao dia/mês da data corrente.

Para montar a data de referência para o cálculo dos meses restantes, utilizaremos a função dateSerial

dateSerial(year(date)-1,format(#15/05/1980#,"mm"),format(#15/05/1980#,"dd"))
 
Temos como resultado 15/05/2011

Como havia dito, dependendo do dia/mês de aniversário, se cair antes ou depois do dia/mês da data atual,  devemos subtrair 1 ao ano, na montagem da data :::> year(date) + (-1 ou 0)

É importante lembrar sobre a questão de obter -1 ou 0, perguntando ao VBA sobre a comparação de valores.  O que vou fazer aqui é justamente isso!  Observe a expressão:

Format(#15/05/1980#, "mmdd") > Format(Date, "mmdd")
 
Estamos perguntando ao VBA se 0515 > 0428
 
Teremos como resposta Verdadeiro (-1)
 

Vamos supor que a data do meu nascimento é 20/02/1980. 
 
Estaremos comparando 0220 > 0428. Logo, o VBA retornará Falso(0)

A montagem final da data de referência para o cálculo dos meses:

'Pergunto se o dia/mês do meu aniversário é maior que o dia/mês corrente

Resultado = (Format(#15/05/1980#,"mmdd") > Format(Date,"mmdd"))

'Monta a data do meu último Aniversário

Dref = dateSerial(year(date)+Resultado,format(#15/05/1980#,"mm"),format(#15/05/1980#,"dd"))

'Obtenho a quantidade de meses

Meses = DateDiff("m", DRef, Date) + (Format(#15/05/1980#, "dd") > Format(Date, "dd"))

Você seria capaz de me responder por que estou fazendo uma pergunta ao VBA sobre o dia, neste cálculo dos meses?  (Format(#15/05/1980#, "dd") > Format(Date, "dd")).

Vou apresentar a função completa e deixar você estudar a lógica para o cálculo dos dias.

Public Function fncIdadeCompleta(DataNascimento As Date) As String
Dim Anos As Byte, Meses, Dias As Byte, DataRef As Date
Dim Resultado as Boolean
 
If DataNascimento > Date Or DataNascimento = 0 Then
    fncIdadeCompleta = ""
    Exit Function
End If

If DataNascimento = Date Then
    fncIdadeCompleta = 0
    Exit Function
End If
 
'Ajusta ano bissexto
DataNascimento = IIf(Format(DataNascimento, "mm/dd") = "02/29",DataNascimento - 1,DataNascimento)
 
Anos = Int((Format(Date, "yyyymmdd") - Format(DataNascimento, "yyyymmdd")) / 10000)
 
resultado = (Format(DataNascimento, "mmdd") > Format(Date, "mmdd"))

DataRef = DateSerial(Year(Date) + resultado,Format(DataNascimento, "mm"),Format(DataNascimento,"dd"))

Meses = DateDiff("m", DataRef, Date) + (Format(DataNascimento, "dd") > Format(Date, "dd"))
 
resultado = (Format(DataNascimento, "dd") > Format(Date, "dd"))

DataRef = DateSerial(Year(Date), Format(Date, "mm") + resultado, Format(DataNascimento, "dd"))
DataRef = IIf(Format(DataNascimento, "dd") <> Format(DataRef, "dd"), DataRef - Format(DataRef, "dd"), DataRef)

Dias = CDbl(Date) - CDbl(DataRef)

fncIdadeCompleta = IIf(Anos <= 1, IIf(Anos = 0, "", Anos & " ano "), Anos & " anos ") & _
                              IIf(Meses <= 1, IIf(Meses = 0, "", Meses & " mes "), Meses & " meses ") & _
                              IIf(Dias <= 1, IIf(Dias = 0, "", Dias & " dia "), Dias & " dias ")
End Function

Veja o resultado da consulta, que ofereço no arquivo exemplo! Lembrando que a data de referência para o cálculo abaixo é 28/04/2012, extraída da função date():

Usando Access - Cálculo Idade Completa

 

Segue abaixo, o arquivo exemplo para você estudar!  Altere algumas Datas de Nascimento e analise os resultados.

Download

Bom estudo!


 

 


52 comentário(s)

Alan Rodrigo   16/03/2021 16:54:57

Boa noite Mestre Avelino, tuod bem?
Por favor, o Sr. teria alguma dica de como conseguir no VBA a diferença entre duas datas considerando o ano 360, isto é, em que os dias dos meses sempre serão 30 e naõ 31, 29 ou 28?

Antonio Costeira   22/11/2019 04:00:44

Obrigado Avelino, funcionou a segunda opção.

Avelino Sampaio   22/11/2019 02:18:52

Antonio

Experimente assim:

=Soma(Abs([t_dados_funcionais]![Situação Funcional]= 'Ativo'))

Ou assim:

=Soma(Abs([Situação Funcional]=’Ativo’))


Antonio Costeira   21/11/2019 06:40:02

Bom dia Avelino, como faço pra somar o número de funcionários ativos de uma consulta ? Tentei da seguinte forma; =Soma(Abs([t_dados_funcionais]![Situação Funcional])="Ativo"), mas deu erro.

André    12/12/2018 03:09:50

Olá.
Tenho uma dúvida e não consegui resolver até hoje.

Preciso saber o dia util.
O parâmetro seria:

DataAtual + Qtd de Dias = uma data Util

Você tem algo do tipo em seu acervo?

Avelino Sampaio   30/08/2018 04:39:18

Douglas,

experimente usando o DataAdd(). Crie um campo calculado na consulta assim:

DataVencimento: dateadd("yyyy";5;[data primeira habilitação])

Sucesso!

Douglas   29/08/2018 18:52:52

Boa noite meu amigo! Estou criando um sistema de cadastro de condutores do meu serviço e tem a data da primeira habilitação e a data de vencimento. Gostaria de saber como eu calculo o ano na mesma data. Por exemplo, hoje são 29/08/2018 daqui a 5 anos, será 29/08/2023, deu pra entender mais ou menos?

Alguém pode me ajudar?

Aguardo respostas!

ENER SANTOS DE OLIVEIRA   15/07/2018 18:09:51

Parabéns Professor Avelino pelo seu esforço de compartilha seu conhecimento com os mantes do Access.

Avelino Sampaio   04/09/2017 08:11:50

Pedro,

para calcular o ano deve ser usado esta fórmula:

Int((Format(Date, "yyyymmdd") - Format(DataNascimento, "yyyymmdd")) / 10000)


PEDRO R   01/09/2017 09:39:42

Não.
Eu copiei desta página.
Eu uso em excel.

Avelino Sampaio   01/09/2017 08:28:13

Pedro

baixe o exemplo oferecido e está retornando o valor correto ( 1 ano 11 meses 30 dias ). Vc baixou o arquivo, recentemente, do site ?

No aguardo

PEDRO R   01/09/2017 07:49:53

Percebi um "erro":
Diferença entre 02/09/2015 e 01/09/2017:
Tá retornando 2 anos 11 meses 30 dias (Errado). O certo seria retornar 1 ano 11 meses 30 dias.
Dá pra corrigir:

Obs: Se colocar a diferença entre 02/09/2016 e 01/09/2017, retorna 11 meses 30 dias (Correto).



Avelino Sampaio   11/04/2016 07:22:41

José Carlos,

se inscreva no meu fórum: http://www.redeaccess.com.br

e ofereça mais detalhes, e se possível anexe um arquivo exemplo, para podermos te ajudar mais rapidamente.

Aguardamos

´José Carlos   04/04/2016 22:25:04

olá boa noite, quero te pedir se for possível me ajudar, estou numa situação meia embaraçosa, estou fazendo um pequeno banco de dados no access para a minha Igreja, pois ela não tem condição de comprar um, tudo bem fiz tudo legal, mais quando chegou no campo ano, Meses e dia eu não sei, será que você poderia me mandar um exemplo de formulário para eu copiar, desde já muito obrigado, conto contigo amigo.

Avelino Sampaio   15/02/2016 14:41:04

Sebastião,

no arquivo exemplo eu uso a função numa consulta. Funciona no arquivo exemplo ?

No aguardo

Sebastião    13/02/2016 10:06:26

Bom dia Avelino.
Minuto boa essa função (fncidadecompleta) fiz ela em um módulo depois f
Construí uma consulta mas as respostas não apareceram. Você poderia me ajudar onde é feita a função e como faço pra usar os resultados? Abraço.

Uderlan   29/09/2015 11:18:49

tenho uma caixa de texto: datanascimento caixa de texto: data que já é preenchida com a data do sistema e a caixa onde quero mostrar assim que digitar a data de nascimento aparecer a idadae em anos e meses, a caixa é idade

Uderlan   29/09/2015 10:51:04

Bom dia Jedi em vba, estou tentando implementar a idada e por extenso em anos e meses, tenho um campo onde é digitada a data de nascimento, a data do sistema e o campo onde gostaria que aparecesse a idade em anos e meses e não estou conseguindo como proceder?

Alcides Moreira de Resende   28/07/2015 08:39:30

Vou fazer essa mesma pergunta:
Como poderia usar este código utilizando uma data final informada por mim ao invés da data final ser a data do sistema - função date().

Assim teria uma data inicial que neste exemplo é a DataNascimento e uma DataFinal, ambas informadas pelo usuário, para o resultado retornar em "Anos" "Meses" e "Dias".

Acrescentando ainda que a data final poderia estar em branco.

amor1957@hotmail.com

pedroBB   01/07/2015 21:31:01

Problema resolvido. Muitissimo obrigado! Há muito tempo procurava formula tão completa pra Idade,
usando a fncIdadeCompleta.
Minha função ficou assim:
Private Sub txtDataNascimento_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TxtDataNascimento.Text) < 10 Or TxtDataNascimento.Value > CDate(Date) Or _ TxtDataNascimento.Text = "" Then
MsgBox "Data Inválida!!!!", vbCritical, "Cadastro de Pacientes"
Cancel = True
TxtDataNascimento.SelStart = 0
TxtDataNascimento.SelLength = TxtDataNascimento.TextLength
LblIdade.Visible = False
Label4.Visible = False
Else
LblIdade.Visible = True
Label4.Visible = True
LblIdade = fncIdadeCompleta(TxtDataNascimento, Date, "extenso")
End If
End Sub
Valeu!!!!!!!!!!!!!!!

pedroBB   01/07/2015 20:49:16

Esqueci de informar que estou usando a sensacional formula em Excel Vba.
A minha função é:
Private Sub txtDataNascimento_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TxtDataNascimento.Text) < 10 Or TxtDataNascimento.Value > CDate(Date) Then
MsgBox "Data Inválida!!!!", vbCritical, "Cadastro de Pacientes"
Cancel = True
TxtDataNascimento.SelStart = 0
TxtDataNascimento.SelLength = TxtDataNascimento.TextLength
End If
LblIdade.Visible = True
Label4.Visible = True
If TxtDataNascimento.Text = "" Then
LblIdade.Visible = False
Label4.Visible = False
Else
LblIdade = fncIdadeCompleta(TxtDataNascimento, Date, "extenso") "<<<<===== erro aqui - erro em tempo de execução 13, tipos incompatíveis
End If
End Sub

pedroBB   01/07/2015 13:18:01

Avelino,
Obrigado pela ajuda.
Agora calcula correto.
Mas percebi que dá erro em tempo de execução 13, tipos incompatíveis, quando testo com data que não existe. Exemplo: 29/02/2014. Uso o seguinte:
LblIdade = fncIdadeCompleta(TxtDataNascimento, Date, "extenso")

Avelino Sampaio   01/07/2015 03:53:51

PedroBB,

muito obrigado pelo seu feedback.

A fórmula para o cálculo dos ANOS estava imprecisa. Foi retirado a função INT() da fórmula é substituída pela Contra Barra (\)

Anos = DateDiff("d", DataNascimento, Date) \ 365.25

Atualizei o arquivo exemplo. Realize novos testes.


pedroBB   30/06/2015 13:10:03

Usei a fórmula: Idade Completa = fncIdadeCompleta(TxtDataNascimento, Date, "extenso"), e deu erro:
txtDataNascimento = 30/06/2013
Date = 30/06/2015
Resultado = 1 ano (??????)
O que ocorre?

gabriel a m da silva   17/06/2015 16:51:02

valeu cara muito obrigado

Luiz Carlos Junior   22/10/2014 12:08:45

Bom dia Mestres.

Tenho uma tabela com as faltas dos funcionários da escola (tb_Faltas), onde as mesmas são separadas por tipo (abonada, licença médica, etc.).
Preciso colocar em um relatório as datas iniciais e finais de intervalos de licença médica, por exemplo:

A funcionária X tem faltas de licença médica nos dias 15, 16, 17/07 e 21, 22, 23 24/07.
No relatório (rel_FichaCem) deve sair assim: LM: 15/07/2014 a 17/07/2014
LM: 21/07/2014 a 24/07/2014

Porém, na minha tabela, na hora de inserir as faltas por período, elas não são inseridas nos sábados, domingos e feriados (que estão na tabela tb_FeriadosCEM com os dados Dia_Feriado, Mes_Feriado).
Então, se a falta começa no primeiro dia de um mês que tenha feriado e termine no último dia deste mesmo mês, tem que aparecer assim: Exemplo Maio: LM: 01/05/2014 a 31/05/2014. Não sei se deu para entender.

É possível isso?
Agradeço desde já.

Abrasss!!!

Avelino Sampaio   02/04/2014 07:22:55

Wagner,

me passe seu email aqui pela seção CONTATO que eu te mando a função modificada para o seu caso.

No aguardo

Wagner Filho   01/04/2014 12:03:22

Olá... gostaria de uma ajuda dos colegas. Preciso fazer um cálculo entre duas datas informadas pelo usuário: Uma data inicial e uma data final.

Como poderia usar este código utilizando uma data final informada por mim ao invés da data final ser a data do sistema - função date().

Assim teria uma data inicial que neste exemplo é a DataNascimento e uma DataFinal, ambas informadas pelo usuário, para o resultado retornar em "Anos" "Meses" e "Dias"

obrigado

Ronaldo Adriano Gama de Souza   02/02/2014 11:14:24

TROQUEI O TRATAMENTO PRA QUEM NASCEU NO DIA 29 DE FEVEREIRO PARA FICAR PERFEITO

'TRATAMENTO PARA QUEM NASCEU NO DIA 29 DE FEVEREIRO
If (Day(DataNascimento) = 29) And (Month(DataNascimento) = 2) And ((Day(DataReferencia) = 28) And (Month(DataReferencia) = 2) And (IsDate("29/02/" & Year(DataReferencia)) = False)) Then
DataNascimento = 28 & "/" & 2 & "/" & Year(DataNascimento)
End If

Ronaldo Adriano Gama de Souza   02/02/2014 02:40:43

AMANDA, se voce quiser calcular da data de avaliação até a data atual voce vai jogar em uma coluna na consulta o seguinte:
Periodo: fncIdadeCompleta(Nz([data da avaliação];0);Data();"extenso")

se for da data de avaliação até uma data a especificar jogue em uma coluna da consulta o seguinte:
Periodo: fncIdadeCompleta(Nz([data da avaliação];0);#01/01/2014#;"extenso")

se voce tem um campo de data de retorno jogue em uma coluna da consulta o seguinte:
Periodo: fncIdadeCompleta(Nz([data da avaliação];0);[data de retorno];"extenso")


e para filtrar somente as datas especificas que voce quer coloque no critério de data de avaliaçao um dos seguinte abaixo:
entre [] e []
entre #01/01/2014# e #30/01/2014#
#05/01/2014# ou #11/01/2014# ou #14/01/2014# ou #21/01/2014#

ESPERO TER AJUDADO.

Ronaldo Adriano Gama de Souza   02/02/2014 02:22:33

ESTAVA INSPIRADO E ACRESCENTEI MAIS UMA OPÇÃO - ESCOLHER A FORMA DE RETORNO DA IDADE: POR EXTENSO OU POR INTEIROS(anos,meses,dias).

'IMPLEMENTADO POR ronaldogamadesouza(arroba)gmail(ponto)com
'ABAIXO VAI O CÓDIGO COM IMPLEMENTAÇÃO DE ALGUMAS IDÉIAS QUE EU TIVE
'1 - AGORA É POSSIVEL CALCULAR A IDADE NÃO SOMENTE COM A DATA ATUAL E SIM COM A DATA QUE VOCE PASSAR NO PARAMETRO
'2 - COLOQUEI A OPÇÃO DE VOCE ESCOLHER COMO QUER OS RESULTADOS: POR EXTENSO, POR ANOS, POR MESES, E POR DIAS, ASSIM VOCÊ PODE USAR A FUNÇÃO DE VÁRIAS FORMAS


'EXEMPLOS DE COMO FAZER A CHAMADA AGORA
'EM UMA CONSULTA
'Idade Completa: fncIdadeCompleta(Nz([DataNascimento];0);#01/01/2014#;"extenso") passando no parâmetro uma data desejada e solicitando o resultado por extenso
'Idade Completa: fncIdadeCompleta(Nz([DataNascimento];0);Data();"extenso") passando no parâmetro a data atual e solicitando o resultado por extenso
'NO VISUAL BASIC BASTA TROCAR OS PONTO E VÍRGULAS POR VÍRGULAS
'Idade Completa = fncIdadeCompleta(Nz([DataNascimento],0),#01/01/2014#,"extenso") passando no parâmetro uma data desejada e solicitando o resultado por extenso
'Idade Completa = fncIdadeCompleta(Nz([DataNascimento],0),Date,"extenso") passando no parâmetro a data atual e solicitando o resultado por extenso
'Idade Anos = fncIdadeCompleta(Nz([DataNascimento],0),Date,"extenso") passando no parâmetro a data atual e solicitando o resultado em anos inteiros
'espero ter ajudado, quem quiser pode dar sugestoes
'BY RONALDO


Public Function fncIdadeCompleta(DataNascimento As Date, DataReferencia As Date, resultado As String) As String
'PARAMETROS PARA DATA DE NASCIMENTO: uma data válida que seja igual ou inferior a data de referência
'PARAMETROS PARA DATA DE REFERENCIA: Data() ou Date() ou uma data válida tipo #01/01/2014# que seja igual ou superior a data de nascimento
'PARAMETROS PARA RESULTADO: "extenso" ou "anos" ou "meses" ou "dias"
'DECLAREI O PARAMETRO "DataReferencia" PARA CALCULAR COM A DATA QUE QUISER E NAO SOMENTE COM A DATA ATUAL


On Error GoTo trataerro
Dim Anos As Byte, Meses As Variant, Dias As Byte, DataRef As Date

'CASO A DATA DE NASCIMENTO FOR > QUE A DATA DE REFERENCIA RETORNA UM RESULTADO VAZIO
If DataNascimento > DataReferencia Or DataNascimento = 0 Then
fncIdadeCompleta = ""
Exit Function
End If

'TRATAMENTO PARA QUEM NASCEU NO DIA 29 DE FEVEREIRO
If (Day(DataNascimento) = 29) And _
(Month(DataNascimento) = 2) Then
DataNascimento = 28 & "/" & 2 & "/" & Year(DataNascimento)
End If

Anos = Int(DateDiff("d", DataNascimento, DataReferencia) / 365.25)
DataRef = DateSerial(Year(DataReferencia) + (Format(DataNascimento, "mmdd") > Format(DataReferencia, "mmdd")), Format(DataNascimento, "mm"), Format(DataNascimento, "dd"))
Meses = DateDiff("m", DataRef, DataReferencia) + (Format(DataNascimento, "dd") > Format(DataReferencia, "dd"))
DataRef = DateSerial(Year(DataReferencia), Format(DataReferencia, "mm") + (Format(DataNascimento, "dd") > Format(DataReferencia, "dd")), Format(DataNascimento, "dd"))
DataRef = IIf(Format(DataNascimento, "dd") <> Format(DataRef, "dd"), DataRef - Format(DataRef, "dd"), DataRef)
Dias = CDbl(DataReferencia) - CDbl(DataRef)

'CASO A DATA DE NASCIMENTO FOR IGUAL A DATA DE REFERENCIA IDADE É IGUAL A ZERO
If DataNascimento = DataReferencia Then
fncIdadeCompleta = 0
Anos = 0
Meses = 0
Dias = 0
'Exit Function
End If

'NAO ESTAVA CALCULANDO QUANDO ERA UM ANO EXATO ENTAO COMPLEMENTEI COM O CÓDIGO ABAIXO
If (Day(DataReferencia) = Day(DataNascimento)) And _
(Month(DataReferencia) = Month(DataNascimento)) And _
(Year(DataReferencia) - 1 = Year(DataNascimento)) Then
fncIdadeCompleta = "1 ano"
Anos = 1
Meses = 0
Dias = 0
'Exit Function
End If

If resultado = "extenso" Then
fncIdadeCompleta = IIf(Anos <= 1, IIf(Anos = 0, "", Anos & " ano "), Anos & " anos ") & _
IIf(Meses <= 1, IIf(Meses = 0, "", Meses & " mes "), Meses & " meses ") & _
IIf(Dias <= 1, IIf(Dias = 0, "", Dias & " dia "), Dias & " dias ")
ElseIf resultado = "anos" Then
fncIdadeCompleta = Anos
ElseIf resultado = "meses" Then
fncIdadeCompleta = Meses
ElseIf resultado = "dias" Then
fncIdadeCompleta = Dias
Else
fncIdadeCompleta = "parametros inválidos"
End If

sair:
Exit Function
trataerro:
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", Err.HelpFile, Err.HelpContext
Resume sair:
End Function

AMANDA   21/01/2014 14:57:06

BOA TARDE AVELINO,TENHO A SEGUINTE DUVIDA,TENHO UMA TABELA PACIENTES E ENTRE OS CAMPOS TENHO UM QUE SE CHAMA DATA AVALIAÇÃO,POIS BEM,ESSA FAZENDO UMA CONSULTA COM BASE NESTA TABELA EU POSSO PEDIR PARA ME MOSTRAR SOMENTE OS AVALIADOS DE TAL DATA,MAS E SE EU QUISER QUE ME MOSTRE OS AVALIADOS DE DUAS OU MAIS DATAS,NAO É INTERVALO,É APENAS DATAS,EX:QUERO QUE A CONSULTA ME MOSTRE SOMENTE OS AVALIADOS DOS DIAS 20/11/13,5/11/13 E 10/01/14. E TAMBEM QUE GERE UM RELATORIO.

Luis Ussuy   17/01/2014 11:35:05

Parabéns pela Função! Muito simples e salvou minha vida!

Marcelo Varella   02/05/2013 18:56:00

Avelino, muito bons seus exemplos. Gostaria de pedir sua ajuda para este caso: Preciso extrair o periodo em anos, meses e dias de um periodo entre INÍCIO DE EXERCÍCIO e uma DATA DE REFERÊNCIA, que não pode ser NOW. Ela deverá ser preenchida a critério do usuário. Desde já agradeço!

ACFT   19/10/2012 04:44:12

Muito bom.
Muito bom, mesmo.
Parabéns pela forma clara como tudo foi explicado, mas sobretudo pelo espírito de partilha do saber adquirido.
Um excelente exemplo a seguir.

Eliana   17/10/2012 12:57:53

vc diz isto
datediff("d";dateserial(year(data_mobilização);month(data_mobilização)-1,26;dateserial(year(data_mobilização);month(data_mobilização);25))



Avelino Sampaio   17/10/2012 12:23:35

Eliana,

pode resolver com a função dateSerial(). Exemplo:

datediff("d",dateserial(year(date()),month(date())-1,26),dateserial(year(date()),month(date()),25))

Substitua date() pelos seus campos específicos

Sucesso!

Eliana   17/10/2012 12:11:14

Complementando eu usei essa função Dias: DifData("d";[data_mobilização];[date]), o que calcula o dia certo, porém, eu preciso que o retorno seja feito somente para um determinado periodo, ou seja de 26 do mes anterior a 25 do mês atual.

Eliana   17/10/2012 11:48:03

Como faço para calcular o numero de dias proporcional dentro do mês, por exemplo tenho a data 27/09/12 e preciso calcular dentro de um determinado período 26/09/12 a 25/10/12, quantos dias tem.

William   06/08/2012 11:48:44

Vou testar isso Avelino, mas desde já muito obrigado pela sua atenção.

Att,
William

Avelino Sampaio   17/07/2012 13:46:47

William,

o que é este [select] ?

Supondo que as datas estejam em campos de um formulário, tente assim:

if DateDiff("d",me!DATA_PROPOSTA,me!DATA ATIVACAO)<180 then
'verdadeiro
else
'falso
end if

Lembrando que a propriedade "formato" dos campos tem que estar setados para tipo DATA.

Sucesso!

William Lima   17/07/2012 12:33:42

Bom dia, estou tentando utilizar um critério juntamento com a função DATADIF, e está dando erro. Existe a possibilidade de utilizar com critério?
Exemplo:
DateDiff("d",[SELECT]![DATA_PROPOSTA],[SELECT]![DATA ATIVACAO])<180

Avelino Sampaio   23/05/2012 05:33:57

Marcelo,

experimente algo assim:

Entre format(forms![00_17_Devolução Geral_UNION]![Mês];"yyyymm") E format(Forms![Frm_GerarBaseCFR_Gerar]![Mes];"yyyymm")

Sucesso!


Marcelo Silva   22/05/2012 11:20:10

Bom dia Avelino!

Estou usando um campo com data completa (18/05/2012).

Avelino Sampaio   18/05/2012 04:55:48

Marcelo,

primeiro priciso saber o formato do campo [Mês] que vc esta usando. Esta incluindo o ano (05/2012) ou está incluido uma data completa (18/05/2012) ?

No aguardo

Marcelo Silva   17/05/2012 14:26:09

Boa tarde Avelino!

Preciso de uma ajuda, quero colocar uma função na linha critério na minha consulta para me trazer dados em um determinado intervalo.

Entre (forms![00_17_Devolução Geral_UNION].[Mês]&*) E (Forms![Frm_GerarBaseCFR_Gerar]![Mes]&*)

É possível eu usar uma função deste tipo na consulta, esta acima esta dando erro, quando eu deixo apenas uma regra ela funciona perfeitamente.

Como(forms![00_17_Devolução Geral_UNION].[Mês])&*

Onde estou errando na criação desta função, desde já agradeço ajuda.

Idenilton   04/05/2012 17:35:23

Muito bom, gostei, eu já havia feito um calcula de idade mais não dessa forma. Essa é bem mais completo...

Antonio v.   30/04/2012 10:54:35

Parabéns Avelino!
Era o que eu estava precisando!
Que Deus o abençoe...

Adão Elias   30/04/2012 09:06:03

Parábens!
Uma aula dinâmica, cheia de informações importantes.
Obrigado por compartilhar...

Avelino João   29/04/2012 18:06:12

Magnifica aula como sempre você é o maior especialista em access graça a você hoje, faço a diferença em Angola com o Access e Excel, brevemente terei um site e espero ter um link do teu site ao meu e poder fazer publicidade desse grande site que é o teu; Uma sujeitão gostaria que você volta-se a convidar o kartoffel para falar um pouco sobre como fazer filtro na lista do formulário Access com MySQL ou uma combobox para localizar registo e preencher o formulário.

Gilson   29/04/2012 17:22:19

Excelente foi passar a utilizar para calcular o período em que o réu permanece preso provisoriamente, antes fazia este calculo apenas em dias, agora, ficará muita mais legitimo com anos, meses e dias. Obrigado pelo contribuição.

MARCIO MELO - RJ   29/04/2012 14:06:49

Gostei muito desse artigo, e passarei utilizar dessa sua função bem elaborada, posta + uma função q uso:
Function FormatInterval(ByVal Interval As Variant, Fmt As String)
'
' Formata a diferença entre duas datas ou soma de dois horários para mostrar
' em dias, horas, minutos e segundos
' Suporta os seguintes formatos:
' D 5 Dias
' D H 5 Days 5 Hours
' D H:MM 5 Days 5:15
' D HH:MM 5 Days 05:15
' D H:MM:SS 5 Days 5:15:45
' D HH:MM:SS 5 Days 05:15:45
' H M 125 Hours 15 Minutes
' H:MM 125:15
' H:MM:SS 125:15:45
' M S 7515 Minutes 45 Seconds
'
Dim Days As Long, Hours As Long, Minutes As Long, Seconds As Long
'
' testa para tipos Data (Date) ou dupla precisão (Double)
'
If varType(Interval) <> 7 And varType(Interval) <> 5 Then Exit Function
'
' Extrai dias
'
Days = Int(Interval)
Interval = Interval - Days
If Interval > #11:59:59 PM# Then
Days = Days + 1
Interval = 0#
End If
'
' Extrai horas
'
Interval = Interval * 24
Hours = Int(Interval)
Interval = Interval - Hours
If Interval > 3599# / 3600# Then
Hours = Hours + 1
Interval = 0#
End If
'
' Extrai minutos
'
Interval = Interval * 60
Minutes = Int(Interval)
Interval = Interval - Minutes
If Interval > 59# / 60# Then
Minutes = Minutes + 1
Interval = 0#
End If
'
' Extrai segundos
'
Seconds = Int(Interval * 60 + 0.5)
'
' Normaliza
'
If Seconds = 60 Then
Minutes = Minutes + 1
Seconds = 0
End If
If Minutes > 59 Then
Hours = Hours + 1
Minutes = Minutes - 60
End If
If Hours > 23 Then
Days = Days + 1
Hours = Hours - 24
End If
'
' Cria formato
'
Select Case Fmt
Case "D"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") '& Hours & IIf(Hours <> 1, " Horas", " Hora")
Case "D H"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") & Hours & IIf(Hours <> 1, " Horas", " Hora")
Case "D H:MM"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") & Hours & ":" & Format(Minutes, "00")
Case "D HH:MM"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") & Format(Hours, "00") & ":" & Format(Minutes, "00")
Case "D H:MM:SS"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") & Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "D HH:MM:SS"
FormatInterval = Days & IIf(Days <> 1, " Dias ", " Dia ") & Format(Hours, "00") & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "H M"
Hours = Hours + Days * 24
FormatInterval = Hours & IIf(Hours <> 1, " Horas ", " Hora ") & Minutes & IIf(Minutes <> 1, " Minutes", " Minute")
Case "H:MM"
Hours = Hours + Days * 24
FormatInterval = Hours & ":" & Format(Minutes, "00")
Case "H:MM:SS"
Hours = Hours + Days * 24
FormatInterval = Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "M S"
Minutes = Minutes + (Hours + Days * 24) * 60
FormatInterval = Minutes & IIf(Minutes <> 1, " Minutes ", " Minute ") & Seconds & IIf(Seconds <> 1, " Seconds", " Second")
Case Else
FormatInterval = Null
End Select
End Function

Sou mais Brasil!


Envie seu comentário: