Vnesite čas brez debelega črevesa - Excel Nasveti

Vprašanje za Excel ta teden prihaja od Johna, ki je nameščen na Okinawi.

Izdelujem preglednico Excel, ki odraža odhode in prihode. V bistvu bodo tri celice: dejanski čas odhoda, predviden čas potovanja in predviden čas prihoda. Želel bi, da oseba samo vnese (na primer) 2345 in naj celica samodejno oblikuje zaslon tako, da se prikaže 23:45. Namesto tega dobim 0:00, ne glede na formulo ali oblikovanje. Izračun ne bo prikazal nič drugega kot 0:00, če uporabnik ne bo premaknil tipke in dvopičja. Vem, da je to preprosto narediti, vendar vsaka sekunda shranjena šteje, še posebej, kadar v Excel vedno znova vnašamo podobne podatke.

Če želite to narediti, morate uporabiti vodnik dogodkov. Obdelovalci dogodkov so bili novi v Excelu 97, o njih pa je razpravljalo že v poglavju Zaženi makro vsakič, ko se spremeni vrednost celice v Excelu. Vendar je v tem nasvetu vodnik dogodkov uporabljal drugačno obliko za določene celice. Ta aplikacija je nekoliko drugačna, zato ponovno obiščimo vodnik dogodkov.

Obdelovalec dogodkov je majhen del kode makra, ki se izvrši vsakič, ko se zgodi določen dogodek. V tem primeru želimo, da se makro zažene vsakič, ko spremenite celico. Če želite nastaviti vodnik dogodkov, sledite tem korakom:

  • Obdelovalec dogodkov je povezan samo z enim delovnim listom. Začnite s tega delovnega lista in pritisnite alt-F11, da odprete urejevalnik VB.
  • V zgornjem levem oknu (Project - VBA Project) dvokliknite ime delovnega lista.
  • V desnem podoknu kliknite levi spustni meni in spremenite splošno v Delovni list.
  • V desnem spustnem meniju izberite Spremeni.

To bo povzročilo, da bo Excel vnaprej vnesel naslednjo lupino makra:

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

Ob vsaki spremembi celice se celica, ki je bila spremenjena, prenese v ta program v spremenljivki, imenovani "Cilj". Ko nekdo vpiše čas z dvopičjem v delovni list, se ta izračuna na število, manjše od ena. Blok If poskrbi, da se celice spremenijo le, če so večje od ene. Funkcije left () in right () uporabljam za razdelitev uporabniškega vnosa na ure in minute in vmes vstavim dvopičje.

Kadarkoli uporabnik vnese "2345", program spremeni ta vnos v 23:45.

Možne izboljšave

Če želite omejiti program samo na stolpce A&B, lahko preverite vrednost Target.Column in izvedete blok kode samo, če ste v prvih dveh stolpcih:

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

Če želite kdaj spremeniti delovni list brez vnosa dvopičja (na primer, ali morate dodati formule ali spremeniti naslove itd.), Lahko s tem kratkim makrom obračate vodnik dogodkov:

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

Če vzamete ta koncept in ga spremenite, se morate zavedati pomembnega koncepta. Ko makro obdelovalca dogodkov dodeli novo vrednost celici, na katero se sklicuje Target, Excel to šteje kot spremembo delovnega lista. Če na kratko ne obrnete obdelovalcev dogodkov, bo Excel rekurzivno začel klicati obdelovalec dogodkov in dobili boste nepričakovane rezultate. Preden spremenite delovni list v upravljalniku dogodkov sprememb, začasno prekinite obdelavo dogodkov s vrstico Application.EnableEvents.

Zanimive Članki...