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?!?
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?!?
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
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
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 ;-)