23. november 2005 - 20:57Der 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!".
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
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
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.
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
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.
Synes godt om
Ny brugerNybegynder
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.