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é 5x no Cartão de Crédito.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
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#) |
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) |
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 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:
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():
Segue abaixo, o arquivo exemplo para você estudar! Altere algumas Datas de Nascimento e analise os resultados.
Download
Bom estudo!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
52 comentário(s) André 12/12/2023 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/2023 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/2023 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/2023 18:09:51 Parabéns Professor Avelino pelo seu esforço de compartilha seu conhecimento com os mantes do Access. Uderlan 29/09/2022 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/2022 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? Avelino Sampaio 04/09/2022 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/2022 09:39:42 Não. Eu copiei desta página. Eu uso em excel. Avelino Sampaio 01/09/2022 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/2022 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). Alcides Moreira de Resende 28/07/2022 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/2022 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/2022 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/2022 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/2022 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/2022 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/2022 16:51:02 valeu cara muito obrigado Avelino Sampaio 11/04/2022 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/2022 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. Alan Rodrigo 16/03/2022 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? Avelino Sampaio 15/02/2022 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/2022 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. Luiz Carlos Junior 22/10/2021 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!!! ACFT 19/10/2021 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/2021 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/2021 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/2021 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/2021 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/2021 11:48:44 Vou testar isso Avelino, mas desde já muito obrigado pela sua atenção. Att, William Avelino Sampaio 17/07/2021 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/2021 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/2021 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/2021 11:20:10 Bom dia Avelino! Estou usando um campo com data completa (18/05/2012). Avelino Sampaio 18/05/2021 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/2021 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/2021 17:35:23 Muito bom, gostei, eu já havia feito um calcula de idade mais não dessa forma. Essa é bem mais completo... Marcelo Varella 02/05/2021 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! Antonio v. 30/04/2021 10:54:35 Parabéns Avelino! Era o que eu estava precisando! Que Deus o abençoe... Adão Elias 30/04/2021 09:06:03 Parábens! Uma aula dinâmica, cheia de informações importantes. Obrigado por compartilhar... Avelino João 29/04/2021 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/2021 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/2021 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! Avelino Sampaio 02/04/2021 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/2021 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/2021 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/2021 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/2021 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/2021 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/2021 11:35:05 Parabéns pela Função! Muito simples e salvou minha vida! Antonio Costeira 22/11/2020 04:00:44 Obrigado Avelino, funcionou a segunda opção. Avelino Sampaio 22/11/2020 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/2020 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. |