Avatar billede folj Forsker
23. januar 2015 - 11:03 Der er 4 kommentarer og
1 løsning

Egen function returnerer #VALUE

Jeg har en egen function der skal løbe nogle datoer i produktionsplan igennem (Startdatoer i kolonne G og slutdatoer i kolonne I) og teste om der er produktion på en given dato.
Hvis der er produktion returneres talværdien 1, hvis ikke returneres talværdien 0.

Nu hvor jeg har fået functionen op at køre, så returnerer den fejlen #VALUE, uden jeg kan regne ud hvorfor.
I første forsøg tester jeg functions direkte i cellen eksempelvis med formlen
=InProduction(B16;G2:G6;I2:I6)


Her kommer min function:
Function InProduction(RequestDate As Date, StartDateArray As Variant, EndDateArray As Variant)
' 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

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 UBound(StartDateArray, 1) ' vi løber vores StartDateArray igennem med en For-løkke
  If IsDate(StartDateArray(i, 1)) Then
    SDate = StartDateArray(i, 1) ' hvis der findes en startdato i StartDateArray, så putter vi værdien i variablen SDate
    EDate = EndDateArray(i, 1)  ' og så står slutdato på samme plads i EndDateArray
    If RequestDate > SDate Then  ' hvis større end starttidspunkt
      If RequestDate < EDate Then ' hvis større end starttidspunkt og mindre end sluttidstpunkt - så er vi i produktion
        InProduction = 1 ' og vi vil returnere værdien 1
      End If ' hvis vi er i prod slutter
    End If ' hvis større end starttidspunkt slutter
 
  End If ' hvis der findes en dato slutter
Next i

End Function


For fejlfinding har jeg testet hvordan functionen svarer hvis jeg laver functionskaldet fra en makro (VBA-kode).
Når jeg afvikler nedenstående sub-procedure, tester jeg om der er produktion i dag, og skriver talværdien ind i en ønsket celle, og her returnerer proceduren ganske rigtigt talværdien 1

Sub IsInProduction()
' Her har jeg lavet en sub der skal teste min function (regne ud om datoen i dag har produktion, og med VBA skrive talværdien 0 eller 1 ind i cellen
Dim RDate As Date
Dim SDateArray As Variant
Dim EDateArray As Variant

RDate = Date
SDateArray = Range("G2:G6")
EDateArray = Range("I2:I6")

ActiveSheet.Range("D17").Value = InProduction(RDate, SDateArray, EDateArray)
End Sub

Jeg søger hjælp til at komme videre med fejldinding, så jeg kan kalde functionen direkte fra en celle, og bruge den i min formel.
Avatar billede jens48 Ekspert
23. januar 2015 - 11:25 #1
Du sætter SDate og EDate til samme værdi og bagefeter spørger du om RequestDate er både Større end SDate og mindre end EDate. Det kan ikke lade sig gøre. Mon ikke <= og >= i stedet for < og > kan klare det?
Avatar billede folj Forsker
23. januar 2015 - 12:25 #2
@Jens48
Nej.
SDate henter sin værdi fra arrayet StartDateArray, og
EDate henter sin værdi fra arrayet EndDateArray,
derfor er det ikke de samme værdier jeg tester op mod hinanden.

Derfor er det ikke om jeg bruger > eller >= der gør forskellen på om den svarer #VALUE eller ej.
24. januar 2015 - 09:42 #3
Prøv med denne (bruger Range i stedet for Variant

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
Dim c As Range
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
    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å står slutdato på samme plads i EndDateArray
    If RequestDate > SDate Then  ' hvis større end starttidspunkt
      If RequestDate < EDate Then ' hvis større end starttidspunkt og mindre end sluttidstpunkt - så er vi i produktion
        InProduction = 1 ' og vi vil returnere værdien 1
      End If ' hvis vi er i prod slutter
    End If ' hvis større end starttidspunkt slutter
 
  End If ' hvis der findes en dato slutter
Next i

End Function
Avatar billede folj Forsker
24. januar 2015 - 16:32 #4
@thor_ostergaard:
Ja et er en (for mig) hidtil uset måde at arbejde med arrays på, hvis man ellers kalder det arrays på denne måde.

Jeg har altid holdt mig til den aldeles fremragende array-guide her på eksperten http://www.eksperten.dk/guide/522.

Har jeg for øvrigt ikke ret i at du erklærer en øverflødig variabel c med linien:
Dim c As Range

Jeg kan ikke spotte at du efterfølgende bruger variablen til noget. Er det ikke rigtigt? (at det er forkert)

Men resultatet kan man ikke klage på - det løser jo mit problem med at functionen returnerer #VALUE...

smid lige et svar.
24. januar 2015 - 16:44 #5
Fint nok - og ja, jeg bruger alligevel ikke c - det var fra en tidligere variant.

Jeg kalder dem normalt ikke arrays, men ranges.
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