19. oktober 2009 - 18:14 Der er 17 kommentarer og
1 løsning

Konvertere 0128 til 01:28.

Hej,
Jeg har en kolonne hvor der står et klokkeslæt i cellerne. Dataene er importeret fra en tekstfil, og står angivet som "rene" tal, fx 1850. Faktisk er der 2 kolonner af den slags - én med et fra-klokkeslæt og én med et til-klokkeslæt. I en tredje kolonne har jeg så sat den til at regne forløbet tid ud. Det går fint sålænge formatet i fra- og til-cellerne står til klokkeslæt 18:50.
Så jeg kunne godt tænke mig at kunne konvertere 1850 til 18:50 i en hel kolonne. Jeg HAR været inde i Formatér celler og vælge Kategori Klokkeslæt og typen 13:30, men jeg skal stadig manuelt sætte et : før den rent faktisk ændrer celleformatet til klokkeslæt.
Nogen der har forslag til hvad jeg kan gøre?
Avatar billede tjacob Juniormester
19. oktober 2009 - 18:33 #1
Hvis du har:
A1 = 1850
B1 = 2030

Så kan du i C1 f.eks. skrive:

=TIDSVÆRDI(VENSTRE(B1;2) & ":" & HØJRE(B1;2))-TIDSVÆRDI(VENSTRE(A1;2) & ":" & HØJRE(A1;2))

Feltet C1 skal formateres som 13:30 og vil vise 01:40
19. oktober 2009 - 19:27 #2
Det virkede helt perfekt! Tak for hjælpen, tjacob, smid et svar.

Har dog lige et tillægsspørgsmål: Det viser sig, at nogle af tidsforløbene strækker sig henover midnat, dvs. at A1=2330 og B1=0040. Så bliver det et negativt klokkeslæt. Forslag til hvordan jeg kan greje den?
Avatar billede tjacob Juniormester
19. oktober 2009 - 19:56 #3
Såvidt jeg ved: Den kan ikke grejes.
Da tidspunkterne er rene tekstformater, er det ikke muligt at skelne mellem datoer. Så SKAL kildecellerne være formateret som klokkeslet (der også har en dato) men det er netop problemet her: De kan IKKE formateres som datoer da de simpelthen ikke HAR data om dato men KUN om klokkeslet.

Det er måske muligt at lave en workaround baseret på negative værdier: Hvis værdien er negativ: så regn output som: første klokkeslet til midnat + andet klokkeslet fra midnat.
-Den vender jeg lige tilbage med en gang i morgen.
19. oktober 2009 - 20:32 #4
Okay, lyder spændende.
Avatar billede rosco Novice
19. oktober 2009 - 21:32 #5
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("J6:J95")) Is Nothing And Target <> "FEJL!" Then
    If Target >= 1 And Len(Format(Target, "0")) <= 4 Then
        iTime = Left(Format(Target, "0000"), 2)
        iMinut = Right(Format(Target, "0000"), 2)
        If iTime <= 24 And iMinut <= 59 Then
            Target = iTime / 24 + iMinut / 24 / 60
        Else
            Target = "FEJL!"
        End If
    Else
        If Not Target < 1 Then Target = "FEJL!"
    End If
End If


J6:J95,  du kan selv ændre området.

Men de formateres dog stadig kun som klokkeslet.
Avatar billede rosco Novice
19. oktober 2009 - 21:33 #6
Avatar billede tjacob Juniormester
20. oktober 2009 - 11:05 #7
Det var faktisk rimelig simpelt. Denne formel skulle gerne vise korrekte tider også hen over midnat:

=HVIS(TAL(A1)>TAL(B1);(TIDSVÆRDI(VENSTRE(B1;2) & ":" & HØJRE(B1;2))+1)-TIDSVÆRDI(VENSTRE(A1;2) & ":" & HØJRE(A1;2));TIDSVÆRDI(VENSTRE(B1;2) & ":" & HØJRE(B1;2))-TIDSVÆRDI(VENSTRE(A1;2) & ":" & HØJRE(A1;2)))
21. oktober 2009 - 22:08 #8
tjacob: Beklager det sene respons, men har siddet og kæmpet med det. Hvilket format havde du A og B i? Syns jeg har fundet ud af, at formatet på A og B SKAL være "Standard". Er den det, virker det fint. Men med det format vil 0230 skrives som 230 og så bliver resultatet forkert.
Jeg sætter gerne 200 point mere i spil.
Avatar billede tjacob Juniormester
22. oktober 2009 - 09:18 #9
Det er ikke nødvendigt med flere point.

