Avatar billede hubertus Seniormester
26. august 2013 - 16:54 Der er 13 kommentarer og
1 løsning

Beregn tidsforskel.

Jeg har to kolonner med følgende tider:

A                      B                    C
21. Aug 2013 11:13    21. Aug 2013 12:08
21. Aug 2013 14:59    21. Aug 2013 15:02
21. Aug 2013 00:34    21. Aug 2013 06:16

Jeg har brug for en subrutine, der kan beregne tidsforskellen mellem de to kolonner, således at jeg i kolonne C får angivet hvor mange timer og minutter der er mellem de to tider. Beregningen skal ske via VBA, da det er en delløsning af en tørre helhed. NB. der er mange linjer.
Hvordan løses den udfordring?
Avatar billede jens48 Ekspert
26. august 2013 - 18:54 #1
Det kan gøres med:

Sub Macro1()
Dim LastRow As Long
Dim x As Long
LastRow = Range("A65536").End(xlUp).Row
For x = 1 To LastRow
Cells(x, 3) = Cells(x, 2) - Cells(x, 1)
Next
End Sub

Husk at formattere kolonne C til at vise tt:mm
Avatar billede hubertus Seniormester
26. august 2013 - 22:18 #2
Hej Jens
Den løsning har jeg også prøvet, men jeg får en Runtime error 13: Type Mismatch - desværre.
Avatar billede jens48 Ekspert
26. august 2013 - 23:04 #3
Det må være fordi kolonnerne A og B ikke er formatteret som dato og klokkeslet
Avatar billede jens48 Ekspert
26. august 2013 - 23:24 #4
Med den formatering du har vist kan det lade sig gøre med et par hjælpekolonner. Se mit forslag på http://gupl.dk/700776/. Kolonnerne C og D laver teksten i kolonnerne A og B om til dato plus tid og makroen regner forskellen ud og skriver det i kolonne E. Kolonne I og J hjælper med at lave månedens navn om til et tal.
Avatar billede hubertus Seniormester
27. august 2013 - 12:36 #5
Hej Jens
Din løsning virker fint, men bare ikke i min opsætning. Jeg har et regneark, hvor min kode ligger i. Her indlæser jeg en csv fil, som jeg anvender koden på. Det er derfor at jeg gerne ser, at det er en VBA løsning. Er det muligt at omskrive din formel så det opfylder mit formål?
Avatar billede jens48 Ekspert
27. august 2013 - 17:01 #6
Ja, så bliver makroen noget længere. Prøv om dette passer.

Sub Macro1()
Dim LastRow As Long
Dim x As Long
Dim y As Double
Dim Z As Double
Dim Month As String
Dim m As Integer
LastRow = Range("A65536").End(xlUp).Row
For x = 1 To LastRow
Month = Mid(Cells(x, 1), 5, 3)
Select Case (m)
  Case Month = "Jan"
  m = 1
  Case Month = "Feb"
  m = 2
  Case Month = "Mar"
  m = 3
  Case Month = "Apr"
  m = 4
  Case Month = "May"
  m = 5
  Case Month = "Jun"
  m = 6
  Case Month = "Jul"
  m = 7
  Case Month = "Aug"
  m = 8
  Case Month = "Sep"
  m = 9
  Case Month = "Oct"
  m = 10
  Case Month = "Nov"
  m = 11
  Case Month = "Dec"
  m = 12
  Case Else
End Select
y = DateSerial(Mid(Cells(x, 1), 9, 4), m, Left(Cells(x, 1), 2)) + Mid(Cells(x, 1), 14, 2) / 24 + Right(Cells(x, 1), 2) / 24 / 60
Month = Mid(Cells(x, 2), 5, 3)
Select Case (m)
  Case Month = "Jan"
  m = 1
  Case Month = "Feb"
  m = 2
  Case Month = "Mar"
  m = 3
  Case Month = "Apr"
  m = 4
  Case Month = "May"
  m = 5
  Case Month = "Jun"
  m = 6
  Case Month = "Jul"
  m = 7
  Case Month = "Aug"
  m = 8
  Case Month = "Sep"
  m = 9
  Case Month = "Oct"
  m = 10
  Case Month = "Nov"
  m = 11
  Case Month = "Dec"
  m = 12
  Case Else
End Select
Z = DateSerial(Mid(Cells(x, 2), 9, 4), m, Left(Cells(x, 2), 2)) + Mid(Cells(x, 2), 14, 2) / 24 + Right(Cells(x, 2), 2) / 24 / 60
Cells(x, 3) = Z - y
Next
End Sub

Det kan være du skal rette de engelske månedsnavne til danske for at den virker korrekt.
Avatar billede jens48 Ekspert
27. august 2013 - 17:26 #7
Du får den lige igen. Den anden virkede kun fordi både start og slut var i samme måned.

Sub Macro1()
Dim LastRow As Long
Dim x As Long
Dim y As Double
Dim Z As Double
Dim Month As String
Dim m As Integer
LastRow = Range("A65536").End(xlUp).Row
For x = 1 To LastRow
Month = Mid(Cells(x, 1), 5, 3)
Select Case (Month)
  Case "Jan"
  m = 1
  Case "Feb"
  m = 2
  Case "Mar"
  m = 3
  Case "Apr"
  m = 4
  Case "May"
  m = 5
  Case "Jun"
  m = 6
  Case "Jul"
  m = 7
  Case "Aug"
  m = 8
  Case "Sep"
  m = 9
  Case "Oct"
  m = 10
  Case "Nov"
  m = 11
  Case "Dec"
  m = 12
  Case Else
