23. januar 2008 - 10:06Der er
13 kommentarer og 2 løsninger
Anvendelse af funktion i Modul
Jeg har altid haft problemer med at anvende funktioner, som jeg selv har oprettet i et modul i Access - så nu forsøger jeg at få lidt hjælp
I et modul, som tester et cvr.nr efter Modulus 11, har jeg skrevet følgende:
Public Function CvrTest()
Dim TestSum As Long Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, G As Integer, H As Integer
A = Mid(cvr, 1, 1) B = Mid(cvr, 2, 1) C = Mid(cvr, 3, 1) D = Mid(cvr, 4, 1) E = Mid(cvr, 5, 1) F = Mid(cvr, 6, 1) G = Mid(cvr, 7, 1) H = Mid(cvr, 8, 1)
TestSum = (2 * A + 7 * B + 6 * C + 5 * D + 4 * E + 3 * F + 2 * G + 1 * H)
If (TestSum Mod 11) <> 0 Then
MsgBox "CVR er ikke korrekt"
Cancel = True
End If
End Function
Det skal bemærkes, at ovenstående virker fint, når sætningen er sat ind i en procedure i en formular.
Jeg har oprettet en testtabel, hvor der kun er et felt, nemlig Cvr af typen langt heltal.
På grundlag af denne tabel har jeg oprettet en formular, også kun med et felt, nemlig Cvr.
På dette felts Før Opdatering hændelse, skriver jeg følgende:
=CvrTest(Cvr)
Jeg får så følgende fejlmeddelelse:
Udtrykket FørOpdatering, du indtastede som indstilling af hændelsesegenskaben gav en fejl: Det indtastede udtryk indeholder et funktionsnavn, som Konkurser og Tvangsopløsninger (det hedder mit program) ikke kan finde.
Men når jeg ser i Udtryksgenerator, er der faktisk en funktion der hedder CvrTest, og som kan sættes ind.
Håber der er en, der har tid til at hjælpe mig, da jeg altid får det samme problem, når jeg forsøger at bruge egne funktioner.
I would also change the function to something like thsi so that message boxes arent used here but in the code which calls the function.
Public Function CvrTest(cvr As Variant) AS Boolean
Dim TestSum As Long Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, G As Integer, H As Integer
CvrTest = False
A = Mid(cvr, 1, 1) B = Mid(cvr, 2, 1) C = Mid(cvr, 3, 1) D = Mid(cvr, 4, 1) E = Mid(cvr, 5, 1) F = Mid(cvr, 6, 1) G = Mid(cvr, 7, 1) H = Mid(cvr, 8, 1)
TestSum = (2 * A + 7 * B + 6 * C + 5 * D + 4 * E + 3 * F + 2 * G + 1 * H)
If (TestSum Mod 11) <> 0 Then Exit sub
CvrTest = True End Function
And I'm not at all sure if your fucntion works, doesnt seem to wok with mine!
Jeg kan sende en lille db der viser, hvordan jeg sender en variabel fra en formular til et modul og foretager en beregning. Måske den kan hjælpe dig lidt videre. f.eks.således:
CPR.Check CPRNR
der kalder modulet CPR funktionen Check og sender variablen CPRNR til modulet.
Public Function Check(CPRNR) Dim Rst As Recordset, Db As Database Dim VGT As String, i, Sum As Integer, ModSum As Integer, Kontrolciffer As Integer, Svar As String VGT = 432765432 If Len(CPRNR) <> 10 Then Svar = Msgbox(Prompt:="Der skal indtastes 10 cifre i CPR." & Chr$(13) & Chr$(13) & "Der må ikke indtastes bindestreg." & Chr$(13) & Chr$(13) & "Klik på OK og vend tilbage til CPR-feltet og foretag ny indtastning.", Title:="Indtastningsfejl", Buttons:=vbOKOnly) DoCmd.GoToControl "CPRNR" Exit Function End If For i = 1 To 9 Sum = Sum + (Val(Mid(CPRNR, i, 1)) * Val(Mid(VGT, i, 1))) Next ModSum = Sum Mod 11 If ModSum = 0 Then Kontrolciffer = 0 Else Kontrolciffer = 11 - ModSum End If If Val(Right(CPRNR, 1)) <> Kontrolciffer Then Svar = Msgbox(Prompt:="Efter indtastning af CPR-nummer har programmet foretaget en gyldighedstest af det indtastede." & Chr$(13) & Chr$(13) & "Testen har afsløret en eller flere fejl i det indtastede CPRNR." & Chr$(13) & Chr$(13) & "Klik på OK vend tilbage til CPR-feltet og foretag en ny indtastning." & Chr$(13) & Chr$(13) & "Du kan ikke gå videre, før programmet har godkendt CPR-NR", Title:="Forkert indtastet CPR-NR", Buttons:=vbCritical + vbExclamation) DoCmd.GoToControl "CPRNR" 'Vender tilbage til CPR-feltet hvis dette er forkert' End If End Function
Specielt vedrøende Mugs forslag ville jeg synes, at den direkte skulle skrive tilbage, hvis CPR nummeret ikke var validt. Men den siger stadig, at programmet ikke kan finde funktionsnavnet, selvom funktionen er sat ind fra udtryksgenerator.
Så det er min opfattelse, at jeg gør et eller andet forkert, når jeg kalder funktionen.
Til Mugs: Min e-mail er kristensen@dbmail.dk så det ville være fint, hvis det kunne hjælpe mig videre.
Hej igen !! Terry, din løsning virker fint. Mugs - tak for mails - jeg ved ikke om jeg kan åbne RAR filerne, men jeg forsøger. Men jeg er stadig lidt varm på dit forslag, da det ser ud til, at funktionen må kunne køres, uden at der skal yderligere kode i VBA til. Og hvis der skal kode til i hændelse BEFORE Update, hvordan skal den så se ud - og kan den skrives direkte ind i egenskabsvinduet (som jeg har forsøgt jf. ovenstående), eller skal der lidt VBA til? Er det i orden, hvis jeg deler points, da jeg har fået en masse god input fra jer begge?
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.