24. januar 2007 - 09:55Der er
5 kommentarer og 1 løsning
Ugeskema i excel
Hej...
Jeg har lavet et ugeskema i excel. Nu vil jeg så gerne til at gøre det lidt mere avanceret.
Jeg har felterne: Løn nr i A2 Uge nr i D2 Afdeling i F2 Mandag i H2 Søndag i J2 Navn i M2
Jeg vil nu gerne have, at der kommer en popup når man åbner arket, hvori man kan skrive løn nr, afdeling og uge. Udfra en eller anden form for database, skal arket nu selv udfylde løn nr, uge nr. datoen for hhv mandag og søndag, afdelings nr og navnet.
Hvordan klares det nemmest? Og kan man lave det sådan, at hvis man fx taster forkert løn nr, at den bare accepterer det uden at importere navne data?
Kan det også laves sådan, at næste gang man åbner arket, så kommer popup'en ikke frem hvis felterne allerede er udfyldt?
Ja et eller andet sted fra skal den jo hente navne. Men da selve regnearket helst også skal kunne køre selvstændigt vil jeg da foretrække at det ligger med i regnearket, evt måske på et andet ark?
Ja dne skal bare acceptere. Der sker en rimelig stor udskiftning af folk, så hvis den ikke er helt opdateret skal folk jo stadig kunne lave sedler...
Her er et forslag: Koden anbringes i ThisWorkbook (VBA Alt+F11) ============================================
Sub workbook_activate() Rem Test om de faste felter er udfyldt? With ActiveWorkbook.Sheets(1) If .Range("A2") <> "" And .Range("D2") <> "" And .Range("F2") <> "" And _ .Range("H2") And .Range("J2") <> "" And .Range("M2") <> "" Then Exit Sub Else Load UserForm1 UserForm1.Show 0 End If End With End Sub
Denne kode anbringes i en userform I userformen er der 3 tekstbokse: - 1: Lønnr - 2: Afd.nr. - 3: Ugenr 2 knapper: - 1: OK - 2: Annuller =================================== Private Sub CommandButton1_Click() 'OK - udfør opslag i ark2 Dim fundetRæk ActiveWorkbook.Sheets(1).Activate
Rem hent Navn fra Ark2 - hvis løn nr. er fundet If fundetRæk > 0 Then Range("M2") = .Cells(fundetRæk, 2) 'navn End If
Rem Beregn Mandag & søndag i ugen mandag = findDatoUge(Me.TextBox3) If mandag <> "" Then Range("H2") = mandag Range("J2") = DateAdd("d", 6, mandag) End If End With
Rem Juster kolonnebredde Columns.AutoFit
Rem Luk userform Unload UserForm1 End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) testOK End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) testOK End Sub Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) testOK End Sub Private Sub testOK() With Me If .TextBox1 <> "" And .TextBox2 <> "" And .TextBox3 <> "" Then .CommandButton1.Enabled = True .CommandButton1.SetFocus Else .CommandButton1.Enabled = False End If End With End Sub Private Sub UserForm_activate() Me.CommandButton1.Enabled = False End Sub Private Function udførOpslag(lønNr) Dim antalRæk With ActiveWorkbook.Sheets(2) 'Navne antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
Rem Overskrifter i række 1 For ræk = 2 To antalRæk If .Cells(ræk, 1) = Val(lønNr) Then udførOpslag = ræk Exit Function End If Next ræk End With udførOpslag = 0 End Function Private Function findDatoUge(unr) 'første dato med ugenr - sidste år Dim dato, ugeNr ugeNr = 0 dato = "01-01-" + CStr(Year(Now)) ugeNr = Format(dato, "ww", 2, 2)
While ugeNr = 52 ugeNr = Format(dato, "ww", 2, 2) dato = DateAdd("d", 1, dato) Wend
While ugeNr <> Val(unr) ugeNr = Format(dato, "ww", 2, 2)
If ugeNr = Val(unr) Then findDatoUge = dato Exit Function End If dato = DateAdd("d", 1, dato) Wend findDatoUge = "" End Function
Hvis det er nemmere - så senden mail til: pb@supertekst-it.dk - så returnerer jeg modellen.
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.