Tu znajdziejsz pliki pomocnicze związane z danym zagadnieniem - przykłady, zadania - do pobrania.
Tu znajdziesz linki do tematów powiązanych z aktualnie wybranym filmem.

Notatki użytkownika (prywatne, niemoderowane)

Komentarze

Anonimowy

'Moim zdaniem wyglada prymitywnie i "rzemieslniczo" , ale nie potrafie w tej chwili lepiej, brakuje tu jakis tablic, zeby nie deklarowac tylu zmiennych. Co tu mozna poprawic?

Sub Pesel()
Dim Pesel As String
Pesel = Range("A1").Value
Dim L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, K, _
    M1, M2, M3, M4, M5, M6, M7, M8, M9, M10 As Integer
Dim LiczbaKontrolna As Integer
'czytam string zmieniajac na pojedyncze liczby

L1 = Val(Mid(Pesel, 1, 1))
L2 = Val(Mid(Pesel, 2, 1))
L3 = Val(Mid(Pesel, 3, 1))
L4 = Val(Mid(Pesel, 4, 1))
L5 = Val(Mid(Pesel, 5, 1))
L6 = Val(Mid(Pesel, 6, 1))
L7 = Val(Mid(Pesel, 7, 1))
L8 = Val(Mid(Pesel, 8, 1))
L9 = Val(Mid(Pesel, 9, 1))
L10 = Val(Mid(Pesel, 10, 1))
K = Val(Mid(Pesel, 11, 1))
'Waga 1-3-7-9-1-3-7-9-1-3
M1 = L1 * 1
M2 = L2 * 3
M3 = L3 * 7
M4 = L4 * 9
M5 = L5 * 1
M6 = L6 * 3
M7 = L7 * 7
M8 = L8 * 9
M9 = L9 * 1
M10 = L10 * 3
'po wazeniu wyciagam liczbe do mnozenia, przy okazji "odzyskuje" zmienna L
L1 = M1 Mod 10
L2 = M2 Mod 10
L3 = M3 Mod 10
L4 = M4 Mod 10
L5 = M5 Mod 10
L6 = M6 Mod 10
L7 = M7 Mod 10
L8 = M8 Mod 10
L9 = M9 Mod 10
L10 = M10 Mod 10
LiczbaKontrolna = 10 - ((L1 + L2 + L3 + L4 + L5 + L6 + L7 + L8 + L9 + L10) Mod 10)
Debug.Print LiczbaKontrolna
If (LiczbaKontrolna <> K) Or (Val(Mid(Pesel, 5, 2)) > 31) Then
MsgBox ("Pesel nieprawidlowy")
Else
MsgBox ("Pesel w zasadzie prawidlowy")
End If
End Sub

'Sprawdza liczbe kontrolna i czy dzien urodzenia nie wiekszy od 31

Admin

Po pierwsze- proponuję przerobić rozwiązanie na funkcję, aby po prostu zwracała informację w stylu 'VALID/INVALID' lub 'TRUE/FALSE' dla podanego nr pesel. Po drugie, nie potrzebujemy tylu zmiennych gdyż wiele operacji można od razu ująć w pętlę i dokonać od razu obliczeń agregujących bez przechowywania wartości w zmiennych. Po trzecie- proponuję dodać podstawową kontrolę parametrów Pesel już na początku funkcji. A finalnie, zachowując częściowo zaproponowane nazwy zmiennych i ograniczając ich występowanie krótsze rozwiązanie może wyglądać tak:

 

Function PESELCheck(PESEL As String)
    If Len(PESEL) <> 11 Or Not IsNumeric(PESEL) Then
        PESELCheck = "invalid pesel, wrong length"
        Exit Function
    End If
    Dim L As Integer
    Dim i As Integer
    Dim LiczbaKontrolna As Integer
    Dim waga As Variant
        waga = Array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3)
        
    For i = 1 To 10
        
        L = CInt(Mid(PESEL, i, 1))
        LiczbaKontrolna = LiczbaKontrolna + ((L * waga(i - 1)) Mod 10)
    
    Next i
    
    LiczbaKontrolna = 10 - (LiczbaKontrolna Mod 10)
    
    If (LiczbaKontrolna <> CInt(Mid(PESEL, 11, 1))) Or (CInt(Mid(PESEL, 5, 2)) > 31) Then
        PESELCheck = False
    Else
        PESELCheck = True
    End If
    
End Function

Dodaj komentarz (publiczny, moderowany przez administratora strony, także miejsce na uwagi do autora)