Avatar billede petert Forsker
17. december 2005 - 07:28 Der er 14 kommentarer og
2 løsninger

Formel hjælp til datoer

I et lønskema ønsker jeg at gøre følgende.Jeg vil i felt C32 indtaste et nummer 1-12 der svare til måndesnummer 1=januar, 2=febuar osv.I nedenstående går jeg ud fra 1=Januar 2006.Der skal så ske følgende.
1.I felt B29 skal stå Lønperioden. "16-12-2005 til 15-01-2006" (kan man tage højde for årsskiftet???)
2.I felt c30 skal stå første dato i perioden "16-12-2005"
3.I felt c31 skal stå sidste dato i januar "28-01-2006"(det er den dato lønnen skal være til dispotion på en konto i banken)
Skemaet bliver altid udfyldt i samme måned som eks. vis 1=januar således man kan bruge pc,ens dato.
Er der nogle der har en god ide hvordan man løser dette bedst????
Avatar billede sjap Praktikant
17. december 2005 - 11:04 #1
Hvis du f.eks. i C33 skriver årstallet, kan du gøre sådan her (ved nogen af felterne):

B29: =TEKST(DATO(C33;C32-1;16);"dd-mm-åååå") & " - " & TEKST(DATO(C33;1;15);"dd-mm-åååå")

C30: =DATO(C33;C32-1;16)

Jeg ved ikke lige hvordan du vælger start datoen.


C32: =MÅNED(IDAG())

Den sidste vil jeg være lidt varsom med at bruge, for hvis du så åbner arket en dag for sent, så skrives den forkerte måned. Hvis du mener at feltet blot skal udfyldes med en fast værdi første gang arket åbnes, så er det en anden ting - så kræver det en lille makro.

Jeg skal lige ud og handle, men måske dukker der andre hjælpsomme sjæle op inden jeg kommer tilbage :0)
Avatar billede sjap Praktikant
17. december 2005 - 14:27 #2
Glem lige det med årstallet igen. Det kan klares på følgende måde:

C32: =IDAG()

C32 skal så blot formateres til at vise måneden "m".

I de øvrige felter skal der så stå

B29: =TEKST(DATO(ÅR(C32);MÅNED(C32)-1;16);"dd-mm-åååå") & " til " & TEKST(DATO(ÅR(C32);MÅNED(C32);15);"dd-mm-åååå")

C30: =DATO(ÅR(C32);MÅNED(C32)-1;16)
Avatar billede sjap Praktikant
17. december 2005 - 14:44 #3
Jeg forstår ikke, hvad det er du vil have til at stå i felt C31. Den sidste dag i januar er da den 31. Det er samtidig en hverdag - dvs. en bankdag. Den 28. januar er en lørdag, der ikke er en bankdag.
Avatar billede sjap Praktikant
17. december 2005 - 14:47 #4
Hvis det du er ude efter er den sidste hverdag i måneden, kan du bruge nedenstående kode, som du bare kopierer.

Function SidsteArbejdsDag(Dato As Long) As Long
Dim Arbejdsdag As Boolean

SidsteArbejdsDag = Dato
Do Until Arbejdsdag
    If ErHelligdag(SidsteArbejdsDag, True, True) Then
        SidsteArbejdsDag = SidsteArbejdsDag - 1
    Else
        Arbejdsdag = True
    End If
Loop

End Function

Function ErHelligdag(testDato As Long, InclLørdage As Boolean, InclSøndage As Boolean) As Boolean
Dim InputYear As Integer, PD As Long, OK As Boolean
    If testDato <= 0 Then testDato = Date
    InputYear = Year(testDato)
    PD = Påskedag(InputYear)
    OK = True
    Select Case testDato
        Case DateSerial(InputYear, 1, 1)    ' Nytårsdag
        Case PD - 7    ' Palmesøndag
        Case PD - 3    ' Skærtorsdag
        Case PD - 2    ' Langfredag
        Case PD        ' Påskedag
        Case PD + 1    ' 2. påskedag
        Case PD + 26    ' St. Bededag
        Case PD + 39    ' Kristi Himmelfartsdag
        Case PD + 49    ' Pinsedag
        Case PD + 50    ' 2. Pinsedag
        Case DateSerial(InputYear, 12, 24)  ' Juleaftensdag
        Case DateSerial(InputYear, 12, 25)  ' Juledag
        Case DateSerial(InputYear, 12, 26)  ' 2. Juledag
        Case DateSerial(InputYear, 12, 31)  ' Nytårsaftensdag
        Case Else
            OK = False
            If InclLørdage Then
                If WeekDay(testDato, vbMonday) = 6 Then
                    OK = True
                End If
            End If
            If InclSøndage Then
                If WeekDay(testDato, vbMonday) = 7 Then
                    OK = True
                End If
            End If
    End Select
    ErHelligdag = OK
End Function

Function Påskedag(InputYear As Integer) As Long
Dim d As Integer
    d = (((255 - 11 * (InputYear Mod 19)) - 21) Mod 30) + 21
    Påskedag = DateSerial(InputYear, 3, 1) + d + (d > 48) + 6 - ((InputYear + InputYear \ 4 + d + (d > 48) + 1) Mod 7)
End Function


Når det er på plads kan du i C31 skrive

