Avatar billede tvc Seniormester
05. april 2005 - 09:21 Der er 6 kommentarer og
1 løsning

Modulus 11 med datavalidering

Hej VBA eksperter

Jeg har i spørgsmål 266976 fundet nedenstående kode til test af CPR-nr.

Function cprtest(txtRegistrantCPR As String) As Boolean
    Dim Xvar As Long
    Dim SlutCiffer As Long
    Dim Resultat As Long
    If Not IsNull(txtRegistrantCPR) Then
    Xvar = Val(Mid(txtRegistrantCPR, 1, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 2, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 3, 1)) * 2
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 4, 1)) * 7
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 5, 1)) * 6
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 6, 1)) * 5
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 7, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 8, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 9, 1)) * 2
    SlutCiffer = Val(Mid(txtRegistrantCPR, 10, 1))
    Resultat = 11 - (Xvar Mod 11)
    If Resultat = 11 Then
    esultat = 0
    End If

    If Resultat = SlutCiffer Then
    cprtest = True
    Else
    cprtest = False
        MsgBox "Forkert CPR-nummer"
    End If
    Else
    cprtest = Null
    End If
    End Function

Ovenstående funktion er skrevet til brug i en dialogbox.

Jeg vil høre om der er en der kan hjælpe med at rette ovenstående til således, at jeg kan teste indtastningen af et CPR-nr. i en celle ved brug funktionen indsat i datavalidering?

MVH.

TVC
Avatar billede sjap Praktikant
05. april 2005 - 09:52 #1
Prøv med

Function cprtest(txtRegistrantCPR As String) As Boolean
Dim Xvar As Long
Dim SlutCiffer As Long
Dim Resultat As Long
If Not IsNull(txtRegistrantCPR) Then
    Xvar = Val(Mid(txtRegistrantCPR, 1, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 2, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 3, 1)) * 2
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 4, 1)) * 7
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 5, 1)) * 6
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 6, 1)) * 5
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 7, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 8, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 9, 1)) * 2
    SlutCiffer = Val(Mid(txtRegistrantCPR, 10, 1))
    Resultat = 11 - (Xvar Mod 11)
    If Resultat = 11 Then
        Resultat = 0
    End If
    If Resultat = SlutCiffer Then
        cprtest = True
    Else
        cprtest = False
    End If
Else
    cprtest = Null
End If
End Function


I din valideringsfunktion vælger du så brugerdefineret og skriver så bare

cprtest(A1)

hvis det altså er celle A1 du er ved at validere.
Avatar billede sjap Praktikant
05. april 2005 - 10:12 #2
Nej, den holder desværre alligevel ikke helt. Du kan ikke bruge brugerdefinerede funktioner i datavalidering. I stedet må du så lave en celle, der beregner funktionen og i datavalidering skriver du så blot

=C1

Hvis du i C1 har skrevet

=cprtest(A1)

og du har dit cprnr. i A1.
Avatar billede tvc Seniormester
05. april 2005 - 10:18 #3
Jeg kan godt få din funktion til at virke ved at indsætte =cprtest(A1) i selve arket. Jeg kan dog ikke få den til at virke i datavalidering. Der kommer den og fortæller mig:

Du har angivet navnet på et område, der ikke findes.

Har du fået den til at virke med datavalidering?

MVH.

TVC
Avatar billede tvc Seniormester
05. april 2005 - 10:22 #4
Det kan måske tænkes, at det ikke kan lade sig gøre at kalde en funktion fra datavalideringen.

Kan vi så ikke sætte MsgBox "Forkert CPR-nummer" ind igen så den får samme funktion?

Er det måske muligt at vælge en MsgBox som sender en tilbage til cellen og kræver korrekt indtastning?
Avatar billede sjap Praktikant
05. april 2005 - 10:43 #5
Du kan bruge den her i en celle, så kommer din msgbox op igen.

Public Curpos As String

Function cprtest(txtRegistrantCPR As String)
Dim Xvar As Long
Dim SlutCiffer As Long
Dim Resultat As Long

Curpos = ActiveCell.Address
If Not IsNull(txtRegistrantCPR) Then
    Xvar = Val(Mid(txtRegistrantCPR, 1, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 2, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 3, 1)) * 2
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 4, 1)) * 7
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 5, 1)) * 6
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 6, 1)) * 5
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 7, 1)) * 4
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 8, 1)) * 3
    Xvar = Xvar + Val(Mid(txtRegistrantCPR, 9, 1)) * 2
    SlutCiffer = Val(Mid(txtRegistrantCPR, 10, 1))
    Resultat = 11 - (Xvar Mod 11)
    If Resultat = 11 Then
        Resultat = 0
    End If
    If Resultat <> SlutCiffer Then
        MsgBox "Forkert CPR-nummer"
    End If
End If

End Function


ovre i regnearkets eget modul skal du så indsætte

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

If Curpos <> "" Then
    Range(Curpos).Select
End If
Curpos = ""

End Sub

Denne funktion flytter cursoren tilbage til din cprnr. celle.
Avatar billede tvc Seniormester
05. april 2005 - 11:22 #6
Det virker :-)

Jeg har blot skjult kolonnen hvor cprtest() står i så får den samme funktion som datavalideringen.

Tak Sjap
Avatar billede sjap Praktikant
05. april 2005 - 11:26 #7
:0)
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

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