Hei
Käytän Visual basic koodia excelistä. Koodissa on kolme moduulia. Haluasin määrittää ja antaa globaalille muuttujalle arvon (merkkijono="mjonoteksti") ennenkuin moduuleissa olevia koodeja suoritetaan, siten että se näkyy kaikissa moduuleissa.
Nyt olen antanut moduulin Module1 sisällä globaalille muuttujalle arvon ja homma toimii. Mutta jos suoritan aluksi moduulin Module2 niin siellä globaalilla muuttujlla ei ole arvoa...
Määrittele Globaali muuttuja missä tahansa moduulissa General osiossa tyyliin: Global muuttujaninimi As muuttujantyyppi, vaikkapa Global merkkijono As String niin se toimii missä tahansa toisessa moduulissa. Jos haluat, että sen arvoksi tallennnetaan esim. "mjonotesti" niin se pitää tehdä esim. aliohjelmassa ennen kuin muuta koodia suoritetaan:
Sub Auto_Open() ' suoritetaan automaattisesti kun Excel projekti avataan
merkkijono = "mjonotesti"
End Sub
Tämän jälkeen voit käyttää sitä mistä tahansa muusta moduulista käsin esim. MsgBox merkkijono, tai muuttaa sen arvoa esim. merkkijono = "jokinmuumerkkijono"
Jos taas haluat asettaa Globaalin vakion jonka arvoa ei voi muuttaa niin teet sen tyyliin Global Const merkkijono = "mjonotesti"
Tuo Auto_Open() oli juuri se mitä hain.
Kiitos neuvosta!
-Petri
Tuo on ihan klassinen VBA:n kompastuskivi, tunnistan tuon heti. Se muuttujan arvo asettuu vasta silloin kun se koodirivi oikeasti ajetaan, ei sillä hetkellä kun Excel avataan - joten jos Module2 lähtee liikkeelle ensin, muuttuja on vielä tyhjä. Helpoin korjaus on laittaa se alustus esimerkiksi Workbook_Open-tapahtumaan ThisWorkbookissa, jolloin se pyörähtää käyntiin heti tiedoston avautuessa ennen mitään muuta. Näin se arvo on aina valmiina, oli sitten mikä moduuli tahansa ensimmäisenä ajossa.
Niinpä... When you set Application.EnableEvents = False the Auto_Open event still runs. The scope of Auto_Open does not have to be Public (it can be changed to Private). Holding down Shift when opening the workbook will disable both Auto_Open and Workbook_Open. You can call the Auto_Open function manually using Workbook.RunAutoMacros. Workbook_Open is called before Auto_Open if both events exist. Workbooks.Open ActiveWorkbook.RunAutoMacros <A HREF="../../excel/macros/enumerations-xlrunautomacro.htm"><U>xlRunAutoMacro</U></A>.
VBA:ssa on kaikenlaista klassista kunhan oppii tunnistamaan...