=SidsteArbejdsDag(DATO(ÅR(C32);MÅNED(C32)+1;0))
Avatar billede sjap Praktikant
17. december 2005 - 14:48 #5
Jeg har afprøvet ovenstående i et lille regneark som du selvfølgelig gerne må se. Læg en mail-adresse hvis du er interesseret.
Avatar billede petert Forsker
17. december 2005 - 21:53 #6
Hej sjap tusind tak for ovenstående. Jeg er lige kommet hjem og har ikke tid mere i aften men vender tilbage i norgen.Det er klart vedr. sidste dag i januar jeg var ikke rigtig vågen i morges. Det skal være sidste hverdag i måneden.
Foreløbig tak og her er min mail ft@3060.dk
Mvh.
Petert
Avatar billede petert Forsker
18. december 2005 - 07:54 #7
Jeg har måske ikke udtrykt mig presist i spørgsmålet omkring C32.
1.
I C32 ville jeg indtaste et tal fra 1 til 12. Dette tal skulle indikerer hvilken periode lønsedlen omhandlede.Her er måske et problem omkring årskiftet.
Eks.Hvis jeg tastede 1 skulle lønsedlen omhandle perioden 16-12-foregående år til 15-01-2005 (forudsat jeg indtaster lønsedlen i dag 2005).Hvis jeg indtaster 2 skulle perioden være 16-01-2005 til 15-02-2005 osv.
2.Jeg kan se i dit eksembel det virker omkring din kode, men hvordan kopier jeg og overfører jeg koden til midt ark???
Mvh
Petert
Avatar billede sjap Praktikant
18. december 2005 - 10:54 #8
1. Hvis du blot ønsker at indlæse måned i C32, så skal du lige fortælle, hvor du så indlæser årstallet - det skal bruges i beregningerne af sidste hverdag.

2. Tryk Alt-F11 og find arket "Modul1" under "Moduler" i venstre side af skærmen og kopier al teksten fra vinduet til højre (eller kopier dem direkte fra mit svar kl. 14:47:07 i går).
Mens du stadig er i VBA-editoren finder du dit regneark i venstre side, og markerer det. Vælg menuen Indsæt/Moduler. I højre side er nu en blank side, hvor du så kan indsætte koden.
Avatar billede petert Forsker
18. december 2005 - 13:18 #9
Ok jeg forstår.I c32 indtaster jeg nummeret for måneden ( eks 1 for første lønperiode fra 16-12-2005 til 15-01-2006 og i c 33 indtaster jeg året(eks 2006)
Dette forudsætte jeg udfylder lønskemaet i slutningen af januar 2006.Man skal så hvert år i januar ændre årstallet og det er OK.
Jeg prøver i eftermiddag om jeg kan finde ud af og indlæse koden som du beskriver.Dette har jeg ikke gjordt før men er meget intreseret i at lære dette, da jeg kan bruge det i mange andre sammenhænge
Mvh
Petert
Avatar billede sjap Praktikant
18. december 2005 - 14:45 #10
Det kræver lige lidt småændringer i regnearket:

B29: =TEKST(DATO(C33;C32-1;16);"dd-mm-åååå") & " til " & TEKST(DATO(C33;C32;15);"dd-mm-åååå")
C30: =DATO(C33;C32-1;16)
C31: =SidsteArbejdsDag(DATO(C33;C32+1;0))
Avatar billede petert Forsker
18. december 2005 - 15:55 #11
Hej sjap
Den er lige ved at være der men den laver en fejl. B29,C30 virker pefekt men i C31 står der #NAVN?
Til op lysning er c32 og c33 formateret som standard.
Jeg har prøvet og indsætte formlerne i dit ark og her virker der som det skal. Hvad hulen har jeg gjort galt, kan det være noget med indsættelsen af koden i moduel 1???
Avatar billede petert Forsker
18. december 2005 - 16:04 #12
Hej sjap
Der er også fejl i c31 hvis jeg indsætter formlerne i arket fra dig.hvis jeg i c32 skriver 1 og c33 2005 viser c31 31-01-1900??
Avatar billede sjap Praktikant
18. december 2005 - 16:10 #13
Fejlen #NAVN? i C31 skyldes at funktionen SidsteArbejdsDag ikke er indsat i regnearket. Hvis den er sat ind, så prøv at lukke regnearket og åbn det igen.
Avatar billede petert Forsker
18. december 2005 - 16:20 #14
Jeg har lige prøvet igen men der er stadig fejl.jeg har indsat formlen "SidsteArbejdsDag(DATO(C33;C32+1;0))"i c31
Avatar billede petert Forsker
18. december 2005 - 16:41 #15
Hej igen nu lysner det. jeg slettede koden i modul 1 og indsatte denne igen lukkede og åbnede og så virkede det.Nu kom der så en advarsel ud for B29,C30,C31 at disse ikke var låst dette gjorde jeg så og ok.
Selve arket skal køre på en anden pc, er der noget jeg skal tage højde for når jeg flytter obver for også at få koden i modul1 med over eller er den automatisk med over når jeg kopier???
Tusind tak for kampen og din tålmodighed med en "langt fra exel nørd"
mvh
Petert
Avatar billede sjap Praktikant
18. december 2005 - 17:20 #16
De der "ikke låst" advarsler forstår jeg ikke. Men du har måske fornøjelsen af en nyere version af Excel (jeg sidder stadig og hakker i en 97'er).

Når al kode etc. er placeret i regnearket, skulle der ikke være nogen problemer med at flytte regnearket fra en PC til en anden. MEN som altid kan det anbefales at prøve det - der kommer af og til overrraskelser :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
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