VBA Functie stoppen indien er geen data is

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
555
Beste groep,
ik heb een vba functie van 't net geplukt en omgevormd zodat ze een periode in jaren en maanden weergeeft tussen een begindatum en de huidige datum (voor de berekening van de acienniteit van een werknemer). Probleem treed op als er geen begindata voor handen is en er dus een fout verschijnt. In het hoofdformulier "personeel" en een 7-tal doorlopende formulieren heb ik waar die functie wordt aangeroepen dit opgevangen maar ik zou dit ook nodig hebben voor een 25-tal rapporten (nu verschijnt daar 113 jr 0 mnd bij ontbrekende data.) en nog tal van andere zaken. Is het dus mogelijk om iets algemeners te maken die bij ontbrekende data dus 0 jr 0 mnd. weergeeft?
personeelfiche.jpg
In het formulierveld dat de ancienniteit berekent roep ik de onderstaande procedure aan met:
Code:
=Age1(Nz([Date1];0)) & " jr " & AgeMonths1(Nz([Date1];0)) & " mnd."
(ik doe hetzelfde in het tweede veld maar dan alles wat 1 is wordt 3 en wat 2 is wordt 4)
Code van de functie

Code:
'*************************************************************
' FUNCTIENAAM: Age1()
'
' DOEL:
'    Leeftijd in jaren berekenen, vanaf een opgegeven datum tot de huidige datum.
'
' INVOERPARAMETERS:
'    Begindatum: De begindatum (bijvoorbeeld een geboortedatum).
'
' RESULTAAT
'    De leeftijd in jaren.
'
'*************************************************************
Function Age1(varDate1 As Variant) As Integer
   Dim varAge1 As Variant
   If IsNull(varDate1) Then
      Age1 = 0
   End If
   If CurrentProject.AllForms("Personeelfiche").IsLoaded Then
        If (IsNull(Forms![Personeelfiche].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_fulltime_personeelsleden").IsLoaded Then
        If (IsNull(Forms![Frm_fulltime_personeelsleden].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ziekte_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ziekte_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ODV_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ODV_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Brugpensioen_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Brugpensioen_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Moederschapsbescherming_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Moederschapsbescherming_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Tijdskrediet_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Tijdskrediet_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ziekte_lopend_plus1Mnd").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ziekte_lopend_plus1Mnd].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
   varAge1 = DateDiff("yyyy", varDate1, Now)
   If Date < DateSerial(year(Now), month(varDate1), _
                        day(varDate1)) Then
      varAge1 = varAge1 - 1

   Age1 = CInt(varAge1)
   End If
End Function

'*************************************************************
' FUNCTIENAAM: AgeMonths1()
'
' DOEL:
'  Aanvulling van de functie Age() door berekening van het aantal maanden
'  die zijn verstreken sinds de laatste maand die is opgegeven in de datum.
'  Als de opgegeven datum een verjaardag is, geeft de functie het aantal
'    maanden sinds de laatste verjaardag.
'
' INVOERPARAMETERS:
'    Begindatum: De begindatum (bijvoorbeeld een verjaardag).
'
' RESULTAAT
'    Het aantal maanden sinds de laatste verjaardag.
'*************************************************************
Function AgeMonths1(ByVal StartDate1 As String) As Integer

   Dim tAge1 As Double
         If CurrentProject.AllForms("Personeelfiche").IsLoaded Then
        If (IsNull(Forms![Personeelfiche].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_fulltime_personeelsleden").IsLoaded Then
        If (IsNull(Forms![Frm_fulltime_personeelsleden].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ziekte_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ziekte_lopend].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ODV_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ODV_lopend].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Brugpensioen_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Brugpensioen_lopend].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Moederschapsbescherming_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Moederschapsbescherming_lopend].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_Tijdskrediet_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_Tijdskrediet_lopend].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
    If CurrentProject.AllForms("Frm_sub_ziekte_lopend_plus1Mnd").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ziekte_lopend_plus1Mnd].[Date1].Value)) Then
            AgeMonths1 = 0
        Exit Function
        End If
    End If
      tAge1 = (DateDiff("m", StartDate1, Now))
   If (DatePart("d", StartDate1) > DatePart("d", Now)) Then
      tAge1 = tAge1 - 1
   End If
   If tAge1 < 0 Then
      tAge1 = tAge1 + 1
   End If

   AgeMonths1 = CInt(tAge1 Mod 12)

End Function
 
Ik snap de bedoeling niet van al die IF constructies zoals
Code:
    If CurrentProject.AllForms("Frm_sub_ziekte_lopend").IsLoaded Then
        If (IsNull(Forms![Frm_sub_ziekte_lopend].[Date1].Value)) Then
            Age1 = 0
        Exit Function
        End If
    End If
Waarom niet een tweede parameter in de functie meegeven met de datum uit het subformulier? Ben je in één keer klaar.
 
Michel,

Al die Iff's: ik laat de functie eerst zoeken of een bepaald formulier is geladen en als dat zo is zet ik de Age in de functie op 0 als dat veld leeg is, zoniet wordt de functie verlaten. Dat werkt goed bij dus deze 8 pagina's
Het is juist omdat ik je tweede voorstel niet rond krijg dat ik deze vraag stel (het gaat momenteel over 8 hoofdformulieren maar het zouden evengoed subforms of subreports kunnen zijn):confused:
 
Laatst bewerkt:
En vandaar mijn opmerking om het tweede veld mee te nemen in de functie aanroep, want dan kunnen al die blokjes weg. Als je een formulier laadt, is neem ik aan toch ook automatisch het subformulier geladen?
 
De 8 formulieren zijn allemaal verschillende formulieren die los van elkaar worden gebruikt en geopend; die "sub" in de benaming is inderdaad verwarrend; die formuliern zijn namelijk gewoon doorlopende formulieren gebaseerd op een query die wel in bepaalde andere subforms wordt gebruikt.
Mijn vraag is gewoon of de functie niet kan zo gebouwd worden dat ze dus 0 jr 0 mnd toont als er geen startdatum voorhanden is ongeacht waar die functie aangeroepen wordt of moet deze functie als private sub bij iedere keer dat we ze gebruiken?
 
Laatst bewerkt:
IK test zelf eerst of een veld leeg is of niet met een IIF. In het eerste geval retourneer je een standaardwaarde, in het tweede geval laat je de functie er op los.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan