Avatar billede svla Mester
04. marts 2012 - 15:57 Der er 22 kommentarer og
1 løsning

Indtastningsproblem på Excelark

Hej
På mit exceark i kolonnerne A og B indtaster jeg forskellige tider i dette format f.eks 15:12, jeg vil gerne kunne bruge det numeriske tastatur til intastningerne, således at jeg taster "," istedet for ":" på tastaturet.

Er der nogen som lige kan hjælpe med en VBA-kode som retter "," til ":" ved hver indtastning på det numeriske tastatur.

Kan godt finde ud af og få "," rettet til ":" hvis indtastning foregår via en Userform, men kan ikke finde en løsning hvis indtastningen foregår direkte på excelarket.

- Håber lige nogen kan hjælpe.
Avatar billede supertekst Ekspert
04. marts 2012 - 16:08 #1
Brugerdefineret format ##\:##

Tast 1245 -> 12:45
Avatar billede svla Mester
04. marts 2012 - 17:01 #2
Hej supertekst

Det var lige det jeg skulle bruge, ændrede det brugerdefinerede  format fra ##\:##  til 00\:##, ellers kunne timeværdien 00:30 ikke vises korrekt.

Tak for hjælpen, det var lige det jeg manglede, og havde ikke tænkt på brugerdefineret format.
Læg et svar
Avatar billede supertekst Ekspert
04. marts 2012 - 17:21 #3
Hej svla

Selv tak - og et svar..
Avatar billede svla Mester
04. marts 2012 - 17:22 #4
Hej igen
Der var nu alligevel noget andet som ikke virkede, og der er hvis timerne i kolonne A og B hver for sig skal tælles sammen i f.eks række 100, så passer resultatet ikke når indtastningen gøres med det betingede format, såvidt jeg kan se skal formatet i alle celler så være[tt]:mm.
Har du en anden løsning
Avatar billede supertekst Ekspert
04. marts 2012 - 18:11 #5
Der er VBA - men andre har måske en god ide..
Avatar billede svla Mester
04. marts 2012 - 19:43 #6
Jeg arbejder lige lidt videre måske finder jeg en løsning.
- Men i første omgang hjalp du mig jo med sagen, jeg giver dig point, hvis jeg finder en sidste løsning lægger jeg den her.
Avatar billede perhol Seniormester
05. marts 2012 - 01:30 #7
Nedenstående kode placeres i arkets kode (højreklik på ark-fanen og vælg [Vis programkode].

Koden ændrer en alm. 3 eller 4 cifret indtastning til tidsformat F.eks. 1430 til 14:30 eller 700 til 7:00 eller 015 til 00:15. Cellen skal dog være formateret til tidsformat [t]:mm


Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    On Error GoTo Slut
    Application.EnableEvents = False
    If Not Intersect(Target, Range("TidCol1")) Is Nothing Then
        If IsNumeric(Target.Value) Then
            If Target.Value Mod 1 = 0 And Target.Value > 0 Then
                If Len(Target.Value) >= 2 And Len(Target.Value) <= 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 = ""
                    End If
                    Target.NumberFormat = "[t]:mm"
                Else
                    Target.Value = ""
                End If
            Else
                Target.Value = ""
            End If
        Else
            Target.Value = ""
        End If
    End If
Slut:
    Application.EnableEvents = True
End Sub
Avatar billede svla Mester
05. marts 2012 - 20:23 #8
Hej Perhol
Jeg bruger Windows 7 pro, og Office 2010.

Jeg har prøvet din kode, på et område A1:B30, A31:B31 er sat til og sammentælle de tider som bliver indtastet i området A1:B30. Alle celler i området A1:B31 er formateret til [tt]:mm.

Din kode melder ikke fejl, men hvis jeg i området A1:B30 indtaster f.eks 1400, eller 0700, bliver resultatet som fremkommer i cellen henholdsvis 33600:00 og 16800:00, summen i området A31:B31 er lagt sammen korrekt.

Jeg kan ikke rigtig gennemskue hvad din kode gør, men jeg tror det er noget af det rigtige, har du selv afprøvet den ?
Hvis du har en løsning vil jeg da blive glad, ellers arbejder jeg videre med din kode, - det må vel kunne lade sig gøre.
Avatar billede perhol Seniormester
05. marts 2012 - 21:09 #9
UPS.
Jeg glemte at fortælle at du skal markere alle de celler koden skal virke på og navngive dem mednavnet TidCol1.
Det skyldes denne linje i koden:
    If Not Intersect(Target, Range("TidCol1")) Is Nothing Then
Hvis du ændrer ("TidCol1") til et andet navn skal du også ændre navngivningen af cellerne.

Jeg bruger Excel 2007 og har prøvet både med formatet [t]:mm og [tt]:mm.
Det virker, også i excel 2003. Jeg ved ikke med Excel 2010, men det burde virke.
Avatar billede store-morten Ekspert
05. marts 2012 - 21:19 #10
Prøv:
Enten at markere A1:B30 og døb området TidCol1

Eller udskift "TidCol1" i koden, med "A1:B30"
Avatar billede store-morten Ekspert
05. marts 2012 - 21:23 #11
UPS.
Skulle há trykket "prewiew" først ;-)
Avatar billede svla Mester
05. marts 2012 - 21:50 #12
Har prøvet igen med og rette i koden til A1:B30, og prøvet og markere området A1:B30 og døbe det til "tidCol1", men får stadigvæk samme resultat når cellen forlades
- Må desværre gå nu, men vender tilbage til sagen
Avatar billede store-morten Ekspert
05. marts 2012 - 21:52 #13
Det er enten eller ;-)

