Indtast tid uden kolon - Excel-tip

Indholdsfortegnelse

Denne uges Excel-spørgsmål kommer fra John stationeret i Okinawa.

Jeg bygger et Excel-regneark, der afspejler afgange og ankomst. Der vil grundlæggende være tre celler: Faktisk afgangstid, Anslået tid på vej og Anslået ankomsttid. Jeg vil gerne have, at personen bare kan komme ind (for eksempel) 2345 og have cellen automatisk til at formatere skærmen til at vise 23:45. Hvad jeg får i stedet er 0:00, uanset formel eller formatering. Og beregningen viser ikke andet end 0:00, hvis brugeren ikke skifter nøgle og kolon. Jeg ved, at det virker simpelt at gøre det, men hvert lille sekund gemmes tæller, især når man indtaster lignende data igen og igen i Excel.

For at få dette til at fungere skal du bruge en begivenhedshåndterer. Begivenhedshåndterere var nye i Excel 97 og blev diskuteret tilbage i Kør en makro hver gang en celleværdi ændres i Excel. Dog tilbage i dette tip anvendte begivenhedshåndtereren et andet format til bestemte celler. Denne applikation er lidt anderledes, så lad os besøge begivenhedshåndtereren igen.

En begivenhedshåndterer er en lille smule makrokode, der udføres hver gang en bestemt begivenhed sker. I dette tilfælde ønsker vi, at makroen skal køre, når du ændrer en celle. Følg disse trin for at konfigurere en begivenhedshåndterer:

  • En begivenhedshåndterer er knyttet til kun et enkelt regneark. Start fra dette regneark, og tryk på alt-F11 for at åbne VB-editoren.
  • I det øverste venstre vindue (Project - VBA Project) dobbeltklik på navnet på dit regneark.
  • Klik på venstre rullemenu i højre rude, og skift generelt til regneark.
  • I højre rullemenu skal du vælge Skift.

Dette får Excel til at indtaste følgende makroskal på forhånd for dig:

Private Sub Worksheet_Change(ByVal Target As Range) UserInput = Target.Value If UserInput> 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End Sub

Hver gang en celle ændres, sendes cellen, der blev ændret, til dette program i variablen kaldet "Target". Når nogen går ind i en tid med et kolon i regnearket, vurderes det til et tal mindre end et. If-blokken sørger kun for at ændre celler, hvis de er større end en. Jeg bruger funktionerne venstre () og højre () til at opdele brugerindgangen i timer og minutter og indsætte et kolon imellem.

Hver gang brugeren indtaster "2345", vil programmet ændre denne post til 23:45.

Mulige forbedringer

Hvis du vil begrænse programmet til kun at arbejde på kolonne A&B, kan du kontrollere værdien af ​​Target.Column og kun udføre kodeblokken, hvis du er i de to første kolonner:

Private Sub Worksheet_Change(ByVal Target As Range) ThisColumn = Target.Column If ThisColumn 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End If End Sub

Hvis du nogensinde vil foretage ændringer i regnearket uden at indtaste kolon (f.eks. Skal du tilføje formler eller ændre overskrifter osv.), Kan du slå begivenhedshåndtereren til med denne korte makro:

Sub TurnEventHanderOff() Application.EnableEvents = False End Sub You can turn event handlers back on with this macro: Sub TurnEventHanderOff() Application.EnableEvents = True End Sub

Hvis du tager dette koncept og ændrer det, er der et vigtigt koncept at være opmærksom på. Når hændelseshåndteringsmakroen tildeler en ny værdi til den celle, der henvises til af Target, tæller Excel dette som en regnearksændring. Hvis du ikke kort vælger begivenhedshåndterere, begynder Excel rekursivt at ringe til begivenhedshåndtereren, og du får uventede resultater. Inden du foretager en ændring af et regneark i en ændringshændelseshåndterer, skal du sørge for midlertidigt at suspendere hændelseshåndtering med linjen Application.EnableEvents.

Interessante artikler...