Avatar billede slejpnir Nybegynder
29. november 2001 - 21:09 Der er 28 kommentarer og
2 løsninger

vba Kontrol af personnummer?

Er der nogen, der har en kode til kontrol af Cpr-numres rigtighed?
Avatar billede janvogt Praktikant
29. november 2001 - 21:43 #1
Næ, men det kan vi vel lave ;-)
Kan du reglerne for tjekket på sidste ciffer?
Avatar billede slejpnir Nybegynder
29. november 2001 - 22:05 #2
Desværre, nej!
29. november 2001 - 22:18 #3
det kan jeg
Avatar billede khvid Nybegynder
29. november 2001 - 22:19 #4
> janvogt

Hvis det kan være dig til nogen hjælp, sender jeg dig her en procedure fra et pascal-program, jeg lavede for 14 år siden til check af cpr-numres lovlighed. Reglen for sidste ciffer er, at det skal passe med en modulus-11 kontrol, men det kan du formentlig læse dig til i pascal-koden. Så er det op til dig at formulere det til regneark. ;-)

Her er pascal-koden:
PROCEDURE Cprcheck (Personnr : Cprstreng ; VAR Test : Boolean ) ;
{ modulus-11-check + test for dag, måned og år }
  VAR
    Sum, I, Dag, Maaned, Aar : Integer ;
    Nummer : Vektor ;
   
  BEGIN { cprcheck }
    FOR I := 1 TO 6 DO
      BEGIN
        Nummer[I.) := Ord(Cprnr[I.)) - Ord (\'0\') ;
      END ; { for }
    FOR I := 7 TO 10 DO { spring over bindestregen }
      BEGIN            {  i den indlæste streng  }
        Nummer[I.) := Ord(Cprnr[I + 1.)) - Ord (\'0\') ;
      END ; { for }
    Sum := 0 ;
    Test := True ;
    FOR I := 1 TO 7 DO                    { Cpr-nummerets 10 cifre }
      Sum := Sum + Nummer[11 - I.) * I ; { ganges bagfra med hhv. }
    FOR I := 2 TO 4 DO                    {  1 2 3 4 5 6 7  2 3 4  }
      Sum := Sum + Nummer[5 - I.) * I ;
    IF Sum MOD 11 <> 0                      { Modulus 11 check }
      THEN Test := False ;
    Dag := Nummer[1.) * 10 + Nummer[2.);{ Datodelen af strengen }
    Maaned := Nummer[3.) * 10 + Nummer[4.) ;{ månedsdel af do.  }
    Aar := Nummer[5.) * 10 + Nummer[6.) ;  { årsdel af do.    }
    IF (Dag < 1) OR (Dag > 31) OR (Maaned < 1) OR (Maaned > 12)
      THEN Test := False ;
    IF ((Maaned = 4) OR (Maaned = 6) OR (Maaned = 9)
        OR (Maaned = 11)) AND (Dag = 31)
      THEN Test := False ;
    IF (Maaned = 2) AND (Dag > 28)
      THEN
        IF (Dag = 29) AND (Aar MOD 4 = 0) { test for skudår }
          THEN Test := True
      ELSE Test := False ;             
  END ; { cprcheck }           
Avatar billede slejpnir Nybegynder
29. november 2001 - 22:25 #5
Og dog&#8230;
1. ciffer ganges med 4
2. ciffer ganges med 3
3. ciffer ganges med 2
4. ciffer ganges med 7
5. ciffer ganges med 6
6 . ciffer ganges med 5
7. ciffer ganges med 4
8. ciffer ganges med 3
9. ciffer ganges med 2
10.ciffer ganges med 1

Avatar billede slejpnir Nybegynder
29. november 2001 - 22:26 #6
Der skal stå modulus-11 tjek
Avatar billede slejpnir Nybegynder
29. november 2001 - 22:27 #7
Helt foroven
29. november 2001 - 22:37 #8
Kopier og Indsæt nedenstående kode i et modul og kald funktionerne fra arket således:

=cprnr(\"030456-0345\")  eller  =cprnr(A1)

Men husk at cellen skal være formateret som tekst eller starte med enkelt citationstegn \' ellers går det galt med foranstillede nuller.

Du kan bruge \"mellemrum\", \"bindestreg\" eller \"punktum\" som
adskillelsestegn. De bliver automatisk fjernet af rutinen.

----------------------------------------

Const CPR_NR_VÆGTE As String = \"4327654321\"


Function CprNr(Nummer As String) As String
    CprNr = CheckNummer(Nummer, CPR_NR_VÆGTE)
End Function

Function CheckNummer(Nummer As String, Vægte As String) As String
Dim Counter As Long
Dim Checksum As Long
    CheckNummer = \"Fejl!\"
    Nummer = FjernTegn(Nummer, \" \")
    Nummer = FjernTegn(Nummer, \"-\")
    Nummer = FjernTegn(Nummer, \".\")
    If Len(Nummer) = Len(Vægte) Then
        For Counter = 1 To Len(Vægte)
            Checksum = Checksum + Mid$(Nummer, Counter, 1) * Mid$(Vægte,
Counter, 1)
        Next Counter
        If Checksum Mod 11 = 0 Then CheckNummer = \"I orden!\"
    End If
End Function

Function FjernTegn(Streng As String, Tegn As String) As String
Dim Dummy As Long
    While InStr(Streng, Tegn)
        Dummy = InStr(Streng, Tegn)
        Streng = Left(Streng, Dummy - 1) & Mid$(Streng, Dummy + 1)
    Wend
    FjernTegn = Streng
End Function

Avatar billede slejpnir Nybegynder
29. november 2001 - 23:03 #9
>flemmingdahl Jeg ser på det i morgen. Men skal jeg indtaste samtlige 10 cifre i celle a1?
30. november 2001 - 09:18 #10
Du kan vælge at skrive følgende i en celle:  =cprnr(\"030456-0345\")  eller henvise til cellen, som indeholder cprnummeret med:  =cprnr(A1)

Men husk at cellen skal være formateret som tekst eller starte med enkelt citationstegn \' ellers går det galt med foranstillede nuller.

Ja, der SKAL være alle 10 cifre f.eks. i A1 eller et andet sted.

Avatar billede janvogt Praktikant
30. november 2001 - 11:45 #11
>>>slejpnir og khvid
Tak for oplysningerne om modulus 11.

Jeg har lavet et Excel-ark, som gennemgår alle forhold omkring beregning og tjek af CPR-nummer.

Udover at tjekke, om et CPR-nummer er korrekt, er der også mulighed for at få beregnet det sidste ciffer, som er kontrolcifferet.
Flemmingdahl\'s udmærkede VBA-funktion er også inkluderet.
30. november 2001 - 12:01 #12
det vil jeg da gerne se jan.
Avatar billede slejpnir Nybegynder
30. november 2001 - 14:36 #13
Jeg forstår ikke et suk. Hvis jeg nu anbringer cprnr. i en tekstboks, skal jeg så lave en cmdknap der siger call cprnr, call checknummer, call fjerntegn? - for at få tjekket? Og hvordan får jeg beskeden \"I orden\" frem? Msgbox??
30. november 2001 - 14:38 #14
jeg kan sende dig et ark - smid din mail fd@win-consult.com - det skal ikke i en tekstboks.
Avatar billede slejpnir Nybegynder
30. november 2001 - 14:38 #15
>Janvogt Kan du ikke vise koden?
Avatar billede slejpnir Nybegynder
30. november 2001 - 14:41 #16
>Flemmingdahl Jo, det skal indtastes i en tekstboks. Herefter skal tjekket foretages ved at trykke på en kontrolknap.
30. november 2001 - 14:42 #17
ok - jeg kan lave et eks. til dig - send en mail eller vis din email
Avatar billede slejpnir Nybegynder
30. november 2001 - 14:50 #18
>flemmingdahl Jeg er ikke hjemme nu, men min kammerats mail er sendt.
30. november 2001 - 14:56 #19
Sendt
30. november 2001 - 15:30 #20
Ku\' du bruge det ?
Avatar billede slejpnir Nybegynder
30. november 2001 - 15:58 #21
Det virker, men jeg kan ikke finde koden til din command-knap?
Avatar billede slejpnir Nybegynder
30. november 2001 - 15:59 #22
Altså koden (makroen) under knappen.
30. november 2001 - 16:03 #23
Koden under knappen ligger i ark1\'s kodemodul, og ser således ud:

Private Sub CommandButton1_Click()
Dim sSvar As String
    sSvar = CprNr(TextBox1.Text)
    Range(\"A1\") = sSvar
End Sub
Avatar billede janvogt Praktikant
30. november 2001 - 16:03 #24
>>>slejpnir
Mit ark indeholder ikke kode udover ovenstående, men jeg sender gerne arket.

jan_vogt_hansen@hotmail.com
30. november 2001 - 16:04 #25
Højreklik på fanebladet til Ark1 og vælg \"Vis programkode\"
Avatar billede slejpnir Nybegynder
30. november 2001 - 16:19 #26
>flemmingdahl Mange tak!
>janvogt Tak gerne!
Avatar billede janvogt Praktikant
30. november 2001 - 16:24 #27
Mail?
30. november 2001 - 16:27 #28
jan>> prøv fd@win-consult.com :-) takker
Avatar billede janvogt Praktikant
30. november 2001 - 17:08 #29
Ja, jeg så din kommentar flemming. Jeg \"samler\" lige sammen.
30. november 2001 - 17:18 #30
:-) pæn mængde eks. efter hånden :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa

Netcompany A/S

Linux Operations Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation

Ringkjøbing Landbobank – Nordjyske Bank

Forretningsudvikler til procesoptimering