Avatar billede folj Forsker
02. februar 2015 - 13:39 Der er 5 kommentarer og
1 løsning

langhåret og kompliceret IF-sætning VBA-Excel

Hej venner på eksperten.dk

Jeg har en funktion der fungerer fint nu hvor den kun arbejder med en ret simpel, og let forståelig IF-sætning

Problemet er at jeg har behov for at udbygge if-sætningen til en noget mere langhåret og kompliceret.

Jeg gennemløber nogle start- og sluttidspunkter for produktionsbatche.
Funktionen skal ud fra en forespørgselsdato (RequestDate) beregne om der er produktion hele dagen eller dele af dagen.
Da mine RequestDate kun er datoer vil der altid blive spurgt på RequestDate klokken 00:00 altså det klokkeslet døgnet starter.

I øjeblikket beregner min IF-sætning kun om det er et helt produktionsdøgn.
Jeg har brug for at udbygge den så den kan beregne hvor stor en del af døgnet der produceres
Der returneres talværdien 1 for et helt døgn, og skal tilsvarende returneres 0,5 hvis der produceres 12 timer eller 0,25 hvis der produceres 6 timer.
Altså en faktor som jeg kan gange op med når jeg skal estimere dagens råvareforbrug eller dagens produktion.

Min nuværende simple function ser således ud:
Function InProduction(RequestDate As Date, StartDateArray As Range, EndDateArray As Range)
' function skal teste om RequestDate er større end starttidspunkt og mindre end sluttidstpunkt - for så er vi i produktion
Dim SDate As Date
Dim EDate As Date
Dim i As Integer

InProduction = 0 ' sætter defaultværdi til 0 , så function returenerer 0 hvis der ikke blev fundet nogen produktion på RequestDate

For i = 1 To StartDateArray.Cells.Count ' vi løber vores StartDateArray igennem med en For-løkke
  If IsDate(StartDateArray.Cells(i, 1)) Then ' hvis der findes en dato i array
    SDate = StartDateArray.Cells(i, 1) ' hvis der findes en startdato i StartDateArray, så putter vi værdien i variablen SDate
    EDate = EndDateArray.Cells(i, 1)  ' og så henter vi slutdato på samme række i EndDateArray
   
    If RequestDate >= SDate Then    ' hvis starten af Requestdate-døgnet er større end starttidspunkt,
      If RequestDate <= EDate Then  ' og mindre end sluttidstpunkt - så er vi i produktion (hele døgnet)
        InProduction = 1 ' og vi vil returnere værdien 1
      End If ' afslutter hvis både starten og slutningen af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (hele døgnet)
    End If ' afslutter hvis starten af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (helt eller delvist døgn)
     
  End If ' afslutter hvis der findes en dato
Next i

End Function

i øjeblikket returnerer den 1 hvis det er en HEL produktionsdag, ellers returnerer den 0, også hvis det er den delvis produktionsdag.

Er der en ekspert der har det fornødne overblik det kræver at strikke en så langhåret IF-sætning sammen ?
Avatar billede andera Novice
02. februar 2015 - 13:56 #1
Idet jeg antager at datoerne indeholder klokkeslæt, så
'        InProduction = 1 ' og vi vil returnere værdien 1
erstattes af:
        InProduction = EDate - SDate

Hos mig bliver resultatet 0,5 når sdate er kl 00:00 og
edate slutter med 12:00

Hilsen
Avatar billede Sitestory Mester
02. februar 2015 - 15:50 #2
Jeg har løst en lignende opgave, blot registrerer jeg stop og stoptid. Hertil bruger jeg funktionen DateDiff som beregner den forløbne tid mellem to tidspunkter. I din opgave, hvor det er driftstid, kunne det se således ud, hvor dTidsDiff og dTotalTid er variable af datatypen Double:

dTidsDiff = DateDiff("s",datStart,datStop)
dTotalTid = dTotalTid + dTidsDiff

Til slut regner du dTotalTids sekunder om til timer.
Avatar billede folj Forsker
16. februar 2015 - 13:38 #3
Det ser sikkert ud som om jeg er helt faldet af. Det er jeg dog ikke helt. Jeg er blot taget på ferie...
Er først tilbage på arbejdet mandag den 23. Håber på jeres tålmodighed.

Har set lidt på jeres input, og jeg havde nu mere håbet på at få hjælp til opstilling af de if-sætninger der skal til at spotte om der er produktion først på dagen, og evt. igen senere på dagen. Situationen hvor der er op til 3 produktionsperioder på samme dag kan heller ikke udelukkes.

