Avatar billede staal84 Nybegynder
23. november 2005 - 20:57 Der er 8 kommentarer og
1 løsning

Hvordan undgår jeg dobbelt registrering af sygefravær. (VBA XL)

Hej

Jeg har lavet et lille sygefraværs-registreringsprogram i VBA i Excel. Man vælger afdeling - person - fraværsgrund og dato.
Når man klikker "gem" smider programmet den netop valgte Afdeling (A), Person(B), Fraværsgrund (C) og dato(D) over i et regneark. Disse info placeres i kolonne A,B,C og D og når man laver en ny registrering listes de i rækken nedenunder....

Men hvordan undersøger jeg om personen er registreret før med samme dato?

Hvis jeg vidste det, var det jo intet problem at lave en sød lille meddelelsesboks, som fortæller brugeren at "tillid er godt med kontrol er bedre!".

Jeg håber og tror på jer.
Avatar billede brynil Nybegynder
23. november 2005 - 21:24 #1
Kan du bruge dette til at komme videre:

Sub NySygeDag()
Dim nyPers, sDag As String

nyPers = "p2"          ' fås fra dine indtastninger
sDag = "20-06-2005"    ' fås fra dine indtastninger

a = Sheets("Ark2").Range("A65000").End(xlUp).Row

For i = 1 To a
    If Sheets("Ark2").Cells(i, 2).Text = nyPers Then
        If Sheets("Ark2").Cells(i, 4).Text = sDag Then
            MsgBox "Er allerede syg"
            Exit Sub
        End If
    End If
Next i

End Sub
23. november 2005 - 21:26 #2
Indsæt denne funktion i din kode og kald den f.eks. således:
''denne if sætning skal f.eks. være i koden for din OK-knap
If RegistredBefore(Textbox1.Text, Textbox2.Text) Then
    'Gem ikke
    MsgBox "Det indtasted er registret tidligere!", _
        vbExclamation + vbOKOnly, "Systeminformation"
    Exit Sub
Else
    'Gem indholdet af dine felter
End If


Function RegistredBefore(ByVal sPerson As String, ByVal sDate As String) As Boolean
    ' Funktionen returnerer TRUE, hvis en dobbelt registrering er igang.
    Dim bRetVal As Boolean
    Dim vntArea As Variant 'R,C
    Dim lRow As Long
   
    bRetVal = False
    vntArea = Worksheets("Sheet1").UsedRange
   
    For lRow = 1 To UBound(vntArea, 1)
        If vntArea(lRow, 2) = sPerson Then
            If vntArea(lRow, 4) = sDate Then
                bRetVal = True
                Exit For
            End If
        End If
    Next lRow
   
    DblReg = bRetVal
End Function
Avatar billede kabbak Professor
23. november 2005 - 22:02 #3
Flemmingdahl >

er det ikke
RegistredBefore = bRetVal

i stedet for

  DblReg = bRetVal
23. november 2005 - 22:05 #4
jo - godt set kabbak - ikke sådan når man ændre navnet til sidst *s*
Avatar billede staal84 Nybegynder
23. november 2005 - 22:27 #5
Okay - I er pænt hakket til det her.
Ja det tog et stykke tid at afkryptisere jeres svar....og jeg mangler lidt endnu til helt at forstå flemming Dahl's....ja I må bære over med mig.

Det er et "userform" jeg har lavet og med lidt små tilpasninger har jeg fået brynils svar til at fungere ganske som jeg havde håbet på. Det ser således ud for min cmdGem_Click():

Dim nyPers As String
Dim sDag As Date

nyPers = lstPerson          ' fås fra dine indtastninger
sDag = cboDato    ' fås fra dine indtastninger

a = Sheets("Data").Range("A65000").End(xlUp).Row

For i = 1 To a
    If Sheets("Data").Cells(i, 2).Text = nyPers Then
            If Sheets("Data").Cells(i, 4).Value = sDag Then
                    MsgBox "Er allerede syg"
                    Exit Sub
            End If
        End If
Next i

Så point går til brynil hvis han vil anderkende sit svar.

Jeg beklager Flemming Dahl, jeg mangler lidt endnu til at blive en ægte VBA-Jedi, jeg kan godt forstå (bobbob) koden, men blev i tvivl om, hvordan den skulle placeres.

Takker for indsatsen.
KH
Michael
23. november 2005 - 22:39 #6
smiler - selve funktionen placeres i et eller andet sted sammen med din userform kode. Funktionen returnerer TRUE eller FALSE, hvilket fortæller dig om oplysningerne er gemt før.

Din cmdGem_Click() skal så se således ud

Private Sub cmdGem_Click()
    If RegistredBefore(Textbox1.Text, Textbox2.Text) Then
        'Gem ikke fordi den allerede findes
        MsgBox "Det indtasted er registret tidligere!", _
            vbExclamation + vbOKOnly, "Systeminformation"
        Exit Sub
    Else
        'kode der gemmer indholdet af dine felter
    End If
End Sub
23. november 2005 - 23:14 #7
Jeg har lige lavet et lille eksempel, som kan downloades her
http://www.smartoffice.dk/Tips/Eksperten/Index.asp
Avatar billede brynil Nybegynder
23. november 2005 - 23:28 #8
Meget gerne! I det hér selskab er det sjældent pointene går denne vej ;))
Tak for point!
23. november 2005 - 23:33 #9
brynil - en løsning der virker og kan forstås er altid point værd :-)

Kig engang på eksemplet - metoden er væsentlig hurtigere (ved større datamængder) idet jeg looper i en variabel istedet for i arket.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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