Ostatnia cyfra numeru PESEL to suma kontrolna. Dzięki niej można wychwycić, czy osoba wprowadzająca numer PESEL do systemu nie pomyliła się przy jego przepisywaniu. Wystarczy dla pierwszych 10 cyfr numeru PESEL obliczyć sumę kontrolną i jeśli będzie taka sama jak 11 cyfra numeru PESEL to oznacza, że z dużym prawdopodobieństwem numer został poprawnie przepisany.
Aby obliczyć sumę kontrolną należy:
- Sprawdzić czy numer PESEL składa się z dokładnie 11 znaków. Do tego celu mozna np. użyć narzędzia poprawność danych, które pozwala na wprowadzenie tekstu o długości dokładnie 11 znaków do komórki.
- Pomnożyć cyfry numeru PESEL przez odpowiednie wagi: 1,3 7, 9, 1, 3, 7, 9, 1, 3 i zsumować owe iloczyny.
- Obliczyć resztę z dzielenia przez 10 z otrzymanej sumy iloczynów (czyli tak naprawdę patrzymy na ostatnią cyfrę sumy iloczynów)
- Nasza suma kontrolna to wynik działania 10 – owa reszta z dzielenia (jeśli wynik wyjdzie 10 to naszą sumą kontrolną jest 0). Czyli najprościej będzie tutaj jeszcze raz wykonać operację matematyczną reszta z dzielenia przez 10.
Oto prosty przykład. Użytkownik rejestrując się w systemie podał następujący numer PESEL:
90122512345
- Numer PESEL składa się z 11 znaków
- Mnożymy poszczególne cyfry numeru PESEL przez odpowiednie wagi i sumujemy owe iloczyny:
=9*1 + 0*3 + 1*7 + 2*9 + 2*1 + 5*3 + 1*7 + 2*9 + 3*1 + 4*3 = 91
- Reszta z dzielenia dla liczby 91 przez 10 to 1.
- 10-1 = 9
Wniosek: suma kontrolna dla naszego numeru PESEL to 9 a nie 5 – czyli podany przeze mnie PESEL jest zmyślony, albo błędnie przepisany.
Oto formuła w Excelu, która waliduje poprawność numeru PESEL (w formule należy wszystkie A2 zamienić na adres komórki do które wprowadzasz numer PESEL).
=JEŻELI.BŁĄD(JEŻELI(DŁ(A2)<>11;"pesel musi mieć 11 znakow";JEŻELI((MOD(10-MOD(FRAGMENT.TEKSTU(A2;1;1)*1+FRAGMENT.TEKSTU(A2;2;1)*3+FRAGMENT.TEKSTU(A2;3;1)*7+FRAGMENT.TEKSTU(A2;4;1)*9+FRAGMENT.TEKSTU(A2;5;1)*1+FRAGMENT.TEKSTU(A2;6;1)*3+FRAGMENT.TEKSTU(A2;7;1)*7+FRAGMENT.TEKSTU(A2;8;1)*9+FRAGMENT.TEKSTU(A2;9;1)*1+FRAGMENT.TEKSTU(A2;10;1)*3;10);10))*1<>(FRAGMENT.TEKSTU(A2;11;1)*1);"zla suma kontrolna";"ok"));"Podana wartość nie wygląda na prawidłowy numer PESEL")
Możemy również napisać prostą funkcję w języku VBA (funkcja ta podobnie jak powyższa formuła sprawdza tylko 2 warunki: czy PESEL ma 11 znaków oraz czy zgadza suma kontrolna – tak więc przez tę funkcję "przejdą" PESELe dla osób błędną datą urodzenia np. 30 luty jeśli żartowniś poprawnie obliczył sumę kontrolną)
Public Function CzyPoprawnyPESEL(Pesel As String) As Boolean
Dim wagi As Long, sumaK As Long, Cyfra11 As Long
Pesel = Trim(Pesel)
CzyPoprawnyPESEL = True
If Len(Pesel) <> 11 Then CzyPoprawnyPESEL = False
'Suma kontrolna
wagi = 1 * Val(Mid(Pesel, 1, 1)) + 3 * Val(Mid(Pesel, 2, 1)) + _
7 * Val(Mid(Pesel, 3, 1)) + 9 * Val(Mid(Pesel, 4, 1)) + _
1 * Val(Mid(Pesel, 5, 1)) + 3 * Val(Mid(Pesel, 6, 1)) + _
7 * Val(Mid(Pesel, 7, 1)) + 9 * Val(Mid(Pesel, 8, 1)) + _
1 * Val(Mid(Pesel, 9, 1)) + 3 * Val(Mid(Pesel, 10, 1))
sumaK = wagi Mod 10
sumaK = 10 - sumaK
sumaK = sumaK Mod 10
Cyfra11 = Val(Mid(Pesel, 11, 1))
If Cyfra11 <> sumaK Then CzyPoprawnyPESEL = False
End Function