Jag har ett datum och ett klockslag och vill räkna ut hur lång tid det är kvar tills dess från nuvarande datum och klockslag. Svaret ska se ut ungefär så här: "x dagar, x timmar, x minuter". Hej Skulle vilja ha lite förklaringar till din kod. Vad gör CSng och varför dagar = dagar - 1 i if-satsen? CSng betyder att man skall omvandlA klockslaget till ett flyttal. <code> Hej >Skulle nog tro att det inte behövs... räcker det inte med DateDiff ? <code> Hej <code></code> Hej Andreas exempel fungerar utmärkt på datum som inte redan varit, men om man försöker räkna ut hur lång tid det har gått sedan t.ex. 021201, fungerar det inte längre. Det blir en negativ dag för mycket i resultatet, vilket jag försökte åtgärda utan allt för många rader, dock utan resultat. Låt se om Andreas klarar detta utan att överskrida antalet rader.Ränka ut resterande tid
Ex:
Från: 021209 20:49
Till: 021209 21:49
Differens: 1 timme
Hur gör jag utan att använda mig av 100 if-satser med DateDiff()?
/ PeterSv: Ränka ut resterande tid
Option Explicit
Private Sub Command1_Click()
'Så här ungefär skulle jag göra
Dim highDate As Double, highHour As String
Dim lowDate As Double, lowHour As String
Dim dagar As Long
highHour = "15:00"
highDate = CDate("02-12-24" & " " & highHour) 'Kalle Anka kommer
'************************************************
lowHour = Format$(Now, "hh:mm")
lowDate = CDate(Date & " " & lowHour) 'här skriver du det låga datumet
'************************************************
dagar = Int(highDate) - Int(lowDate)
If CSng(CDate(lowHour)) > CSng(CDate(highHour)) Then dagar = dagar - 1
If dagar > 0 Then
MsgBox Str$(dagar) & " dagar " & _
Format$(highDate - lowDate, "hh:mm")
Else
MsgBox Format$(highDate - lowDate, "hh:mm")
End If
End Sub
'/SvenSv: Ränka ut resterande tid
/ PeterSv: Ränka ut resterande tid
Sedan räknas skillnaden mellan dessa ut, och om klockan är större i det ena fallet så är det inte ett helt dygn, och då måste man minska antalet dygn med ett.
Skulle nog tro att det inte behövs... räcker det inte med DateDiff ?
/Niklas JanssonSv: Ränka ut resterande tid
Public Function Differens(Datum1 As Date, Datum2 As Date)
Dim Diff As Long
Dim År As Long
Dim Sekunder As Long
Dim Minuter As Long
Dim Timmar As Long
Dim Dagar As Long
Dim Veckor As Long
Diff = (Datum2 * 86400) - (Datum1 * 86400)
Sekunder = Diff Mod 60
Select Case Sekunder
Case 1
Differens = "en sekund"
Case Is > 1
Differens = Sekunder & " sekunder"
End Select
Diff = Diff \ 60
Minuter = Diff Mod 60
Select Case Minuter
Case 1
Differens = "en minut " & Differens
Case Is > 1
Differens = Minuter & " minuter " & Differens
End Select
Diff = Diff \ 60
Timmar = Diff Mod 24
Select Case Timmar
Case 1
Differens = "en timme " & Differens
Case Is > 1
Differens = Timmar & " timmar " & Differens
End Select
Diff = Diff \ 24
Dagar = Diff Mod 7
Select Case Dagar
Case 1
Differens = "en dag " & Differens
Case Is > 1
Differens = Dagar & " dagar " & Differens
End Select
Diff = Diff \ 7
Veckor = Diff
Select Case Veckor
Case 1
Differens = "en vecka " & Differens
Case Is > 1
Differens = Dagar & " veckor " & Differens
End Select
End Function
</code>Sv: Ränka ut resterande tid
Som vanligt Andreas tar betalt för hur många programrader
han kan få ihop.Många rader bra och dyra program :-)
/SvenSv: Ränka ut resterande tid
Det räcker inte med DateDiff, jag testade.
/ PeterSv: Ränka ut resterande tid
Function DelDifferens(Diff As Long, Faktor as long, Text1 as String, TextX As String) As String
Dim Part As long
Part = Diff Mod Faktor
Diff = Diff \ Faktor
Select Case Part
Case 1
DelDifferens = "en " & Text1 & " "
Case Is > 1
DelDifferens = Sekunder & TextX & " "
End Select
End Function
Public Function Differens(Datum1 As Date, Datum2 As Date)
Dim Diff As Long
Diff = (Datum2 * 86400) - (Datum1 * 86400)
Differens = DelDifferens(Diff, 60, "sekund", "sekunder")
Differens = DelDifferens(Diff, 60, "minut", "minuter") & Differens
Differens = DelDifferens(Diff, 24, "timme", "timmar") & Differens
Differens = DelDifferens(Diff, 7, "dag", "dagar") & Differens
Select Case Diff
Case 1
Differens = "en vecka " & Differens
Case Is > 1
Differens = Diff & " veckor " & Differens
End Select
End Function
</code>
Är du nöjd nu?
Annars är du välkommen att minska antalet rader ytterligare.Sv: Ränka ut resterande tid
Orkar inte kolla, det är säkert bra (för dig)
Var och en blir salig på sin tro.
Konstaterar att det finns olika sätt att angripa ett problem.
Mitt sätt funkade som frågeställaren tänkt sig, du blandar in
veckor mm. som aldrig efterfrågats.
Ha det ,
ge faen i pepparkakor dom inhåller tydligen också nåt gift Vi inte tål.
/DsSv: Ränka ut resterande tid
I så fall är mitt förslag följande:
<code>
Public Function Differens(Datum1 As Date, Datum2 As Date) As String
Dim Delta As Date
Delta = Datum2 - Datum1
Differens = CLng(Int(Delta)) & " dagar, " & Hour(Delta) & " timmar, " & Minute(Delta) & " minuter."
End Function
</code>
Då har du betydligt mer rader kod i ditt exempel.Sv: Ränka ut resterande tid
Ja men skillnaden är att mitt blir rätt. Men inte ditt. !!
Kör mot din function
Private Sub Command1_Click()
'Till Kalle Anka kommer , då blir du väl glad
'Dagar (läs dygn)
MsgBox Differens(Now, "02-12-24 15:00") 'Till Kalle Anka kommer
End Sub
EDIT :
Men jag får kanske tänka om, ditt förslag visar på det exakta tidsmåttet,
mitt visar på då man anser att dygnet börjar 00:00:01
Då skall man nog vara försiktig med att skriva dagar , all redovisning skall ske i timmar.
Om jag skall svara ett ungt förväntansfullt barn så blir det antal datum och timmar.
Kanske jag har haft fel denna månad ? Logga in någon och döm av.
/SvenSv: Ränka ut resterande tid
/ Peter