10. november 2008 - 15:37Der er
13 kommentarer og 1 løsning
Udregne alder fra CPR nr
Hejsa. Jeg har læst og forsøgt flere af eksemplerne herude, men jeg kan ikke få det til at virke. Jeg skal bruge en metode at udregne, og liste alderen på mine brugere, ud fra deres CPR numre. (eks. 0101072351) Tabel: brugere Feltnavn: cpr_nr datatype: tekst
Function BeregnAlderFraCPRNR(cprnr As String) As Long On Error Resume Next Dim TestSum As Long Dim Fødselsdato As Date Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, F As Integer, G As Integer, H As Integer, i As Integer, j As Integer Dim Aar As Integer, Mdr As Integer, Dag As Integer, Aarhundred As Integer CPRNRNR = Replace(CPRNRNR, "-", "") a = Mid(cprnr, 1, 1) b = Mid(cprnr, 2, 1) c = Mid(cprnr, 3, 1) d = Mid(cprnr, 4, 1) e = Mid(cprnr, 5, 1) F = Mid(cprnr, 6, 1) G = Mid(cprnr, 7, 1) H = Mid(cprnr, 8, 1) i = Mid(cprnr, 9, 1) j = Mid(cprnr, 10, 1) TestSum = (4 * a + 3 * b + 2 * c + 7 * d + 6 * e + 5 * F + 4 * G + 3 * H + 2 * i + j) If (TestSum Mod 11) <> 0 Then MsgBox "CPRNR nr '" & cprnr & "' er ugyldigt!" End If On Error GoTo Except Dag = Int(Mid(cprnr, 1, 1) + Mid(cprnr, 2, 1)) Mdr = Int(Mid(cprnr, 3, 1) + Mid(cprnr, 4, 1)) Aar = Int(Mid(cprnr, 5, 1) + Mid(cprnr, 6, 1)) Aarhundred = 0 Select Case G Case 0 To 3: Aarhundred = 1900 Case 4 Select Case Aar Case 0 To 36: Aarhundred = 1900 Case 37 To 99: Aarhundred = 2000 End Select Case 5 Select Case Aar Case 0 To 36: Aarhundred = 2000 Case 58 To 99: Aarhundred = 1800 End Select Case 6 Select Case Aar Case 0 To 36: Aarhundred = 2000 Case 58 To 99: Aarhundred = 1800 End Select Case 7 Select Case Aar Case 0 To 36: Aarhundred = 2000 Case 58 To 99: Aarhundred = 1800 End Select Case 8 Select Case Aar Case 0 To 36: Aarhundred = 2000 Case 58 To 99: Aarhundred = 1800 End Select Case 9 Select Case Aar Case 0 To 36: Aarhundred = 2000 Case 37 To 99: Aarhundred = 1900 End Select End Select Fødselsdato = DateSerial(Aarhundred + Aar, Mdr, Dag) If DateSerial(Year(Date), Month(Fødselsdato), Day(Fødselsdato)) > Date Then BeregnAlderFraCPRNR = DateDiff("yyyy", Fødselsdato, Date) - 1 Else BeregnAlderFraCPRNR = DateDiff("yyyy", Fødselsdato, Date) End If Exit Function Except: BeregnAlderFraCPRNR = Null End Function
Kald funktionen med denne:
Dim VARa As String VARa = Me.cprnr MsgBox Module1.BeregnAlderFraCPRNR(VARa)
Kontrollen af CPRNR er baseret på modulus 11 metoden som ikke længere er gældende i alle tilfælde.
Tak for den meget hurtige tilbagemelding. Jeg er ikke ret god til access, så jeg bliver nød til at spørge. Hvordan kalder jeg en funktion i en forespørgsel?
Tak skal du have. Du er godt nok kvik. :-) Hvis jeg bruger 'Udtryk1: BeregnAlderFraCPRNR([CPRNR])' spørger access efter Parameterværdi <<cprnr>> Hvad gør jeg galt?
F.eks en kommandoknap. Men 11/11-2008 08:33:45 spørger du om, hvordan du kalder funktionen fra en forespørgsel. DEt svarede jeg på Kl. 11/11-2008 09:18:21. Men også der skal dy rette feltnavnet.
Fin formel, svaages. Tak for den. (Jeg er her fordi, jeg har lavet den logik en gang, men har glemt at gemme den) :-D
Hvis formler skal bruges i forespørgsler bør man dog undgå Msgbox og andre funktioner, der afbryder udførslen.
Fejlhåndtering bør nok placeres inden du splitter og evaluerer cpr-nummeret, da der f.eks. ved erstatnings cpr-numre (og helt almindelige fejlindtastning) kan forekomme bogstaver i cpr-numre, som vil få mod11 beregningen til at fejle.
Man kan, hvis man vil, disable mod11 beregningen selektivt ved at indføre en parameter mere i funktionskaldet (Boolean) som kan bruges til at skippe mod11 beregningen i koden.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.