Avatar billede Kristian H Nybegynder
06. maj 2014 - 14:11 Der er 14 kommentarer og
1 løsning

VBA: Minutter mellem to datoer

Hejsa

Jeg skal, med en VBA funktion, udregne antal minutter mellem to DateTime (hh:mm:ss dd/MM/yyyy).

Den lille krølle er at der kun skal tælles minutter på hverdage mellem 7 og 17.

Nogen som har et eksempel på dette?
Avatar billede Kristian H Nybegynder
06. maj 2014 - 14:16 #1
Rettelse: DateTime formatet er dd.MM.yyy hh:mm
Avatar billede supertekst Ekspert
06. maj 2014 - 16:00 #2
Hvad med helligdage?
Avatar billede Kristian H Nybegynder
06. maj 2014 - 16:04 #3
Helligdage er som udgangspunkt lige meget. Der skal kun kigges op om der er tale om en uge dag eller weekend
Avatar billede Kristian H Nybegynder
06. maj 2014 - 16:06 #4
Hov. Det skulle ikke oprettes som en svar. You got the point ;)
Avatar billede supertekst Ekspert
06. maj 2014 - 16:51 #5
Ok - et svar er ikke et problem lige nu. Håber senere at få tid til et forslag.
Avatar billede bvirk Guru
07. maj 2014 - 09:23 #6
DateTime er en float dagstæller, så minutter mellem to tidspunker er blot produktet af 1440 og differensen mellem tidspunkterne - evt underkaster funktionen round for at få fjernet decimalafrundingsfejl.
Avatar billede supertekst Ekspert
07. maj 2014 - 14:10 #7
Eksempel:
Const fraDag = "01.05.2014 06:30"                  'Test
Const tilDag = "05.05.2014 15:30"                  ''-"-

Const startTid = "07:00"
Const slutTid = "17:00"
Dim fraDato As Date, tilDato As Date, d As Date
Dim total As Integer, minutter As Integer, fraKl As Date, tilKl As Date
Public Sub optælTilMinutter()
    total = beregnTotalMin(fraDag, tilDag)
    MsgBox total
End Sub
Private Function beregnTotalMin(fraD, tilD)
Dim aktuelleDato
    minutter = 0
    fraDato = Replace(fraD, ".", "-")
    tilDato = Replace(tilD, ".", "-")
   
    For d = fraDato To tilDato
Rem test ugedag - MAN-FRE
        If Weekday(d, vbMonday) < 6 Then
            aktuelleDato = Format(d, "dd-mm-yyyy")
           
Rem er det første dag
            If d = fraDato Then
                fraKl = Format(fraDato, "hh:mm")
                tilKl = slutTid
               
                If fraKl < startTid Then
                    fraKl = startTid
                End If
            End If
           
Rem er det sidste dato
            If aktuelleDato = Format(tilDato, "dd-mm-yyyy") Then
                tilKl = Format(tilDato, "hh:mm")
                If tilKl > slutTid Or tilKl < startTid Then
                    tilKl = slutTid
                End If
            End If
           
Rem øvrige dage
            If aktuelleDato > Format(fraDato, "dd-mm-yyyy") And aktuelleDato < Format(tilDato, "dd-mm-yyyy") Then
                fraKl = startTid
                tilKl = slutTid
            End If
           
            minutter = minutter + DateDiff("n", fraKl, tilKl)
        End If
    Next d
    beregnTotalMin = minutter
End Function
Avatar billede Kristian H Nybegynder
07. maj 2014 - 21:59 #8
Hej Supertekst

Jeg har nu testet koden, men det ser ud til at den et eller andet sted går galt i byen.

Eks. Starttid: 12.02.2014 11:50 sluttid: 18.03.2014 11:27:00

Dette får jeg til 14377 minutter. Metoden får det til 13510 minutter.