Det er især opstillingen af disse if og else, der kræver stort overblik, og her er jeg lidt begrænset af manglende overblik.
Avatar billede Sitestory Mester
21. februar 2015 - 13:33 #4
Jeg har lavet en side (http://sitestory.dk/excel_vba/stop-start-tider.htm) med et eksempel, der beregner stoptid, driftstid m.m.

Måske kan den inspirere, når du vender hjem fra ferie.
Avatar billede folj Forsker
10. marts 2015 - 09:17 #5
@Sitestory:
Det var dig der kom med de guldkorn jeg endte med at gøre brug af...
Du forslog fukktionen DateDiff, og det var jo den vej jeg skulle.

Smid lige et svar - så er der ud over ros for dit engagement også lidt points til dig.

Min færdige function kom til at se således ud:
Kort beskrevet:
Jeg spørger på en dato ved at fodre functionen med 3 inputs:
- Dato der skal spørges på.
- range med starttider fra produktionsplan og
- range med sluttider fra produktionsplan.
så skal function beregne om der produceres hele eller delvist det døgn der hører til den forespurgte dato.

Jeg beregner vha. DateDiff på hvor mange timer, men  inden værdien returneres omregner vi værdien til dage, så værdien 1 er for hele det døgn der forespørges på og 0,5 for halvdelen af døgnet.
Når jeg har det tal, kn jeg bruge det som en faktor, og blot gange op og beregne såvel dagens produktion som dagens råvareforbrug og meget andet.
Det kan potentient lette mit arbejde med beregninger i det daglige rigtig meget.


Function InProduction(RequestDate As Date, StartDateArray As Range, EndDateArray As Range)
' function skal teste om RequestDate er større end starttidspunkt og mindre end sluttidstpunkt - for så er vi i produktion

' SDate og EDate er hhv starttid og sluttid for en produktion (en batch) hentet ind fra vores produktionsplan
Dim SDate As Date
Dim EDate As Date
Dim i As Integer ' blot det tal vi briger i vores For-løkke når vi looper igennem alle rækken af planlagte produktioner

Dim RequestDateStart As Date
Dim RequestDateEnd As Date
RequestDateStart = RequestDate ' requestdate klokken 00
RequestDateEnd = RequestDate + 1 ' requestdate klokken 24

InProduction = 0 ' sætter defaultværdi til 0 , så function returenerer 0 hvis der ikke blev fundet nogen produktion på RequestDate

For i = 1 To StartDateArray.Cells.Count ' vi løber vores StartDateArray igennem med en For-løkke
  If IsDate(StartDateArray.Cells(i, 1)) Then ' hvis der findes en dato i array
    SDate = StartDateArray.Cells(i, 1) ' hvis der findes en startdato i StartDateArray, så putter vi værdien i variablen SDate
    EDate = EndDateArray.Cells(i, 1)  ' og så henter vi slutdato på samme række i EndDateArray
   
'Herunder tjekkes for 3 scenarier, hvor batch (produktion) berører det døgn der forespørges på
'det kan i teorien forekomme at flere af scenarierne forekommer i samme døgn,
'derfor skal resultatet i det ene scenarie lægges sammen med resultatet af det næste scenarie hvis de begge forekommer i det døgn der forespørges på

'Hvis en batch er startet tidligere end dette døgn, men sluttidspunktet ligger i dette døgn. 
    If SDate <= RequestDateStart Then 'Hvis en batch er startet tidligere end dette døgn
      If EDate >= RequestDateStart Then ' men sluttidspunktet rækker ind i dette døgn.
      If EDate <= RequestDateEnd Then ' men sluttidspunktet rækker ind i dette døgn.
        InProduction = InProduction + DateDiff("h", RequestDateStart, EDate)  ' og vi vil returnere værdien i timer
      End If
      End If
    End If

'Hvis en batch er så kort at både start og slut ligger i dette døgn. 
    If SDate >= RequestDateStart Then 'Hvis en batch er startet i dette døgn
      If EDate <= RequestDateEnd Then 'Hvis en batch er startet i dette døgn
        InProduction = InProduction + DateDiff("h", SDate, EDate)  ' og vi beregner værdien i timer
      End If ' slut på hvis både starten og slutningen af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (hele døgnet)
    End If ' slut på hvis starten af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (helt eller delvist døgn)

'Hvis en batch starter i dette døgn men først slutter senere i et andet døgn. 
    If SDate >= RequestDateStart Then 'Hvis en batch er startet i dette døgn.
      If SDate <= RequestDateEnd Then 'Hvis en batch er startet i dette døgn.
      If EDate >= RequestDateEnd Then ' men sluttidspunktet ligger senere end dette døgn.
        InProduction = InProduction + DateDiff("h", SDate, RequestDateEnd)  ' og vi beregner værdien i timer
      End If
      End If
    End If
 
  'Hvis en batch er så lang at både start og slut ligger hhv før og efter dette døgn. 
    If SDate <= RequestDateStart Then 'Hvis en batch er startet før dette døgn
      If EDate >= RequestDateEnd Then 'Hvis en batch slutter efter dette døgn
        InProduction = DateDiff("h", RequestDateStart, RequestDateEnd)  ' og vi beregner værdien i timer
      End If ' slut på hvis både starten og slutningen af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (hele døgnet)
    End If ' slut på hvis starten af Requestdate-døgnet er større end starttidspunkt, så har vi produktion (helt eller delvist døgn)

  End If ' slut på hvis der findes en dato
Next i

InProduction = InProduction / 24 ' omregner værdien til dage, så værdien 1 for hele det døgn der forespørges på og 0,5 for halvdelen af døgnet

End Function
Avatar billede Sitestory Mester
10. marts 2015 - 15:45 #6
Fint at du fik det til at virke - det er herligt at spare den slags arbejde :-)
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