EnableEvents

Miten tuo EnableEvents oikein toimii?

Minulla on lomake, jonka kunkin tekstikentän muuttuessa suoritetaan kyseisen kentän TxtBox_Change -tapahtuma. Lisäksi minulla on painike jolla kaikki kentät tyhjennetään eli TxtBox.Value=Empty. Yritin estää TxtBox_Change -tapahtuman seuraavanlaisella rivillä:

Application.EnableEvents = False

Ei auttanut, TxtBox_Change esiintyy yhä. Sen tosin huomasin että esimerkiksi BeforeSave -tapahtuma estyi?!?
5475
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Kuten tekstistäkin käy ilmi Application.EnableEvents on Application objektin tapahtuma eikä toimi siis VBA puolella Excelissä on 4 objektia, jotka sisältävät tapahtumia
Application
Chart
Workbook
Worksheet

esim Textboxin Change tapahtuma ei kuulu näihin eikä muutkaan VBA editorin puolen tapahtumat.Välillisesti toki namäkin aiheuttavat tapahtumaan esim. jos muutat solun arvoa VBA koodilla se aiheuttaa tietenkin Change tapahtuman Worksheet, Workbook, and Application objektille. BeforeSave -tapahtuma estyi koska se kuuluu Application objektin tapahtumiin. Pitää pitää mielessä jos käyttää tapahtumaa että se vaikuttaa kaikkiin aukioleviin työkirjoihin ja Excel ei palauta sitä automaattisesti, joten se pitää palauttaa Application.EnableEvents = True komennolla ja varmistaa virhekäsittelyllä, että varmasti kaikissa tapauksissa se palautetaan!

no se siitä ja asiaan

eli sinun täytyy nyt tehdä muuttuja, jolla estät ko tapahtuman suorituksen riippuen muuttujan arvosta

seuraavassa esim.
lisää lomake ja siihen
3 textboxia oletusnimineen
3 labeliä oletusnimineen
1 commandbutton
liitä allaoleva koodi lomakkeeseen

Private muuta As Boolean
Private Sub CommandButton1_Click()
muuta = False
TextBox1 = ""
TextBox2 = ""
TextBox3 = ""
muuta = True
End Sub

Private Sub TextBox1_Change()
If muuta Then
Label1.Caption = TextBox1
End If
End Sub

Private Sub TextBox2_Change()
If muuta Then
Label2.Caption = TextBox2
End If
End Sub

Private Sub TextBox3_Change()
If muuta Then
Label3.Caption = TextBox3
End If
End Sub

Private Sub UserForm_Initialize()
muuta = True
End Sub

Ohjelma toimii seuraavasti:
kun lomake avataan alustetaan muuta muuttujan arvoksi TRUE
kun kirjoitat tekstiä tekstiruutuihin vastaavan labelin otsikko muuttuu tekstiruudun tekstin mukaan, koska muuta muuttujan arvo on TRUE.
Kun klikkaat komentopainiketta muuta muuttuja saa arvon FALSE ja näin ollen tekstiruutujen CHANGE tapahtuman koodeja ei suoriteta. Komentopainikkeen koodissa lopuksi asetaan muuta muuttuja jälleen arvoon TRUE, jolloin tekstiruutujen tapahtumat toimivat jälleen normaalisti.
Toivottavasti selkeytti