12.02.2014 11:50    12.02.2014 17:00    5:10
13.02.2014 07:00    13.02.2014 17:00    10:00
14.02.2014 07:00    14.02.2014 17:00    10:00
15.02.2014 07:00    15.02.2014 17:00    0:00
16.02.2014 07:00    16.02.2014 17:00    0:00
17.02.2014 07:00    17.02.2014 17:00    10:00
18.02.2014 07:00    18.02.2014 17:00    10:00
19.02.2014 07:00    19.02.2014 17:00    10:00
20.02.2014 07:00    20.02.2014 17:00    10:00
21.02.2014 07:00    21.02.2014 17:00    10:00
22.02.2014 07:00    22.02.2014 17:00    0:00
23.02.2014 07:00    23.02.2014 17:00    0:00
24.02.2014 07:00    24.02.2014 17:00    10:00
25.02.2014 07:00    25.02.2014 17:00    10:00
26.02.2014 07:00    26.02.2014 17:00    10:00
27.02.2014 07:00    27.02.2014 17:00    10:00
28.02.2014 07:00    28.02.2014 17:00    10:00
01.03.2014 07:00    01.03.2014 17:00    0:00
02.03.2014 07:00    02.03.2014 17:00    0:00
03.03.2014 07:00    03.03.2014 17:00    10:00
04.03.2014 07:00    04.03.2014 17:00    10:00
05.03.2014 07:00    05.03.2014 17:00    10:00
06.03.2014 07:00    06.03.2014 17:00    10:00
07.03.2014 07:00    07.03.2014 17:00    10:00
08.03.2014 07:00    08.03.2014 17:00    0:00
09.03.2014 07:00    09.03.2014 17:00    0:00
10.03.2014 07:00    10.03.2014 17:00    10:00
11.03.2014 07:00    11.03.2014 17:00    10:00
12.03.2014 07:00    12.03.2014 17:00    10:00
13.03.2014 07:00    13.03.2014 17:00    10:00
14.03.2014 07:00    14.03.2014 17:00    10:00
15.03.2014 07:00    15.03.2014 17:00    0:00
16.03.2014 07:00    16.03.2014 17:00    0:00
17.03.2014 07:00    17.03.2014 17:00    10:00
18.03.2014 07:00    18.03.2014 11:27    4:27

Total: 239:37 timer = 14377 minutter
Avatar billede supertekst Ekspert
07. maj 2014 - 23:00 #9
Hej

Tak for meldingen - skal se på det.
Avatar billede supertekst Ekspert
07. maj 2014 - 23:22 #10
Har fundet fejlen:
Er i forbindelse med slutdatoen - den kommer ikke med i beregningen.
Version 2 udarbejdes..
Avatar billede supertekst Ekspert
07. maj 2014 - 23:41 #11
Rem Version 2
Const fraDag = "12.02.2014 11:50"                  'Test
Const tilDag = "18.03.2014 11:27"                  '-"-

Const startTid = "07:00"
Const slutTid = "17:00"
Dim fraDato As Date, tilDato As Date, d As Date
Dim total As Integer, minutter As Integer, fraKl As Date, tilKl As Date, flag As Boolean
Public Sub optælTilMinutter()
    total = beregnTotalMin(fraDag, tilDag)
    MsgBox total
End Sub
Private Function beregnTotalMin(fraD, tilD)
Dim aktuelleDato
    minutter = 0
    fraDato = Replace(fraD, ".", "-")
    tilDato = Replace(tilD, ".", "-")
    flag = False
   
    For d = fraDato To tilDato
Rem test ugedag - MAN-FRE
        If Weekday(d, vbMonday) < 6 Then
            aktuelleDato = Format(d, "dd-mm-yyyy")
           
Rem er det første dag
            If d = fraDato Then
                fraKl = Format(fraDato, "hh:mm")
                tilKl = slutTid
               
                If fraKl < startTid Then
                    fraKl = startTid
                End If
            End If
           
Rem er det sidste dato
            If aktuelleDato = Format(tilDato, "dd-mm-yyyy") Then
                flag = True
                tilKl = Format(tilDato, "hh:mm")
                If tilKl > slutTid Or tilKl < startTid Then
                    tilKl = slutTid
                End If
            End If
           
Rem øvrige dage
            If aktuelleDato > Format(fraDato, "dd-mm-yyyy") And aktuelleDato < Format(tilDato, "dd-mm-yyyy") Then
                fraKl = startTid
                tilKl = slutTid
            End If
           
            minutter = minutter + DateDiff("n", fraKl, tilKl)
        End If
    Next d

Rem Test om sidste dag er beregnet
    If flag = False Then
        minutter = minutter + DateDiff("n", startTid, Format(tilDato, "hh:mm"))
    End If
   
    beregnTotalMin = minutter
End Function
Avatar billede Kristian H Nybegynder
08. maj 2014 - 07:30 #12
Hej supertekst

Det giver et nyt resultat, 13777 minutter, men desværre ikke de 14377 minutter jeg havde håbet på. Det er 10 timer der mangler. Glemmer den evt. en dag eller er det mig der har lavet en fejl i udregningen?
Avatar billede supertekst Ekspert
08. maj 2014 - 09:13 #13
Hej tudack

Når jeg kører version 2 med de deri indsatte datoer - så bliver resultatet: 14377

PS: Jeg bemærkede også en lille forskel i kørslen af version 1 i dit resultat sammenlignet med mit. I mit kunne jeg se at det var den sidste dag der manglede.
Avatar billede Kristian H Nybegynder
08. maj 2014 - 09:26 #14
Jeg fandt en lille fejl hos mig selv. Det virker helt perfekt. Smid et svar
Avatar billede supertekst Ekspert
08. maj 2014 - 09:42 #15
Fint -
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

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