Sisestage aeg ilma koolonita - Exceli näpunäited

Lang L: none (table-of-contents)

Selle nädala Exceli küsimus pärineb Johnilt, kes asus Okinawal.

Ehitan Exceli tabelit väljumiste ja saabumiste kajastamiseks. Põhimõtteliselt on kolm lahtrit: tegelik väljumisaeg, eeldatav marsruudi kestus ja eeldatav saabumisaeg. Tahaksin, et inimene saaks lihtsalt sisestada (näiteks) 2345 ja lasta lahtril automaatselt kuvada kuva 23:45. Selle asemel saan 0:00, olenemata valemist või vormingust. Ja arvutus ei näita muud kui 0:00, kui kasutaja ei suuda klahvi ja koolonit nihutada. Ma tean, et seda teha tundub lihtne, aga iga väike sekund salvestatud loeb, eriti kui sarnaseid andmeid Excelisse ikka ja jälle sisestada.

Selle toimimiseks peate kasutama sündmuste käitlejat. Sündmuste käitlejad olid rakenduses Excel 97 uued ja neid arutati tagasi jaotises Makro käivitamine iga kord, kui Exceli lahtriväärtus muutub. Kuid tagasi selles näpunäites rakendas sündmuste käitleja teatud lahtritele teistsugust vormingut. See rakendus on veidi erinev, seega vaatame sündmuste käitlejat uuesti üle.

Sündmuste käitleja on väike osa makrokoodist, mis käivitatakse iga kord, kui teatud sündmus juhtub. Sel juhul soovime, et makro töötaks alati, kui muudate lahtrit. Sündmuste käitleja seadistamiseks toimige järgmiselt.

  • Sündmuste käitleja on seotud vaid ühe töölehega. Alustage sellest töölehest ja vajutage VB-redaktori avamiseks alt-F11.
  • Topeltklõpsake vasakus ülanurgas (Projekt - VBA projekt) oma töölehe nimel.
  • Paremal paanil klõpsake vasakul rippmenüül ja muutke üldiseks Tööleht.
  • Valige paremas rippmenüüs Muuda.

See paneb Exceli teie jaoks järgmise makrokesta eelnevalt sisestama:

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

Iga kord, kui lahtrit muudetakse, edastatakse muudetud lahter sellele programmile muutujaga "Target". Kui keegi sisestab töölehele aja kooloniga, hindab see arvu vähem kui ühele. Kui plokk muudab lahtrid kindlasti ainult siis, kui need on suuremad kui üks. Kasutan vasakut () ja paremat () funktsiooni, et jagada kasutaja sisend tundideks ja minutiteks ning sisestada nende vahele koolon.

Alati, kui kasutaja sisestab "2345", muudab programm selle kirje väärtuseks 23:45.

Võimalikud täiustused

Kui soovite piirata programmi töötamist ainult veergudes A & B, saate kontrollida Target.Column väärtust ja käivitada koodiploki ainult siis, kui olete kahes esimeses veerus:

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

Kui soovite kunagi muuta töölehte muudatusi ilma koolonite sisestamiseta (näiteks kas peate lisama valemeid või muutma pealkirju jne), saate sündmuste käitleja selle lühikese makroga keerata:

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

Kui võtate selle kontseptsiooni ja muudate seda, peate teadma olulist kontseptsiooni. Kui sündmuste käitleja makro omistab uue väärtuse lahtrile, millele Target viitab, loeb Excel selle töölehe muudatusena. Kui te ei pöördu korraks sündmuste käitlejate poole, siis hakkab Excel rekursiivselt sündmuste käitlejale helistama ja saate ootamatuid tulemusi. Enne töölehe muutmist muudatuste sündmuste käitluses peatage kindlasti sündmuste käitlemine ajutiselt real Application.EnableEvents.

Huvitavad Artiklid...