Äänestä
  • Mistä olet saanut tietosi. Olen yrittänyt opetella VBA:ta jo kahdeksan vuotta mutta tiedon saaminen on ihan helkkarin vaikeeta.

    Suomalaisilla VBA-oppailla voisi , saanko sanoa, pyyhkiä persettä.

    Äänestä

  • Excelisti kirjoitti:

    Mistä olet saanut tietosi. Olen yrittänyt opetella VBA:ta jo kahdeksan vuotta mutta tiedon saaminen on ihan helkkarin vaikeeta.

    Suomalaisilla VBA-oppailla voisi , saanko sanoa, pyyhkiä persettä.

    Päätoimisesti käyttänyt VBA:ta ACAD v14 lähtien(vuodesta 2000), jolloin se integroitiin siihen. Aluksi ei ollut oppaita, joten kantapään kautta piti opetella. Myöhemmin kuvaan tulivat Excel, AlphaCAM ja Access. Noitten kanssa tulee painiskeltua nykyään. Excel on kyllä tosi hyvä ohjelma, sillä voi tehdä kaikkea kivaa VBA:n avulla, kuten moni foorumilla on varmaan huomannutkin. Wordiä käytän vain hätätilassa sen kankeuden takia. Kaikki mitä voit tehdä Wordillä voit tehdä kyllä yhtä hyvin Excelilläkin ja useimmin helpommin- tarvittaessa haetaan vaikkapa Wordin oikolukija Exceliin ja käytetään sitä...
    Päätyökseni teen CNC ohjelmiin parametrisiä sovellutuksia, tyyliin tilauksesta valmiiseen CNC koodiin sekä erilaisia tuotannon ohjausjuttuja vaikkapa viivakoodiohjauksin.
    Oppaista sen verran, että eivät muutu versioiden mukana- aina samat esimerkit... ja oikeassa olet noitten suomioppaitten kanssa. Kyllä netistä tietoa löytyy kun jaksaa ettiä ja hyviä kirjojakin on olemassa.
    Olen ajatellut laittaa oman Excel? foorumin pystyyn-sittenhän on tietoa saatavilla ja vieläpä suomenkielelläkin :-)
    Varmaan toimisi paremmin kuin tämä palsta-ainakin saisi lähetettyä liitetiedoston, jonka perusteella olisi helpompi vastailla.
    Ei kun Keep Exceling

    Äänestä

  • Kiitos vastauksesta, selvisi sekin homma. Olin ratkaissut ongelman vähän samaan tyyliin kuin neuvoit, ajattelin vain että josko tuolla EnableEventsillä olisi voinut hoitaa asian "sujuvammin".

    Nyt minulla on yksi String- tyyppinen julkinen muuttuja, nimeltään vaikkapa "PublicMuuttuja" ja tämän muuttujan arvoksi annan tuossa tyhjennä-proseduurin alussa arvon "Tyhjennä" ja lopussa Empty. Samaisen muuttujan arvoksi proseduurin peruuta alussa annan "Peruuta" ja lopussa Empty ja niin edelleen.

    Tapahtumissa jotka haluan estää on sitten seuraavanlainen koodi: If PublicMuuttuja.Value = "Tyhjennä" or PublicMuuttuja.Value = "Peruuta" then ExitSub (.Value on kai turha..?)

    Mutta sitten toiseen asiaan. Kuten Exelisti kommentissaan ihaili osaamistasi, samoin itselläni on ollut samanlaisia ajatuksia kun olen tällä palstalla joskus käynyt. Ja se on hieno juttu että jaksat vastailla toisten esittämiin kysymyksiin, aika moneen tällä palstalla esitettyyn kysymykseen näyttää vastaus olevan peräisin sinulta. Itselläni tulee käytyä palstalla oikeastaan vain silloin kun on jotakin kysyttävää, eli toisten auttaminen valitettavasti on jäänyt huomattavasti vähemmälle kuin itselle avun saaminen. Muutamaan yksittäiseen kysymykseen olen pystynyt osaamisen mutta myöskin ehtimisen puolesta vastaamaan, harvoin edes ehdin vastaamaan ensimmäisenä sellaiseen kysymykseen mihin vastauksen osaisin antaa.

    Suomalaiset antavat palautetta vain silloin kun palaute on negatiivista, eikös se näin ole, mutta nyt täytyy antaa positiivista palautetta. Paljon kiitoksia Kundelle, ja muillekin tämän palsta avuliaille kuten Exelistille, Exelit.fille, Paavalille ja muillekin joiden nimi jäi mainitsematta mutta jotka tuntevat kuuluvansa tähän ryhmään.

    -Pasi-

    Äänestä

  • Pasi kirjoitti:

    Kiitos vastauksesta, selvisi sekin homma. Olin ratkaissut ongelman vähän samaan tyyliin kuin neuvoit, ajattelin vain että josko tuolla EnableEventsillä olisi voinut hoitaa asian "sujuvammin".

    Nyt minulla on yksi String- tyyppinen julkinen muuttuja, nimeltään vaikkapa "PublicMuuttuja" ja tämän muuttujan arvoksi annan tuossa tyhjennä-proseduurin alussa arvon "Tyhjennä" ja lopussa Empty. Samaisen muuttujan arvoksi proseduurin peruuta alussa annan "Peruuta" ja lopussa Empty ja niin edelleen.

    Tapahtumissa jotka haluan estää on sitten seuraavanlainen koodi: If PublicMuuttuja.Value = "Tyhjennä" or PublicMuuttuja.Value = "Peruuta" then ExitSub (.Value on kai turha..?)

    Mutta sitten toiseen asiaan. Kuten Exelisti kommentissaan ihaili osaamistasi, samoin itselläni on ollut samanlaisia ajatuksia kun olen tällä palstalla joskus käynyt. Ja se on hieno juttu että jaksat vastailla toisten esittämiin kysymyksiin, aika moneen tällä palstalla esitettyyn kysymykseen näyttää vastaus olevan peräisin sinulta. Itselläni tulee käytyä palstalla oikeastaan vain silloin kun on jotakin kysyttävää, eli toisten auttaminen valitettavasti on jäänyt huomattavasti vähemmälle kuin itselle avun saaminen. Muutamaan yksittäiseen kysymykseen olen pystynyt osaamisen mutta myöskin ehtimisen puolesta vastaamaan, harvoin edes ehdin vastaamaan ensimmäisenä sellaiseen kysymykseen mihin vastauksen osaisin antaa.

    Suomalaiset antavat palautetta vain silloin kun palaute on negatiivista, eikös se näin ole, mutta nyt täytyy antaa positiivista palautetta. Paljon kiitoksia Kundelle, ja muillekin tämän palsta avuliaille kuten Exelistille, Exelit.fille, Paavalille ja muillekin joiden nimi jäi mainitsematta mutta jotka tuntevat kuuluvansa tähän ryhmään.

    -Pasi-

    Älä käytä String tyypin muuttujaa totuusarvo vertailussa vaan Boolean tyypin muutujaa.Se voi saada vain arvot TRUE ja FALSE.
    Boolean tyyppiin voi helposti tehdä vertailun esim.
    muuta =Range("A1")>10 vastaa koodia
    if Range("A1")>10 then
    muuta=true
    end if

    Toiseksi muuttujalle ei anneta ominaisuuksia vaan käytetään pelkkää muuttujan nimeä. Käsittääkseni koodisi ei pitäisi toimia...?
    Lisäksi käytät Empty sanaa, joka on VBA:n varattu sana ja helposti aiheuttaa sinulle harmaita hiuksia koodissasi.

    Kiitos palautteesta ;-)

    Äänestä

Ketjusta on poistettu 1 sääntöjenvastainen viesti.

Kommentoi aloitusta


Pasi kirjoitti:

Miten tuo EnableEvents oikein toimii?

Minulla on lomake, jonka kunkin tekstikentän muuttuessa suoritetaan kyseisen kentän TxtBox_Change -tapahtuma. Lisäksi minulla on painike jolla kaikki kentät tyhjennetään eli TxtBox.Value=Empty. Yritin estää TxtBox_Change -tapahtuman seuraavanlaisella rivillä:

Application.EnableEvents = False

Ei auttanut, TxtBox_Change esiintyy yhä. Sen tosin huomasin että esimerkiksi BeforeSave -tapahtuma estyi?!?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu