Avatar billede xjln Juniormester
24. januar 2004 - 23:01 Der er 22 kommentarer og
1 løsning

Finde første og sidste dato ud fra et bestemt årstal

Jeg har en tabel med dato i første col. og timer i anden col.
Nu vil jeg gerne have timerne mellem den første og den sidste oplistede dato i et bestemt årstal beregnet i C1.
Årstallet står i D1.

Jeg har været ved at prøve at sammensætte Lopslag med ÅR() men kunne ikke få det til at virke.

Nogle gode forslag?
Avatar billede jqrn Mester
25. januar 2004 - 19:22 #1
Jeg forstår ikke helt spørgsmålet. Du har en række "timestamps" med dato (kollonne A) og klokkeslet (kolonne B). I D1 står der et årstal og i C1 vil du så gerne vide, for det angivne år, hvormange timer er der fra først forekommende til sidst forekommende timestamp. Korrekt?

Cirka hvormange år spænder dine data over? Er de sorteret?
Avatar billede kabbak Professor
25. januar 2004 - 20:47 #2
Prøv denne funktion

Ved DatoCol og TimeCol, klikker du på kolonne bogstavet
Ved AAr klikker du ind på cellen ( D1)
Formater din celle (C1) som [t]:mm

Public Function FindTimer(DatoCol As Range, TimeCol As Range, AAr As Range)
Dim D As Variant, T As Variant, DT() As Variant, R As Long, DCol As Integer, TCol As Integer
Dim MaxTid As Variant, MinTid As Variant
MinTid = #1/12/2050 11:59:00 PM#
DCol = DatoCol.Column
TCol = TimeCol.Column
R = Cells(65536, DCol).End(xlUp).Row
D = Range(Cells(1, DCol), Cells(R, DCol))
T = Range(Cells(1, TCol), Cells(R, TCol))
ReDim DT(R)
For i = 1 To R
DT(i) = D(i, 1) + T(i, 1)
If Year(DT(i)) = AAr.Value Then
If DT(i) < MinTid Then MinTid = DT(i)
If DT(i) > MaxTid Then MaxTid = DT(i)
End If
Next
FindTimer = MaxTid - MinTid
End Function
Avatar billede kabbak Professor
25. januar 2004 - 20:52 #3
hvis du skriver således

=FindTimer($A:$A;$B:$B;D1)

kan du trække den nedad og så skrive de forskellige årstal ud for i D kolonnen
Avatar billede xjln Juniormester
26. januar 2004 - 08:03 #4
iqrn-> Det er kun dato der står i col. A og en maskines timeantal for den angivne dato i col. B. Nu vil jeg så gerne finde det antal timer maskinen har kørt mellem den første og den sidste angivne dato i et bestemt år.

kabbak-> Jeg prøver din funktion, men har selve regnearket derhjemme.
Avatar billede tobler Nybegynder
26. januar 2004 - 11:30 #5
Du burde også kunne nøjes med en sum-formel, men det kræver at du har start dato i D1 (01012003) og slut dato i E1 (31122003), prøv så med denne array-formel:

=SUM((A1:A25>=E3)*(A1:A25<=F3)*(B1:B25)) - du retter selv A1/B1 til din startceller og A25/B25 til dine slutceller.

den skal indtastes med Ctrl-Shift-Enter
Avatar billede tobler Nybegynder
26. januar 2004 - 11:46 #6
Fik lige denne ide, så du kan fastholde årstallet i D1:

=SUM((A1:A25>=(("01-01-"&D1)*1))*(A1:A25<=(("31-12-"&D1)*1))*(B1:B25))

formlen skal indtastes med Ctrl-Shift-Enter
Avatar billede bak Forsker
26. januar 2004 - 21:17 #7
Du kunne også bruge denne arrayformel, hvis du i kolonne c skriver A2+b2 for at sammesætte dato og tid, D1 er stadig 2004

=(MAKS((C2:C11)*(ÅR(C2:C11)=D2))-(MIN((C2:C11)*(ÅR(C2:C11)>D2-1))))*24

PS. god ide tobler. jeg er desværre lidt langsom :-)
Avatar billede tobler Nybegynder
27. januar 2004 - 12:41 #8
---> bak, jeg er selv meget tilfreds med ideen, har allerede ændret 4 af mine ugentlige rapporter!
Avatar billede xjln Juniormester
29. januar 2004 - 14:19 #9
-->kabbak: jeg kunne ikke få din funktion til at virke, ligemeget hvad jeg gør så fremkommer #VÆRDI!

-->tobler: din formel =SUM((A1:A25>=(("01-01-"&D1)*1))*(A1:A25<=(("31-12-"&D1)*1))*(B1:B25)), er sådan set god nok, men den summerer timerne for det valgte år. Den skulle jo finde differensen mellem den første og den sidste indtastning.

