Usuário com melhor resposta
converter formula do excel em vba

Pergunta
-
boa noite
uso esta formula no excel e funciona normalmente
R2 = 10/10/1990 AG1 = HOJE() que é 21/11/2014
=SE(DATADIF(R2;$AG$1;"Y")>1;" "&DATADIF(R2;$AG$1;"Y")&" anos";SE(DATADIF(R2;$AG$1;"Y")=1;" "&DATADIF(R2;$AG$1;"Y")&" ano";""))
retorna = 24 anos
=SE(E(DATADIF(R2;$AG$1;"Y")>=1;DATADIF(R2;$AG$1;"MD")>=1);SE(DATADIF(R2;$AG$1;"YM")>1;", "&DATADIF(R2;$AG$1;"YM")&" meses";SE(DATADIF(R2;$AG$1;"YM")=1;", "&DATADIF(R2;$AG$1;"YM")&" mês";""));SE(E(DATADIF(R2;$AG$1;"Y")>=1;DATADIF(R2;$AG$1;"MD")<1);SE(DATADIF(R2;$AG$1;"YM")>1;" e "&DATADIF(R2;$AG$1;"YM")&" meses";SE(DATADIF(R2;$AG$1;"YM")=1;" e "&DATADIF(R2;$AG$1;"YM")&" mês";""));SE(DATADIF(R2;$AG$1;"YM")>1;" "&DATADIF(R2;$AG$1;"YM")&" meses";SE(DATADIF(R2;$AG$1;"YM")=1;" "&DATADIF(R2;$AG$1;"YM")&" mês";""))))
retorna = , 1 mês
=SE(OU(DATADIF(R2;$AG$1;"Y")>=1;DATADIF(R2;$AG$1;"YM")>=1);SE(DATADIF(R2;$AG$1;"MD")>1;" e "&DATADIF(R2;$AG$1;"MD")&" dias";SE(DATADIF(R2;$AG$1;"MD")=1;" e "&DATADIF(R2;$AG$1;"MD")&" dia";""));SE(DATADIF(R2;$AG$1;"MD")>1;" "&DATADIF(R2;$AG$1;"MD")&" dias";SE(DATADIF(R2;$AG$1;"MD")=1;" "&DATADIF(R2;$AG$1;"MD")&" dia";"")))
retorna = e 11 dias
resultado = 24 anos, 1 mês e 11 dias
Ao tentar converter para VBA nao tive exito:
'Ano
If DateDiff("YYYY", TxtNascimento, Date) > 1 Then
ano = DateDiff("YYYY", TxtNascimento, Date) & " anos"
End If
If DateDiff("YYYY", TxtNascimento, Date) = 1 Then
ano = DateDiff("YYYY", TxtNascimento, Date) & " anos"
End IfO ano funcionou normal
mais o mês, no primeiro teste abaixo nao funcionou
'Meses
If DateDiff("YYYY", TxtNascimento, Date) >= 1 And DateDiff("m", TxtNascimento, Date) >= 1 Then
If DateDiff("d", TxtNascimento, Date) > 1 Then
mes = ", " & DateDiff("m", TxtNascimento, Date) & " meses"
End If
End If
MsgBox ano & mesretornou = 24 anos, 289 meses
Como seria a codigo correto?
Obrigado a todos pela atenção.
Respostas
-
Boa noite JLNunes!
Bom, primeiramente três considerações a fazer:
- A função que propus parece ter um bug para algumas datas. Percebi que para diferenças menores que 3 dias sempre ocorre erro. Para contornar, eu havia feito um simples teste condicional.
- Para o caso que vc citou, como a referência de datas do Excel é 00/01/1900, é necessário sempre subtrair 1 do resultado para os meses.
- O Excel sempre considera o calendário real para calcular datas, ou seja, se o ano for bissexto por exemplo, o mês de fevereiro terá 29 dias, como é o caso do ano de 1900, que é a referência para a fórmula que propus. Da mesma forma, meses com 30 ou 31 dias também trariam impacto.
Contextualizado dessa forma, estou entendendo que não é exatamente isso que vc precisa, ou seja, uma solução no caminho que propus nunca funcionará para o que deseja. Assim, supondo que vc deseja fazer a conta como faríamos de maneira mental aproximada, segue abaixo uma forma fazendo exatamente dessa maneira, analisando simplesmente os números separadamente:
Sub CalcularDatas2() Dim Anos As Long, Meses As Long, Dias As Long Data1 = #10/10/1990# Data2 = #11/21/2014# 'Data1 = #10/10/2013# 'Data2 = #11/21/2014# ' 'Data1 = #10/10/2014# 'Data2 = #10/11/2014# ' 'Data1 = #10/10/2014# 'Data2 = #10/5/2015# If Data2 >= Data1 Then Ano1 = Year(Data1) Ano2 = Year(Data2) Mes1 = Month(Data1) Mes2 = Month(Data2) Dia1 = Day(Data1) Dia2 = Day(Data2) If Dia2 >= Dia1 Then Dias = Dia2 - Dia1 Else Dias = 30 - (Dia1 - Dia2) If Ano2 >= Ano1 Then
If Mes2 > Mes1 Then
Anos = Ano2 - Ano1
If Dia2 >= Dia1 Then
Meses = Mes2 - Mes1
Else
Meses = Mes2 - Mes1 - 1
End If
ElseIf Mes2 < Mes1 Then
Anos = Ano2 - Ano1 - 1
Meses = 12 - (Mes1 - Mes2)
Else
If Dia2 >= Dia1 Then
Anos = Ano2 - Ano1
Meses = 0
Else
Anos = Ano2 - Ano1 - 1
Meses = 11
End If
End If
End If MsgBox "Entre as Datas existe: " & Anos & " ano(s), " & Meses & " mes(es) e " & Dias & " dia(s)!", vbInformation, "Intervalo" Else MsgBox "A segunda data deve ser maior ou igual à primeira!", vbCritical, "Erro" End If End SubDesta forma te atende?
Abraço.
Filipe Magno
- Editado FilipeMagno sábado, 22 de novembro de 2014 22:18 Correção do Código (5º IF)
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator sábado, 20 de dezembro de 2014 11:14
Todas as Respostas
-
JLNunes,
a fórmula
DateDiff("m", TxtNascimento, Date)
vai retornar o número total de meses entre suas datas, por isso retorna 289 meses.
Entretanto, se vc consultar a ajuda para a função "DateDiff" verá que ela não retornará o resultado que vc deseja, pois:
"Você pode usar a função DateDiff para determinar quantos intervalos de tempo especificados existem entre duas datas" e "Ao comparar 31 de dezembro com 1
º
de janeiro do ano imediatamente seguinte, DateDiff para Ano ("yyyy") retornará 1, mesmo que tenha se passado apenas um dia."Para corrigir, a forma mais simples seria usar a própria função "Format", como no exemplo abaixo:
Sub CalcularDatas() Dim Diferença As Double Dim Anos As Long, Meses As Long, Dias As Long Data1 = #10/31/2010# Data2 = #11/15/2012# Diferença = Data2 - Data1 Anos = Val(Format(Diferença, "yy")) Meses = Val(Format(Diferença, "m")) Dias = Val(Format(Diferença, "d")) MsgBox "Entre as Datas existe: " & Anos & " ano(s), " & Meses & " mes(es) e " & Dias & " dia(s)!", vbInformation, "Intervalo" End Sub
Abraço.Filipe Magno
-
-
-
Boa noite JLNunes!
Bom, primeiramente três considerações a fazer:
- A função que propus parece ter um bug para algumas datas. Percebi que para diferenças menores que 3 dias sempre ocorre erro. Para contornar, eu havia feito um simples teste condicional.
- Para o caso que vc citou, como a referência de datas do Excel é 00/01/1900, é necessário sempre subtrair 1 do resultado para os meses.
- O Excel sempre considera o calendário real para calcular datas, ou seja, se o ano for bissexto por exemplo, o mês de fevereiro terá 29 dias, como é o caso do ano de 1900, que é a referência para a fórmula que propus. Da mesma forma, meses com 30 ou 31 dias também trariam impacto.
Contextualizado dessa forma, estou entendendo que não é exatamente isso que vc precisa, ou seja, uma solução no caminho que propus nunca funcionará para o que deseja. Assim, supondo que vc deseja fazer a conta como faríamos de maneira mental aproximada, segue abaixo uma forma fazendo exatamente dessa maneira, analisando simplesmente os números separadamente:
Sub CalcularDatas2() Dim Anos As Long, Meses As Long, Dias As Long Data1 = #10/10/1990# Data2 = #11/21/2014# 'Data1 = #10/10/2013# 'Data2 = #11/21/2014# ' 'Data1 = #10/10/2014# 'Data2 = #10/11/2014# ' 'Data1 = #10/10/2014# 'Data2 = #10/5/2015# If Data2 >= Data1 Then Ano1 = Year(Data1) Ano2 = Year(Data2) Mes1 = Month(Data1) Mes2 = Month(Data2) Dia1 = Day(Data1) Dia2 = Day(Data2) If Dia2 >= Dia1 Then Dias = Dia2 - Dia1 Else Dias = 30 - (Dia1 - Dia2) If Ano2 >= Ano1 Then
If Mes2 > Mes1 Then
Anos = Ano2 - Ano1
If Dia2 >= Dia1 Then
Meses = Mes2 - Mes1
Else
Meses = Mes2 - Mes1 - 1
End If
ElseIf Mes2 < Mes1 Then
Anos = Ano2 - Ano1 - 1
Meses = 12 - (Mes1 - Mes2)
Else
If Dia2 >= Dia1 Then
Anos = Ano2 - Ano1
Meses = 0
Else
Anos = Ano2 - Ano1 - 1
Meses = 11
End If
End If
End If MsgBox "Entre as Datas existe: " & Anos & " ano(s), " & Meses & " mes(es) e " & Dias & " dia(s)!", vbInformation, "Intervalo" Else MsgBox "A segunda data deve ser maior ou igual à primeira!", vbCritical, "Erro" End If End SubDesta forma te atende?
Abraço.
Filipe Magno
- Editado FilipeMagno sábado, 22 de novembro de 2014 22:18 Correção do Código (5º IF)
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator sábado, 20 de dezembro de 2014 11:14
-
boa noite
achei que a conversão de uma formula do excel para vba fosse mais facil pela potencia de mesmo, porem, nem comecei a converter ja encontrei muita dificuldade.
fiz um teste funcionou, mais nao sei ate quando e quantas linhas de comando terei que fazer para corverter toda a formula acima.
vou desistir, e usar a formula na planilha mesmo, o arquivo vai ficar muito mais é o jeito.
obrigado Felipe pela atenção.