27. oktober 2009 - 22:54Der er
14 kommentarer og 1 løsning
TOmme feltet i data sæt? what to do?
Jeg har en opgave, hvor der er givet en masse CPR nr. disse skal tjekkes efter modulus 11 metoden for at se om de er rigtige, eller ej.
I blandt de CPR nr er der nogle kunder, hvor der IKKE er givet CPR nr (feltet er tomt).
Alle CPR nr som ikke opfylder modulus 11 betingelsen, samt de CPR nr, som ikke er givet.
Skal noteres / listes i et nyt ark.
Jeg kan godt få den til at løbe listen af CPR nr igennem og tjekke efter modulus 11 metoden, det er rimelig simpelt, med nogen variable, strengfunktioner og en formel for modulus 11.
Men når jeg støder ind i et tomt felt virker denne metode ikke!
Jeg kan derfor regne ud, at jeg skal have den til i SAMME kode at notere navnet på kunden, hvis CPR nr feltet er tomt.
Jeg kan dog ikke se mig ud af, hvordan jeg gør det?
Du må gerne sige, hvor du ville sætte ind så den kører videre og notere navnet på dem, hvor CPR nr ikke er angivet i det andet ark.
Option Explicit > > Sub OBL_Opg2() > > Dim i As Integer > Dim AR As Integer > Dim CPR As String > Dim CPR1 As String > Dim NR As Integer > > Dim ark1 As Range > Dim ark2 As Range > > Dim a As Integer > Dim b As Integer > Dim c As Integer > Dim d As Integer > Dim E As Integer > Dim F As Integer > Dim G As Integer > Dim H As Integer > Dim k As Integer > Dim j As Integer > > Dim TestSum As Long > > > > Set ark1 = ThisWorkbook.Sheets("Medlemskartotek").Range("A2") > Set ark2 = ThisWorkbook.Sheets("Sheet1").Range("A2") > > AR = ark1.CurrentRegion.Rows.Count > > With ark1 > > For i = 1 To AR - 1 > CPR = .Offset(i, 0) > > a = Mid(CPR, 1, 1) > b = Mid(CPR, 2, 1) > c = Mid(CPR, 3, 1) > d = Mid(CPR, 4, 1) > E = Mid(CPR, 5, 1) > F = Mid(CPR, 6, 1) > G = Mid(CPR, 8, 1) > H = Mid(CPR, 9, 1) > k = Mid(CPR, 10, 1) > j = Right(CPR, 1) > > TestSum = (4 * a) + (3 * b) + (2 * c) + (7 * d) + (6 * E) + (5 * F) + > (4 * G) + (3 * H) + (2 * k) + (j) > > If TestSum Mod 11 <> 0 Then NR = NR + 1 > ark2.Offset(NR, 0) = CPR > ark2.Offset(NR, 1) = ark1.Offset(i, 1) > ark2.Offset(NR, 2) = ark1.Offset(i, 2) > ark2.Offset(NR, 3) = "forkert CPR nr" > > > > > Next > End With > > > > End Sub
For Each c In Selection If c <> "" Then t = t + Left(c, 1) * 4 t = t + Mid(c, 2, 1) * 3 t = t + Mid(c, 3, 1) * 2 t = t + Mid(c, 4, 1) * 7 t = t + Mid(c, 5, 1) * 6 t = t + Mid(c, 6, 1) * 5 t = t + Mid(c, 8, 1) * 4 t = t + Mid(c, 9, 1) * 3 t = t + Mid(c, 10, 1) * 2 t = t + Right(c, 1) x = t Mod 11 c.Select If x <> 0 Then sh2.Range("A2:A" & sh2.Cells(10000, 1).End(xlUp).Row + 1) = c sh2.Range("B2:B" & sh2.Cells(10000, 2).End(xlUp).Row + 1) = x End If End If Next
Jeg har nu fået en kode der kører rimelig godt igennem, men når den har kørt tilstrækkeligt langt ned i rækken med CPR nr, melder den fejl ved G og siger type mismatch.
Sub OBL_Opg2()
Dim i As Integer Dim AR As Integer Dim CPR As String Dim CPR1 As String Dim NR As Integer
Dim ark1 As Range Dim ark2 As Range
Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim E As Integer Dim F As Integer Dim G As Integer Dim H As Integer Dim k As Integer Dim j As Integer
Dim TestSum As Long
Set ark1 = ThisWorkbook.Sheets("Medlemskartotek").Range("A2") Set ark2 = ThisWorkbook.Sheets("Sheet1").Range("A2")
AR = ark1.CurrentRegion.Rows.Count
With ark1
For i = 1 To AR - 1 CPR = .Offset(i, 0)
If CPR = "" Then NR = NR + 1 ark2.Offset(NR, 0) = CPR ark2.Offset(NR, 1) = ark1.Offset(i, 1) ark2.Offset(NR, 2) = ark1.Offset(i, 2) ark2.Offset(NR, 3) = "manglende CPR nr"
Else
a = Mid(CPR, 1, 1) b = Mid(CPR, 2, 1) c = Mid(CPR, 3, 1) d = Mid(CPR, 4, 1) E = Mid(CPR, 5, 1) F = Mid(CPR, 6, 1) G = Mid(CPR, 8, 1) H = Mid(CPR, 9, 1) k = Mid(CPR, 10, 1) j = Right(CPR, 1)
Du kan ikke tjekke et format som sådan, men med følgende er du rimelig sikker:
Dim bFejl As Boolean If Len(CPR) <> 11 Then bFejl = True If Mid(CPR, 7, 1) <> "-" Then bFejl = True bFejl = Not IsNumeric(Left(CPR, 6)) bFejl = Not IsNumeric(Right(CPR, 4))
For lige at gøre dit liv lidt mere besværligt:
Der kan jo godt findes ugyldige CPR-numre selvom de overholder modulus 11 tjekket. F.eks. 350960-1673.
Så hvis du skal være HELT sikker, bør du også tjekke at dd og mm er korrekte.
Derudover gælder modulus 11 kun for CPR-numre FØR oktober 2007 (men du har nok ikke nogle kunder på 2 år ;)).
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.