Anna aika ilman kaksoispistettä - Excel-vinkkejä

Sisällysluettelo

Tämän viikon Excel-kysymys tulee Okinawassa sijaitsevalta Johnilta.

Rakennan Excel-laskentataulukkoa lähtemisten ja saapumisten huomioon ottamiseksi. Siellä on periaatteessa kolme solua: todellinen lähtöaika, arvioitu reittireitti ja arvioitu saapumisaika. Haluaisin, että henkilö voi vain kirjoittaa (esimerkiksi) 2345 ja saada solun muotoilemaan näytön automaattisesti näyttämään 23:45. Sen sijaan saan 0:00 kaavasta tai muotoilusta riippumatta. Ja laskelma ei näytä muuta kuin 0:00, jos käyttäjä ei siirry näppäintä ja kaksoispistettä. Tiedän, että se näyttää olevan helppoa, mutta jokainen tallennettu sekunti laskee, varsinkin kun syötät vastaavia tietoja yhä uudelleen Exceliin.

Jotta tämä toimisi, sinun on käytettävä tapahtumankäsittelijää. Tapahtumankäsittelijät olivat uusia Excel 97: ssä, ja niistä keskusteltiin takaisin kohdassa Makron suorittaminen joka kerta, kun solun arvo muuttuu Excelissä. Kuitenkin takaisin tähän kärkeen tapahtumankäsittelijä sovelsi erilaista muotoa tietyille soluille. Tämä sovellus on hieman erilainen, joten katsotaanpa tapahtuman käsittelijä.

Tapahtumankäsittelijä on pieni makrokoodi, joka suoritetaan aina, kun tietty tapahtuma tapahtuu. Tässä tapauksessa haluamme makron toimivan aina, kun vaihdat solua. Määritä tapahtumankäsittelijä seuraavasti:

  • Tapahtumankäsittelijä liittyy vain yhteen laskentataulukkoon. Aloita tältä laskentataulukolta ja avaa VB-editori painamalla Alt-F11.
  • Kaksoisnapsauta laskentataulukon nimeä vasemmassa yläkulmassa (projekti - VBA-projekti).
  • Napsauta oikeanpuoleisessa ruudussa vasenta pudotusvalikkoa ja muuta yleiseksi laskentataulukoksi.
  • Valitse oikeasta pudotusvalikosta Muuta.

Tämä saa Excelin syöttämään etukäteen seuraavan makrokuoren puolestasi:

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

Aina kun solua vaihdetaan, muutettu solu välitetään tälle ohjelmalle muuttujassa nimeltä "Kohde". Kun joku kirjoittaa laskentataulukon ajan kaksoispisteellä, se arvioi alle yhdeksi. If-lohko varmistaa, että soluja vaihdetaan vain, jos ne ovat suurempia kuin yksi. Käytän vasenta () ja oikeaa () toimintoa jakamaan käyttäjän syötteet tunteihin ja minuutteihin ja lisäämään kaksoispiste väliin.

Aina kun käyttäjä syöttää "2345", ohjelma muuttaa tämän merkinnän 23:45: ksi.

Mahdolliset parannukset

Jos haluat rajoittaa ohjelman toimimaan vain sarakkeissa A & B, voit tarkistaa Target.Column-arvon ja suorittaa koodilohkon vain, jos olet kahdessa ensimmäisessä sarakkeessa:

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

Jos haluat joskus tehdä muutoksia laskentataulukkoon kaksoispisteitä syöttämättä (esimerkiksi sinun on lisättävä kaavoja tai muutettava otsikoita jne.), Voit kääntää tapahtumakäsittelijän tällä lyhyellä makrolla:

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

Jos otat tämän käsitteen ja muutat sitä, on tärkeää olla tietoinen siitä. Kun tapahtumankäsittelymakro määrittää uuden arvon Targetin viittaamalle solulle, Excel laskee tämän laskentataulukon muutokseksi. Jos et käännä tapahtumankäsittelijöitä hetkeksi, Excel alkaa rekursiivisesti kutsua tapahtumankäsittelijää ja saat odottamattomia tuloksia. Ennen kuin muutat laskentataulukkoa muutostapahtumien käsittelijässä, muista keskeyttää tapahtumien käsittely väliaikaisesti Application.EnableEvents-rivillä.

Mielenkiintoisia artikkeleita...