Calculate age by date of birth

Asked

Viewed 1,236 times

1

I am trying to calculate the age in a form field through the date of birth, only that returns me the compilation error 13 type mismatch. Please someone help me? Here’s the CODE.

Private Sub CmbCalcular_Click()

    Dim datanasc As Date, idade As Integer

    datanasc = CDate(MskDataNasc.Mask)
    idade = CInt((Date - datanasc) / 365)
    TxtIdade = Str(idade) & "anos"

End Sub
  • the problem is in the line where the maskedbox is.

3 answers

1

There are some errors in your example. On the line idade = CInt((Date - datanasc) / 365) you’re using the class Date as if it were an instance.

Another thing is that to get time intervals like number of days, months or number of years use the class TimeSpan(https://docs.microsoft.com/system.timespan)

Private Sub CmbCalcular_Click()

    ' Declare a variável intervalo com sendo do tipo TimeSpan
    Dim datanasc As Date, idade As Integer, intervalo As TimeSpan

    'Use propriedade Text ao invés de Mask. 
    'Mask é mascara de edição e Text é o valor digitado  
    datanasc = CDate(MskDataNasc.Text)

    ' Compute a diferença ente hoje e datanasc 
    intervalo = Now - datanasc;

    ' use a propriedade TotalDays para obter número de dias decorridos
    idade = Math.Abs(intervalo.TotalDays  / 365)

    TxtIdade = Str(idade) & "anos"

End Sub

0

Utilize IsDate(valor) who will return true if the date is valid, use Text to take the content value MaskedBox and finally not Date is Now to catch the current date, I mean, you have three problems with your code:

Solution:

Private Sub CmbCalcular_Click()    
    Dim datanasc As Date, idade As Integer
    If IsDate(MskDataNasc.Text) Then
          datanasc = CDate(MskDataNasc.Text)
          idade = CInt((Now - datanasc) / 365)
          TxtIdade = Str(idade) & "anos"
    Else
          TxtIdade.Text = "Data inválida" 
    End If    
End Sub

The error informed type Mismatch, means you tried to convert to a certain type, but this conversion is not valid, so use IsDate(valor) before to check if it is possible to convert to Date

0

Public Function CalculaIdade(ByVal dDataNasc As Date, Optional ByVal dDataHoje As Date = Nothing) As String

    Dim cResult As String = ""

    If dDataHoje = Nothing Then
        dDataHoje = Today
    End If

    If dDataNasc <> Nothing AndAlso dDataNasc <= dDataHoje Then

        Dim dDataTemp = dDataNasc
        Dim anos = DateDiff("yyyy", dDataTemp, dDataHoje)

        dDataTemp = dDataTemp.AddYears(anos)

        Dim meses = DateDiff("m", dDataTemp, dDataHoje)
        If meses < 0 Then
            anos = anos - 1
            dDataTemp = dDataTemp.AddYears(-1)
            meses = DateDiff("m", dDataTemp, dDataHoje)
        End If

        dDataTemp = dDataTemp.AddMonths(meses)

        Dim dias = DateDiff("d", dDataTemp, dDataHoje)
        If dias < 0 Then
            meses = meses - 1
            If meses < 0 Then
                anos = anos - 1
                meses = 12 + meses
            End If
            dDataTemp = dDataTemp.AddMonths(-1)
            dias = DateDiff("d", dDataTemp, dDataHoje)
        End If

        If anos <> 0 Then
            cResult = cResult & anos & IIf(anos = 1, " ano", " anos")
        End If

        If anos < 18 Then
            If meses <> 0 Then
                cResult = cResult & IIf(cResult.Length = 0, "", ", ") & meses & IIf(meses = 1, " mes", " meses")
            End If
            If anos <= 2 Then
                If dias <> 0 Then
                    cResult = cResult & IIf(cResult.Length = 0, "", " e ") & dias & IIf(dias = 1, " dia", " dias")
                End If
            End If
        End If

    End If

    Return cResult

End Function

Browser other questions tagged

You are not signed in. Login or sign up in order to post.