-->bak: Kunne ikke få din formel til at virke, men har omskrevet den til følgende    =(MAKS((B3:B9)*(ÅR(A3:A9)=D4))-(MIN((B3:B9)*(ÅR(A3:A9)>D4-1)))), men den virker kun på det første år der er listet op i col. A ved de efterfølgende år er det kun maks værdien der vises. Hvorfor mon det?
Avatar billede kabbak Professor
29. januar 2004 - 16:56 #10
Nyt forsøg, jeg tror det var overskrifter, der gør det.

FirstDatoCell = første celle med dato
FirstTimeCell = første celle med tid
AAr = cellen med årstal

Public Function FindTimer(FirstDatoCell As Range, FirstTimeCell As Range, AAr As Range)
Dim D As Variant, T As Variant, DT() As Variant, R As Long, DCol As Integer, TCol As Integer
Dim MaxTid As Variant, MinTid As Variant
MinTid = #1/12/2050 11:59:00 PM#
DCol = FirstDatoCell.Column
SRow = FirstDatoCell.Row
TCol = FirstTimeCell.Column
R = Cells(65536, DCol).End(xlUp).Row
D = Range(Cells(SRow, DCol), Cells(R, DCol))
T = Range(Cells(SRow, TCol), Cells(R, TCol))
ReDim DT(R)
For i = 1 To (R + 1) - SRow
DT(i) = D(i, 1) + T(i, 1)
If Year(DT(i)) = AAr.Value Then
If DT(i) < MinTid Then MinTid = DT(i)
If DT(i) > MaxTid Then MaxTid = DT(i)
End If
Next
FindTimer = MaxTid - MinTid
End Function
Avatar billede xjln Juniormester
30. januar 2004 - 19:50 #11
kabbak
Nu fremkommer der da et tal i cellen om end det ikke er rigtigt.
Jeg har kigget lidt på din kode og kan ikke helt gennemskue den, men kan se der er noget med tid >11:59:00PM< i den.
Måske jeg ikke har forklaret mig godt nok, men i dato cellerne (kol. A) står kun dato, eks.: 1. januar 2001. Og i "tids" cellerne (kol. B) står en maskines timetal på den givne dato, eks.: 5800. Altså som helt tal ikke noget med tt:mm eller andet.
Avatar billede kabbak Professor
30. januar 2004 - 20:14 #12
Ok havde ikke læst orentlig, skulle virke nu

Public Function FindTimer(FirstDatoCell As Range, FirstTimeCell As Range, AAr As Range)
Dim D As Variant, T As Variant, R As Long, DCol As Integer, TCol As Integer
Dim MaxTid As Variant, MinTid As Variant
MinTid = #1/12/2050 11:59:00 PM#
DCol = FirstDatoCell.Column
SRow = FirstDatoCell.Row
TCol = FirstTimeCell.Column
R = Cells(65536, DCol).End(xlUp).Row
D = Range(Cells(SRow, DCol), Cells(R, DCol))
T = Range(Cells(SRow, TCol), Cells(R, TCol))
For i = 1 To (R + 1) - SRow
If Year(D(i, 1)) = AAr.Value Then
If T(i, 1) < MinTid Then MinTid = T(i, 1)
If T(i, 1) > MaxTid Then MaxTid = T(i, 1)
End If
Next
FindTimer = MaxTid - MinTid
End Function
Avatar billede xjln Juniormester
30. januar 2004 - 20:31 #13
Bingo så virker det efter hensigten.
Kabbak poster du lige et svar?
Avatar billede kabbak Professor
30. januar 2004 - 20:32 #14
et svar
Avatar billede xjln Juniormester
30. januar 2004 - 20:33 #15
Hvor er det egentlig bedst at placeret koden hvis den skal bruges i flere forskellige ark. I hvert af arkene eller kan man ligge den et centralt sted?
Avatar billede kabbak Professor
30. januar 2004 - 20:34 #16
ps. du kan godt fjerne denne linie, den bruges ikke mere.

MinTid = #1/12/2050 11:59:00 PM#
Avatar billede xjln Juniormester
30. januar 2004 - 20:35 #17
Ok det prøver jeg lige
Avatar billede kabbak Professor
30. januar 2004 - 20:36 #18
den skal placeres i et modul så virker den i hele mappen, den skal ikke placeres i et arkmodul
Avatar billede xjln Juniormester
30. januar 2004 - 20:39 #19
Niks det gik ikke at fjerne den. Hvis dette sker så er det kun det største time tal der findes. Hvorfor mon ved jeg ikke ;-)
Avatar billede xjln Juniormester
30. januar 2004 - 20:40 #20
Ok til det med modul placeringen
Avatar billede kabbak Professor
30. januar 2004 - 20:42 #21
MinTid = 10000000

den skal have en værdi der er større, end det du kan komme op på i timetælleren,
Avatar billede xjln Juniormester
30. januar 2004 - 20:45 #22
Sådan skal det bare gøres, hvem der havde så nemt ved al det VBA.

Tak for hjælpen
Avatar billede kabbak Professor
30. januar 2004 - 21:43 #23
tak for point ;-))
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