For at få foranstillede nuller med skal du sætte den til brugerdefineret format "0000"
25. oktober 2009 - 19:19 #10
Men så bliver resultaterne forkerte.
Når jeg skriver klokkeslættene ind manuelt og indsætter formlen og sætter formaterne, så virker det helt fint, som du siger. Men i mit regneark med importerede data (txt-fil) virker det ikke, hverken når jeg importerer dem som "standard" eller som "tekst" (det er de 2 muligheder jeg har) og efterfølgende prøver at rette til.
Jeg har faktisk også datoerne (i en separat kolonne) - kan man bruge det til noget?
Avatar billede tjacob Juniormester
26. oktober 2009 - 10:06 #11
Datoerne gør ingen forskel på problemet med manglende nuller. Men formlen kan rettes til. Det bliver godt nok lidt langt:

=HVIS(TAL(A1)>TAL(B1);(HVIS(LÆNGDE(B1)=3;TIDSVÆRDI(VENSTRE(B1;1)&":"&HØJRE(B1;2));TIDSVÆRDI(VENSTRE(B2;2)&":"&HØJRE(B2;2)))+1)-HVIS(LÆNGDE(A1)=3;TIDSVÆRDI(VENSTRE(A1;1)&":"&HØJRE(A1;2));TIDSVÆRDI(VENSTRE(A1;2)&":"&HØJRE(A1;2)));HVIS(LÆNGDE(B1)=3;TIDSVÆRDI(VENSTRE(B1;1)&":"&HØJRE(B1;2));TIDSVÆRDI(VENSTRE(B1;2)&":"&HØJRE(B1;2)))-HVIS(LÆNGDE(A1)=3;TIDSVÆRDI(VENSTRE(A1;1)&":"&HØJRE(A1;2));TIDSVÆRDI(VENSTRE(A1;2)&":"&HØJRE(A1;2))))
26. oktober 2009 - 20:17 #12
Den virker faktisk rigtig godt! Men (tør næsten ikke sige det) der er også klokkeslæt der har 2 eller 3 foranstillede nuller (eller består kun af nuller) - der går den i fejl eller giver et forkert resultat:

0001    0100    #####
0039    0240    #####
2217    0003    11:43
0000    0015    15:15
0000    0005    05:05

Dog gør den det rigtigt her:
0000    0205    02:05
0005    0005    00:00

?
Avatar billede tjacob Juniormester
27. oktober 2009 - 09:37 #13
Det KAN godt laves som en formel, men så bliver den latterlig lang, så jeg har valgt at lave det som en brugerdefineret funktion:

Denne funktion kopierer du ind i et modul i Visual Basic.
(Sig til hvis du skal have hjælp til dette)

I målcellen skriver du:  =FindTid(A1;B1)
målcellen skal formateres som 13:30

Public Function FindTid(ByVal tStart As String, ByVal tEnd As String) As Variant

    Dim pStart, pEnd, pOut
    Select Case Len(tStart)
        Case 4
            pStart = TimeSerial(CLng(Left(tStart, 2)), CLng(Right(tStart, 2)), 0)
        Case 3
            pStart = TimeSerial(CLng(Left(tStart, 1)), CLng(Right(tStart, 2)), 0)
        Case Else
            pStart = TimeSerial(0, CLng(tStart), 0)
    End Select
    Select Case Len(tEnd)
        Case 4
            pEnd = TimeSerial(CLng(Left(tEnd, 2)), CLng(Right(tEnd, 2)), 0)
        Case 3
            pEnd = TimeSerial(CLng(Left(tEnd, 1)), CLng(Right(tEnd, 2)), 0)
        Case Else
            pEnd = TimeSerial(0, CLng(tEnd), 0)
    End Select
    pOut = pEnd - pStart
    If pStart > pEnd Then pOut = pEnd - pStart + 1
    If pStart = 0 Then pOut = pEnd
    If pEnd = 0 Then pOut = 1 - pStart
    FindTid = pOut

End Function
27. oktober 2009 - 21:38 #14
Det virker som om den ikke vil kendes ved "FindTid", for når jeg sætter formlen =FindTid(A1;B1) ind får jeg "#NAVN? - formlen indeholder ikke-genkendt tekst", og i VB får jeg Compile error: Argument not optional (og den markerer "FindTid =" i sidste linie).
Avatar billede tjacob Juniormester
28. oktober 2009 - 12:24 #15
Du har kopieret HELE funktionen? -Altså ALT i den blå rude.

Der er data i både A1 og B1?

Funktionen fungerer fint hos mig, så jeg kan ikke lige finde fejlen. Du kan finde mit prøveark her, så kan du selv se om der skulle være nogle forskelle:
http://www.gratisupload.dk/download/35324/
28. oktober 2009 - 18:49 #16
Så lykkedes det! TUSIND tak for hjælpen, tjacob.
Skal jeg ikke lige lave en "100 point til tjacob"-tråd som du kan lægge svar ind på?
Avatar billede tjacob Juniormester
28. oktober 2009 - 19:06 #17
Nej, nej du har jo givet 200, som er rigeligt til mig :)

-Desuden er det imod reglerne.
28. oktober 2009 - 21:46 #18
Okay.
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