none
converter formula do excel em vba RRS feed

  • 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 If

    O 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 & mes

    retornou = 24 anos, 289 meses

    Como seria a codigo correto?

    Obrigado a todos pela atenção.

    sexta-feira, 21 de novembro de 2014 22:36

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 Sub

    Desta forma te atende?

    Abraço.


    Filipe Magno


    sábado, 22 de novembro de 2014 22:12

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

    sábado, 22 de novembro de 2014 03:17
  • Me esqueci de um detalhe: as datas no VBA estão sempre no formato "mm/dd/yyyy", da forma que escrevi no meu exemplo.

    Abraço.


    Filipe Magno

    sábado, 22 de novembro de 2014 03:19
  • boa tarde

    ao testar a formula com as datas do exemplo anterior

    Data1 = #10/10/1990#

    Data2 = #11/21/2014#
    retornou: 24 anos 2 meses e 11 dias e o correto seria:
    24 anos 1 mes e 11 dias

    obrigado.

    sábado, 22 de novembro de 2014 19:04
  • 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 Sub

    Desta forma te atende?

    Abraço.


    Filipe Magno


    sábado, 22 de novembro de 2014 22:12
  • 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.

    domingo, 23 de novembro de 2014 00:26