End Select
y = DateSerial(Mid(Cells(x, 1), 9, 4), m, Left(Cells(x, 1), 2)) + Mid(Cells(x, 1), 14, 2) / 24 + Right(Cells(x, 1), 2) / 24 / 60
Month = Mid(Cells(x, 2), 5, 3)
Select Case (Month)
  Case "Jan"
  m = 1
  Case "Feb"
  m = 2
  Case "Mar"
  m = 3
  Case "Apr"
  m = 4
  Case "May"
  m = 5
  Case "Jun"
  m = 6
  Case "Jul"
  m = 7
  Case "Aug"
  m = 8
  Case "Sep"
  m = 9
  Case "Oct"
  m = 10
  Case "Nov"
  m = 11
  Case "Dec"
  m = 12
  Case Else
End Select
Z = DateSerial(Mid(Cells(x, 2), 9, 4), m, Left(Cells(x, 2), 2)) + Mid(Cells(x, 2), 14, 2) / 24 + Right(Cells(x, 2), 2) / 24 / 60
Cells(x, 3) = Z - y
Next
End Sub
Avatar billede hubertus Seniormester
29. august 2013 - 06:56 #8
Super - det var løsningnen. Tak for hjælpen. Lægger du et svar?
Avatar billede jens48 Ekspert
29. august 2013 - 07:59 #9
Godt du konne bruge det
Avatar billede hubertus Seniormester
07. september 2013 - 14:15 #10
Hej Jens
Der er en udfordring i, når datoen er én cifret. Kan du tage højde for det i formlen?
Avatar billede jens48 Ekspert
07. september 2013 - 22:42 #11
Jeg har tilføjet check på om dato er skrevet med et eller 2 cifre. Desuden er det nu ligegyldigt om månedsnavn er skrevet med stort eller lille eller på engelsk

Sub Macro1()
Dim LastRow As Long
Dim x As Long
Dim y As Double
Dim Z As Double
Dim d As Integer
Dim Month As String
Dim m As Integer
LastRow = Range("A65536").End(xlUp).Row
For x = 1 To LastRow
If Mid(Cells(x, 1), 3, 1) = "." Then
d = 1
Else
d = 0
End If
Month = Mid(Cells(x, 1), 4 + d, 3)
Select Case (Month)
  Case "Jan", "jan"
  m = 1
  Case "Feb", "feb"
  m = 2
  Case "Mar", "mar"
  m = 3
  Case "Apr", "apr"
  m = 4
  Case "May", "Maj", "may", "maj"
  m = 5
  Case "Jun", "jun"
  m = 6
  Case "Jul", "jul"
  m = 7
  Case "Aug", "aug"
  m = 8
  Case "Sep", "sep"
  m = 9
  Case "Oct", "Okt", "oct", "okt"
  m = 10
  Case "Nov", "nov"
  m = 11
  Case "Dec", "dec"
  m = 12
  Case Else
  MsgBox ("Der er noget galt i række " & x)
  End Select
y = DateSerial(Mid(Cells(x, 1), 8 + d, 4), m, Left(Cells(x, 1), 1 + d)) + Mid(Cells(x, 1), 13 + d, 2) / 24 + Right(Cells(x, 1), 2) / 24 / 60
If Mid(Cells(x, 2), 3, 1) = "." Then
d = 1
Else
d = 0
End If
Month = Mid(Cells(x, 2), 4 + d, 3)
Select Case (Month)
    Case "Jan", "jan"
  m = 1
  Case "Feb", "feb"
  m = 2
  Case "Mar", "mar"
  m = 3
  Case "Apr", "apr"
  m = 4
  Case "May", "Maj", "may", "maj"
  m = 5
  Case "Jun", "jun"
  m = 6
  Case "Jul", "jul"
  m = 7
  Case "Aug", "aug"
  m = 8
  Case "Sep", "sep"
  m = 9
  Case "Oct", "Okt", "oct", "okt"
  m = 10
  Case "Nov", "nov"
  m = 11
  Case "Dec", "dec"
  m = 12
  Case Else
  MsgBox ("Der er noget galt i række " & x)
End Select
Z = DateSerial(Mid(Cells(x, 2), 8 + d, 4), m, Left(Cells(x, 2), 1 + d)) + Mid(Cells(x, 2), 13 + d, 2) / 24 + Right(Cells(x, 2), 2) / 24 / 60
Cells(x, 3) = Z - y
Next
End Sub
Avatar billede hubertus Seniormester
08. september 2013 - 08:53 #12
Det var hurtigt :0))
Kan du sætte lidt ord på DatSerial. Som jeg forstår den, så går den kun på år/mdr/dag og ikke på klokken. Når jeg ser på Mid(Cells(x, 2), 13 + d, 2) / 24 så får jeg et decimaltal tilsvarende med Right(Cells(x, 2), 2) / 24 / 60. Hvad er forklaringen?
Avatar billede jens48 Ekspert
08. september 2013 - 11:36 #13
DateSerial er et heltal der viser hvor mange dage der er gået siden 1/1/-1900 (egentlig d. 31/12-1899, da det både i Excel og i VBA fejlagtigt antages at 1900 var et skudår). Mid(Cells(x, 2), 13 + d, 2) / 24 bruges til at trække timetallet ud af teksten. Det divideres med 24, så det kan lægges til heltallet og Right(Cells(x, 2), 2) / 24 / 60 bruges til at trække minuttallet ud af teksten og divideres med både 24 og 60 før det lægges til tallet.
På den måde kan man omregne 08/09/2013 12:23:00 til 41525,51597222220
Avatar billede hubertus Seniormester
08. september 2013 - 12:14 #14
Hej Jens

Tak for info og for hjælpen - god weekend.
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