Avatar billede mercu Nybegynder
27. oktober 2009 - 22:54 Der 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?

Skal jeg bruge format funktionen? Eller?

CPR nr er givet som:

xxxxxx-xxxx (streng)

Håber I kan hjælpe.
Avatar billede Slettet bruger
28. oktober 2009 - 00:37 #1
Du kunne lægge checket i toppen af modulus11 funktionen:
if cpr=""
  return false
Avatar billede mercu Nybegynder
28. oktober 2009 - 08:46 #2
Hvordan skriver jeg så, hvad cpr nr "rigtige" syntax er?

if CPR = "######-####"  ??
Avatar billede Slettet bruger
28. oktober 2009 - 11:55 #3
Jeg ville slet ikke skrive andet.
- hvis cpr IKKE er tomt, kører funktionen bare videre som før.

MEN det hele afhænger jo af, hvordan modulus-11-funktionen normalt reagerer på invalide cpr-numre.

Det er langt fra sikkert at "return false" er den rette løsning i det konkrete tilfælde
- jeg var bare "symbolsk" :)

Lad os se hele Modulus-11-fætteren...
Avatar billede mercu Nybegynder
28. oktober 2009 - 13:15 #4
Her er min kode.

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
Avatar billede excelent Ekspert
28. oktober 2009 - 19:47 #5
Marker dine CPR-nr og kør makro

Sub tst()

Set sh2 = ThisWorkbook.Sheets("Sheet1")

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

End Sub
Avatar billede mercu Nybegynder
28. oktober 2009 - 22:14 #6
Jeg forstår ikke helt den kode du har skrevet.

du sætter først sh = sheet1

så briger du en for each løkke, men den kører kun, hvis CPR nr er tomt? Så vidt jeg kan se?

Hvis CPR ikke er tomt kører den ikke?

Det giver da ingen mening at kører modulus 11 på de tomme felter?
Avatar billede Slettet bruger
28. oktober 2009 - 23:20 #7
Disclaimer: Jeg kender ikke en skid til Excel (eller VB's syntax) (men aloritmer)
- "EXCELent" med 80K points (og stålbriller!) har givet vis ret :)

Mit bud - som i sin enkelhed går ud på at kaste fejlen inden der tages fat på modulussen...

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)

      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"

          "end if ?"

  "end if ?"

  Next
End With
Avatar billede excelent Ekspert
28. oktober 2009 - 23:24 #8
Koden tester alle markerede celler men hopper over tomme
Hvis test/sum ikke er 0, skrives cpr i kol a og summen i kol B

prøv indtast et forkert cprnr i din liste og test
Avatar billede mercu Nybegynder
29. oktober 2009 - 08:40 #9
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)

      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"

          End If

  End If

  Next
End With

End Sub
Avatar billede mercu Nybegynder
29. oktober 2009 - 08:48 #10
Jeg har fundet fejlen nu, det er fordi der åbenbart også er CPR numre, som er skrevet forkert fx

#######-####

Derved passer Modulus 11 funktionen ikke fordi man ved G så rammer ind i bindestrengen når CPR nr er indtastet forkert.

Ska jeg så ikke bruge format til at tjekke om CPR nummeret er givet ved:

######-#### ?
Avatar billede tjacob Juniormester
29. oktober 2009 - 11:24 #11
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 ;)).
Avatar billede mercu Nybegynder
29. oktober 2009 - 12:19 #12
Mange tak

Den kode var stor hjælp.

Nu fanger jeg alle CPR-nr som ikke har 11 cifre og programmet kører fint.

Men nu har jeg fundet ud af der også er nogen, som er angivet som

####-######

Den har jo de 11 cifre, - men når jeg så laver modulus 11 på den får jeg jo fejl da jeg rammer en " - ".

Er det 100% man ikke kan angive CPR nr skal være angivet, som

######-####

ellers fejl

hvis det så har den rigtige "notation" så køre videre med modulus 11 tjekket?
Avatar billede mercu Nybegynder
29. oktober 2009 - 12:48 #13
Så sku mit problem være løst.

Takker for hjælpen.

Vender tilbage, hvis jeg løber ind i flere problemer.

- Har dog et spørgsmål, hvordan giver jeg point?

Nu er der flere som har svaret og flere ting har været brugbare?
Avatar billede tjacob Juniormester
29. oktober 2009 - 12:55 #14
Jeg fandt lige svaret på at matche format:

Dim bErKorrekt as boolean
bErKorrekt = CPR Like "######-####"


PS: ingen point til mig.
Avatar billede excelent Ekspert
29. oktober 2009 - 15:00 #15
jeg står også over :-)
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
Kurser inden for grundlæggende programmering

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

Udviklings- og Forenklingsstyrelsen

Scrum Master

Netcompany A/S

Test Specialist