Kontrollsiffra för personnummer: VBA och Luhn-algoritmen

Först publicerad:

| © ExcelKungen.com

Personnumret används ju som bekant för att identifiera sig inför andra personer, banker, affärer och myndigheter. Den tionde siffran, dvs den sista positionen i personnumret, är en kontrollsiffra som är resultatet av en funktion applicerad på de övriga 9 siffrorna. Nedan presenteras ett litet makro i VBA för att beräkna kontrollsiffra.

Syftet med kontrollsiffran är att säkerställa att personnumret är korrekt och att det inte innehåller några felaktigheter. Även om kontrollsiffran stämmer, betyder det dock inte att personnumret verkligen tillhör en registrerad person.

Beräkningen av kontrollsiffra görs via Luhn-algoritmen, vilken uppfanns av Hans Peter Luhn (1896-1964), en verklig föregångare inom Business Intelligence (BI).

Allmänt om personnummer

Personnumret infördes 1947, och det byggdes då kring 9 siffror. Den tionde kontrollsiffran införde man först 20 år senare, 1967, som ett led i den tidens datorisering. Fram till 1990 så angav positionerna 7 och 8 vilket län man var född i. För personer födda utomlands användes serierna 93-99. År 1990 ändrade man detta till ett mer allmänt löpnummer, eftersom länsangivelserna i personnumret helt försvann och ersattes av en generell löpserie.

Personnumrets nionde siffra

Övrig information som man kan utläsa är kön vilket beskrivs genom att den nionde siffran är udda för män och jämn för kvinnor.

Personnumrets skiljetecken

Skiljetecknet mellan de 6 första och 4 sista siffrorna i personumret är normalt ett "-" men när personen fyller 100 år så byter man tecken till ett "+" istället. VBA-exemplet nedan tar inte detta i beaktning men det är ju inte svårt att lägga till om det skulle behövas.

Samordningsnummer

En specialvariant av personnummer kallas för samordningsnummer. Myndigheterna ger detta identitetsnummer till personer som inte är folkbokförda i Sverige men som behöver en identitet av detta slag, till exempel för att öppna ett bankkonto. Till utseendet är det enda som skiljer ett samordningsnummer från ett vanligt personnummer att man adderar 60 till dagen som man är född. Är man född den 14 i månaden så uttrycks dagen som 74. Kontrollsiffran beräknas dock på samma sätt som för ett vanligt personnummer.

Personnumrets kontrollsiffra

Hans Peter Luhn på IBM, 1952.
Hans Peter Luhn på IBM, 1952.

Personnumrets sista siffra är alltså en kontrollsiffra som bygger på numrets övriga nio siffror. Formeln för att beräkna kontrollsiffran bygger på Luhn-algoritmen, patenterad 1954, vilken ingår i den så kallade "public domain" vilket gör den fri att använda. Hans Peter Luhn (1896-1964) föddes i Tyskland och emigrerade efter första världskriget till USA. Algoritmen tog han fram för IBM. Luhn kan anses vara en mycket viktig föregångare till modern BI (Business Intelligence).

Låt oss nu gå igenom hur du kan beräkna kontrollsiffra med Luhn-algoritmen:

  1. Multiplicera varje siffra i personnumret med 2 eller 1, alternerande.
  2. Om resultatet av multiplikationen är 10 eller mer, addera siffrorna i resultatet.
  3. Summera alla dessa värden.
  4. Subtrahera den totala summan från närmaste högre tiotal för att få kontrollsiffran.

Här är ett exempel för att illustrera processen: Om summan av de nio siffrorna blir 34, är kontrollsiffran 40 - 34 = 6. Om summan skulle bli 10, blir kontrollsiffran 0.

Excel-exempel för att beräkna kontrollsiffra

Grundidén i exemplet är att användaren matar in de första 9 siffrorna i ett personnummer. VBA-koden räknar sedan ut kontrollsiffran och skriver ut den i en härför avsedd cell. Observera att exemplet nedan är en ganska visuell programmeringslösning. Ett snabbare (men mer komplicerat) sätt är att läsa in siffrorna i en matris som sedan loopas igenom för beräkningarna. Men vi använder alltså inte den metoden här. Resultatet är emellertid det samma.

För aktuell kod används en enkel kalkylbladsuppställning enligt följande bild:

vba-personnummer-1

Efter körning av makrot så kommer det att se ut som följer:

vba-personnummer-2

VBA-kod för beräkning av kontrollsiffra


Sub PersonnummerBeraknaKontrollsiffra()
 
strPersonnummer = Trim(Range("C5").Text)
 
'först kontrollera att inmatningen korrekt (inkl. "-")
If Mid(strPersonnummer, 7, 1) <> "-" Or Len(strPersonnummer) > 11 Then
MsgBox "Felaktig inmatning. Gör om enligt modellen xxxxxx-xxx"
GoTo 99
End If
 
