Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Globaali muuttuja VBA & Excel

Harrastekoodari [08.07.2026 10:41:26]

#

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...

neosofta [08.07.2026 12:15:30]

#

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"

Harrastekoodari [08.07.2026 14:13:57]

#

Tuo Auto_Open() oli juuri se mitä hain.
Kiitos neuvosta!

-Petri

IinesAho [13.08.2026 16:28:09]

#

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.

neosofta [14.08.2026 18:57:31]

#

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>.xlAutoOpen jne...

VBA:ssa on kaikenlaista klassista kunhan oppii tunnistamaan...

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta