26. august 2013 - 16:54Der 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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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.
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?
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.
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
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
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?
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
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.