'tar in personnumret i variabler
strSiffra_1 = Left(strPersonnummer, 1)
strSiffra_2 = Mid(strPersonnummer, 2, 1)
strSiffra_3 = Mid(strPersonnummer, 3, 1)
strSiffra_4 = Mid(strPersonnummer, 4, 1)
strSiffra_5 = Mid(strPersonnummer, 5, 1)
strSiffra_6 = Mid(strPersonnummer, 6, 1)
strSiffra_7 = Mid(strPersonnummer, 8, 1)
strSiffra_8 = Mid(strPersonnummer, 9, 1)
strSiffra_9 = Mid(strPersonnummer, 10, 1)
 
'multiplicerar varje siffra omväxlande med 2 och med 1
strSiffra_1 = strSiffra_1 * 2
strSiffra_2 = strSiffra_2 * 1
strSiffra_3 = strSiffra_3 * 2
strSiffra_4 = strSiffra_4 * 1
strSiffra_5 = strSiffra_5 * 2
strSiffra_6 = strSiffra_6 * 1
strSiffra_7 = strSiffra_7 * 2
strSiffra_8 = strSiffra_8 * 1
strSiffra_9 = strSiffra_9 * 2
 
'summerar varje individuell produkt
If strSiffra_1  >= 10 Then strSiffra_1 = 1 + Mid(strSiffra_1, 2, 1) Else _
strSiffra_1 = Left(strSiffra_1, 1) + Mid(strSiffra_1, 2, 1)
If strSiffra_2  >= 10 Then strSiffra_2 = 1 + Mid(strSiffra_2, 2, 1) Else _
strSiffra_2 = Left(strSiffra_2, 1) + Mid(strSiffra_2, 2, 1)
If strSiffra_3  >= 10 Then strSiffra_3 = 1 + Mid(strSiffra_3, 2, 1) Else _
strSiffra_3 = Left(strSiffra_3, 1) + Mid(strSiffra_3, 2, 1)
If strSiffra_4  >= 10 Then strSiffra_4 = 1 + Mid(strSiffra_4, 2, 1) Else _
strSiffra_4 = Left(strSiffra_4, 1) + Mid(strSiffra_4, 2, 1)
If strSiffra_5  >= 10 Then strSiffra_5 = 1 + Mid(strSiffra_5, 2, 1) Else _
strSiffra_5 = Left(strSiffra_5, 1) + Mid(strSiffra_5, 2, 1)
If strSiffra_6  >= 10 Then strSiffra_6 = 1 + Mid(strSiffra_6, 2, 1) Else _
strSiffra_6 = Left(strSiffra_6, 1) + Mid(strSiffra_6, 2, 1)
If strSiffra_7  >= 10 Then strSiffra_7 = 1 + Mid(strSiffra_7, 2, 1) Else _
strSiffra_7 = Left(strSiffra_7, 1) + Mid(strSiffra_7, 2, 1)
If strSiffra_8  >= 10 Then strSiffra_8 = 1 + Mid(strSiffra_8, 2, 1) Else _
strSiffra_8 = Left(strSiffra_8, 1) + Mid(strSiffra_8, 2, 1)
If strSiffra_9  >= 10 Then strSiffra_9 = 1 + Mid(strSiffra_9, 2, 1) Else _
strSiffra_9 = Left(strSiffra_9, 1) + Mid(strSiffra_9, 2, 1)
 
'summerar ihop kontrollsumman
strKontrollSumma = strSiffra_1 + strSiffra_2 + strSiffra_3 + _
strSiffra_4 + strSiffra_5 + strSiffra_6 + strSiffra_7 + _
strSiffra_8 + strSiffra_9
 
'vi subtraherar erhållen kontrollsumma från närmaste högre tiotal
strKontrollSiffra = 10 - strKontrollSumma Mod 10
 
'om vi får specialfallet 10 så gör vi om till 0
If strKontrollSiffra = 10 Then strKontrollSiffra = 0
 
'slutligen skriver vi ut den erhållna kontrollsiffran
Range("D5") = strKontrollSiffra
 
99:
 
End Sub

Sammanfattning

Att beräkna kontrollsiffra för personnummer i Excel med VBA är en användbar färdighet. Med hjälp av Luhn-algoritmen kan du enkelt skapa ett makro som kontrollerar giltigheten av personnummer. Oavsett om du arbetar med databashantering, bankärenden eller andra administrativa uppgifter, kan denna kunskap spara tid och minska risken för fel.

Genom att följa denna guide har du nu en solid grund för att implementera denna funktion i dina egna projekt.

Populära artiklar

Dagens tips

Relaterade artiklar