04. marts 2012 - 15:57Der 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.
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
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.
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
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.
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.
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
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
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.
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.
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
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)
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.
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!
Synes godt om
Ny brugerNybegynder
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.