Estou tentando efetuar um cálculo entre datas (Período Inicial, que está com o nome Dtini) e Período final, que está com o nome DtFin), já segui vários exemplos para calcular em ano, mês e dia e não obtive êxito. Há alguns exemplos que ao clicar em um botão aparece o resultado em uma caixa de texto, só que quero automaticamente, tipo ao colocar a data inicial e a final em uma terceira caixa apareça o resultado em anos, meses e dias.
Vi um código seu que teria que criar um módulo e uma caixa de texto com o nome txtDataResult. Criei o módulo e adequei os nomes dos campos, criei a cx de texto citada, coloquei no load do formulário:
Me.txtDataResult.SetFocus
txtDataResult = CalculaPeriodo(Dtini, DtFin)
na hora que carrego o formulário abre o vb com a crítica:
erro de compilação
Era esperada variável ou procedimento, não módulo
Clicando em ok da mensagem é focado o campo calculaPeriodo no vb
Private Sub Form_Load()
Me.txtDataResult.SetFocus
txtDataResult = CalculaPeriodo(Dtini, DtFin)
End Sub
o módulo está assim:
Option Compare Database
Option Explicit
Private Function CalculaPeriodo(Dtini As Date, DtFin As Date)
If Dtini > DtFin Then
MsgBox "Data Inicial não pode ser maior que Data actual!", vbExclamation, "Erro"
Exit Function
End If
Dim Anos, meses, dias
Dim iAnos As Double, iMeses As Double, Intervalo As Double
Intervalo = DtFin - Dtini
' Um ano tem exatamente 365,2425 dias, ou
' 365 dias, 5 horas, 49 minutos e 12 segundos.
' Ou aproximadamente 365,25 dias.
iAnos = Intervalo / 365.2425
Anos = Int(iAnos)
iMeses = (iAnos - Anos) * 12
meses = Int(iMeses)
dias = DateDiff("d", DateSerial(DatePart("yyyy", Dtini) + Anos, DatePart("m", Dtini) + meses, Day(Dtini)), DtFin)
Select Case dias
Case -1
dias = 30
meses = meses - 1
Case -2
dias = 29
meses = meses - 1
Case 30 Or 31
dias = 0
meses = meses + 1
End Select
If meses = 12 Then
meses = 0
Anos = Anos + 1
End If
Fim:
If Anos > 1 Then
Anos = Anos & " anos "
Else
Anos = Anos & " ano "
End If
If meses > 1 Then
meses = meses & " meses "
Else
meses = meses & " mês "
End If
If dias > 1 Then
dias = dias & " dias"
Else
dias = dias & " dia"
End If
CalculaPeriodo = Anos & meses & dias
End Function
Vi um código seu que teria que criar um módulo e uma caixa de texto com o nome txtDataResult. Criei o módulo e adequei os nomes dos campos, criei a cx de texto citada, coloquei no load do formulário:
Me.txtDataResult.SetFocus
txtDataResult = CalculaPeriodo(Dtini, DtFin)
na hora que carrego o formulário abre o vb com a crítica:
erro de compilação
Era esperada variável ou procedimento, não módulo
Clicando em ok da mensagem é focado o campo calculaPeriodo no vb
Private Sub Form_Load()
Me.txtDataResult.SetFocus
txtDataResult = CalculaPeriodo(Dtini, DtFin)
End Sub
o módulo está assim:
Option Compare Database
Option Explicit
Private Function CalculaPeriodo(Dtini As Date, DtFin As Date)
If Dtini > DtFin Then
MsgBox "Data Inicial não pode ser maior que Data actual!", vbExclamation, "Erro"
Exit Function
End If
Dim Anos, meses, dias
Dim iAnos As Double, iMeses As Double, Intervalo As Double
Intervalo = DtFin - Dtini
' Um ano tem exatamente 365,2425 dias, ou
' 365 dias, 5 horas, 49 minutos e 12 segundos.
' Ou aproximadamente 365,25 dias.
iAnos = Intervalo / 365.2425
Anos = Int(iAnos)
iMeses = (iAnos - Anos) * 12
meses = Int(iMeses)
dias = DateDiff("d", DateSerial(DatePart("yyyy", Dtini) + Anos, DatePart("m", Dtini) + meses, Day(Dtini)), DtFin)
Select Case dias
Case -1
dias = 30
meses = meses - 1
Case -2
dias = 29
meses = meses - 1
Case 30 Or 31
dias = 0
meses = meses + 1
End Select
If meses = 12 Then
meses = 0
Anos = Anos + 1
End If
Fim:
If Anos > 1 Then
Anos = Anos & " anos "
Else
Anos = Anos & " ano "
End If
If meses > 1 Then
meses = meses & " meses "
Else
meses = meses & " mês "
End If
If dias > 1 Then
dias = dias & " dias"
Else
dias = dias & " dia"
End If
CalculaPeriodo = Anos & meses & dias
End Function