Brug kun den ene løsning.
Avatar billede perhol Seniormester
05. marts 2012 - 22:25 #14
Hvad mener du med rette i koden til A1:B30 ?

Når man navngiver et område (Range) i Excel og anvender dette Range i VBA kode, så er det case sensitivt.
Det skal være TidCol1, ikke tidCol1!
Avatar billede perhol Seniormester
05. marts 2012 - 22:26 #15
Ellers skal du ændre områdets navn både i arket og i koden.
Avatar billede store-morten Ekspert
05. marts 2012 - 22:34 #16
Rette i koden til A1:B30
Ingen navngivning af område.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    On Error GoTo Slut
    Application.EnableEvents = False
    If Not Intersect(Target, Range("A1:B30")) Is Nothing Then
        If IsNumeric(Target.Value) Then
            If Target.Value Mod 1 = 0 And Target.Value > 0 Then
                If Len(Target.Value) >= 2 And Len(Target.Value) <= 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 = ""
                    End If
                    Target.NumberFormat = "[t]:mm"
                Else
                    Target.Value = ""
                End If
            Else
                Target.Value = ""
            End If
        Else
            Target.Value = ""
        End If
    End If
Slut:
    Application.EnableEvents = True
End Sub
Avatar billede perhol Seniormester
05. marts 2012 - 23:02 #17
Den havde jeg ikke lige tænkt på store morten.
Men min TidCol1 er også et område på 11*2 celler 21 forskellige steder + 2*2 celler gentaget 7 gange i arket. I øvrigt identisk på 4 ark,bortset fra at TidCol nummereres på de 4 ark (rulleplan 4 uger, 3 huse á 11 personer + 2 nattevagter).
I en mere enkel opbygning ville det nok være mere enkelt at bruge adressehenvisninger som du foreslår. Og det ser jo ud til at være en mere enkel opbygning her.
Avatar billede store-morten Ekspert
05. marts 2012 - 23:17 #18
Det blev jeg klogerer ;-)

Hvis man vil have den til at reager på A1, A3, A5. Range("A1, A3, A5")

Så kan man markerer A1, A3, A5 og døbe disse til "TidCol" og så bruge Range("TidCol")

Giver rigtig mening, når man som i dit eks. har mange områder.
Avatar billede perhol Seniormester
06. marts 2012 - 00:07 #19
Jeps!
Har også konstateret at det giver problemer at navngive over flere ark.
Derfor ligger makroen da også i hvert arks kode i stedet for i filens (Thisworkbook).
Og området er navngivet TidCol1 - TidCol2...osv.
Kunne sikkert gøres enklere, men altså - det er jo bare mig.
Avatar billede svla Mester
06. marts 2012 - 17:04 #20
Hej igen

Nu er jeg vendt tilbage, har slettet alt på mit excel-prøveark, og startet helt forfra, og nu virker både Perhol og Store-mortens kode som den skal, jeg må jo ha' lavet en fejl.
- Men nu fungerer det lige som det skal, tak tak

.-Men kan en af jer forklare hvad der sker i det stykke kode herunder.
Jeg forstår ikke rigtig det der sker med variablerne itime og i minut.



If IsNumeric(Target.Value) Then
    If Target.Value Mod 1 = 0 And Target.Value > 0 Then
        If Len(Target.Value) >= 2 And Len(Target.Value) <= 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 = ""
            End If
            Target.NumberFormat = "[t]:mm"
        Else
            Target.Value = ""
        End If
    Else
        Target.Value = ""
    End If
Else
    Target.Value = ""
End If
Avatar billede perhol Seniormester
06. marts 2012 - 21:58 #21
Skal prøve efter bedste evne, men vil understrege at jeg IKKE er VBA ekspert.

If Len(Target.Value) >= 2 And Len(Target.Value) <= 4 Then
Betyder: Hvis cellens værdi har en længde (antal tegn) større end eller lig med 2 OG  hvis cellens værdi har en længde mindre end eller lig med 4 så Den er ikke helt forståelig for mig. Hvis man kun skriver 2 tegn i cellen bliver den tømt igen. Først hvis man skriver 3 eller 4 tegn accepteres det.

iTime = Left(Format(Target, "0000"), 2)

Betyder: Cellens værdi regnes for at være 4 tegn lang selv om formatet er [t]:mm (foranstilles virtuelt med et 0). De 2 tegn  til venstre er timerne

iMinut = Right(Format(Target, "0000"), 2)
Betyder: De 2 tegn til højre er minutterne

If iTime < 24 And iMinut <= 59 Then
Betyder: Hvis timerne er mindre end 24 og minutterne er mindre end eller lig med 59 SÅ

Target = iTime / 24 + iMinut / 24 / 60
Tidspunktet i cellen er lig med timerne divideret med 24 + minutterne divideret med 24 divideret med 60 (giver serietallet for tidspunktet tror jeg nok)

Giver det mening?
Avatar billede svla Mester
06. marts 2012 - 23:00 #22
Hej
Jeg takker mange gange for din forklaring og tror at jeg i store træk har forstået hvad det går ud på.
- Det er ganske korrekt at det hele går ud på og regne serialtallet for tidspunktet korrekt ud. Jeg har tjekket regnestykket på min lommeregner og tog udgangspunkt i tiden 1240, foretog den samme beregning på lommeregneren og fik resultatet 0,527778 (serialtallet), lavede herefter lige et tjek på excel, indtastede serialtallet og fik korrekte tid 12:40 retur.
- Jeg takker mange gange for din forklarin og hjælpen, nu blev jeg jo noget klogere. Din kode er helt perfekt, jeg bruger den nu, og får helt sikkert brug for den i forbindelse med andre ark.
Jeg har jo givet Supertekst mine point, jeg regnede ikke med der kom flere svar, pointene burde havede været til dig.
Avatar billede perhol Seniormester
06. marts 2012 - 23:28 #23
Jeg fik i sin tid hjælp til koden flere steder og har haft glæde af den i flere år.
supertekst hjælper mange.
Jeg har læst mange af hans svar, og de har et par gange hjulpet mig.
Han er velkommen til point.
Bare godt at du kunne bruge koden!
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