Save a lot

Alapvető fájlműveletek – 2. rész: fájlok mentése

Folytatva az előző bejegyzésben megkezdett gondolatmenetet, a mai téma a fájlok mentése.

Nézzük először az alapokat.

Létező fájl mentése

Egy már létező, fájlnévvel rendelkező munkafüzetet a Save metódussal tudjuk elmenteni, ezt bármilyen Workbook típusú objektumon el lehet végezni. Néhány példa:

1)

ThisWorkbook.Save

Ezzel a paranccsal azt a fájlt mentjük, amiben a makrót futtatjuk.

2)

ActiveWorkbook.Save

Ezzel a paranccsal azt a fájlt mentjük, amelyik épp aktív. Tehát ha több fájlunk van nyitva, akkor a menteni kívánt munkafüzetet előbb aktiválni kell.

3)

Workbooks(Workbooks.Count).Save

Ez a legutoljára megnyitott munkafüzetet menti el.

4)

Workbooks(“Minta.xlsx”).Save

Ez a Minta.xlsx nevű fájlt menti el, feltéve hogy az nyitva van – ha nincs, akkor viszont hibaüzenetet kapunk.

Mi van, ha nem azt a fájlt szeretnénk menteni, amiben a makró fut (mint az 1. példában), nem akarjuk a mentendő fájlt aktiválni (mint a 2. példában), nem a legutoljára megnyitott fájlt akarjuk menteni vagy egyáltalán, nem akarunk a fájlok sorrendjével foglalkozni (mint a 3. példában) és a fájl nevét sem akarjuk a programon belül lerögzíteni (mint a 4. példában)? Ez esetben változókkal érdemes a problémát kezelni.

Tegyük fel, hogy az előző lépésben megnyitottunk egy fájlt. Rögtön a megnyitás után tároljuk el a fájlt egy változóban (a lenti kódrészlet deklarációs sorát természetesen megejthetjük az eljárás elején, vagy akár az eljárásokon kívül eső területen is):

Dim munkafuzet As Workbook
Set munkafuzet = Workbooks(Workbooks.Count)

Aztán később, amikor menteni szeretnénk ezt a fájlt, egyszerűen csak hivatkozzunk a változóra:

munkafuzet.Save

Fontos még tudni, hogy amikor a Save metódust alkalmazzuk – hasonlóan ahhoz, mint amikor az Excel menüjéből vagy a mentés ikonra kattintva mentünk -, akkor kérdés nélkül felülírja a program a fájlt.

Fájl mentése új néven

Ez a művelet feltűnő hasonlóságot mutat az előző bejegyzésben taglalt fájlok megnyitásához.

Munkafüzetet új néven elmenteni a workbooks gyűjteményen alkalmazott SaveAs metódussal tudunk. A legfontosabb paraméter itt is a mentendő fájl nevét és elérési útvonalát tartalmazó FileName argumentum.

ActiveWorkbook.SaveAs FileName:="C:\Users\Felhasznalonev\Documents\Fajlnev.xlsx"

Amennyiben nem adjuk meg az elérési útvonalat, csak egy fájlnevet (pl. Fajlnev.xlsx), akkor az Excel abba a könyvtárba menti a fájlt, amelyik könyvtárban a makrót futtató fájl van (ún. “Current folder”-ben).

Mint az Open metódusnál, itt is számos paraméter megadására van lehetőség/szükség. Lássuk a leggyakrabban használatosokat.

  • FileFormat Ezzel az attribútummal határozhatjuk meg a mentendő fájl típusát. A két leggyakrabban használt formátum:
    • xlOpenXMLWorkbook → ez egy sztenderd “.xlsx” kiterjesztésű Excel fájl
    • xlOpenXMLWorkbookMacroEnabled  → ez pedig egy makrót is tartalmazó, “.xlsm” kiterjesztésű fájl.
      Arra figyelni kell, hogy az általunk a fájlnév részeként megadott kiterjesztés és a FileFormat összhangban legyen. Ha például egy “.xlsx” kiterjesztésű fájlt MacroEnabled munkafüzetként, vagy fordítva, egy “.xlsm” kiterjesztésű fájlt sima munkafüzetként szeretnénk menteni, akkor hibaüzenetet kapunk. Ha pedig egy makrót is tartalmazó fájlt “.xlsx” kiterjesztéssel és xlOpenXMLWorkbook formátummal mentünk, akkor mentéskor nem kapunk hibát, ám amikor újra megnyitjuk a fájlt és futtatnánk egy makrót, arról kapunk üzenetet, hogy a makró futtatása abban a fájlban nem lehetséges.

Cannot run the macro. The macro may not be available in this workbook or all macros may be disabled.

Amennyiben nem definiáljuk ezt a paramétert, akkor az Excel létező fájl esetén a jelenlegi formátumot változatlanul hagyja, új fájl esetén pedig sztenderd Excel munkafüzetként menti.

  • Password Ha itt megadunk egy jelszót, akkor a mentett fájl megnyitása csak a jelszó megadásával lehetséges. Ezzel azért bánjunk körültekintően, hiszen a jelszó a makró kódból simán kiolvasható. Ha jelszavakat akarunk a programon belül megadni, akkor mindenképp tanácsos a makrót tartalmazó fájlt és magát a VBA Projektet is jelszóval titkosítani. Ha pedig komolyan meg akarjuk védeni a fájlunkban lévő adatokat, akkor egy Office-tól független titkosítást javaslok…
  • WriteResPassword Az itt megadott jelszóval a fájl írását tudjuk levédeni, de ReadOnly módban minden további nélkül megnyitható a fájl.
  • ReadOnlyRecommended Amennyiben ezt az attribútumot True-ra állítjuk (alapbeállítás False), a fájl megnyitásakor egy párbeszédablak javasolni fogja a felhasználónak, hogy a fájlt read-only módban nyissa meg.

Excel Read-only recommended

  • AccessMode Ezzel állíthatjuk be, hogy a mentett fájl közös használatú legyen-e (xlShared), vagy nem (xlExclusive), vagy – egy már létező fájl esetén – ne változtasson jelenlegi beállításon (xlNoChange). Ha nem adunk meg semmit, akkor új fájl esetén exkluzív lesz a beállítás, létező fájl esetén pedig megtartja az addigi beállítást.
  • ConflictResolution Amennyiben egy közös használatú fájlt mentünk a makrónkkal, és konfliktus van (vagyis egy adott cellát én is módosítottam és egy másik felhasználó is, és a két módosítás nem egyezik) ezzel az attribútummal  határozhatjuk meg, hogy kinek a módosításait vegye az Excel a mentésnél figyelembe: a miénket (xlLocalSessionChanges), a másik felhasználóét (xlOtherSessionChanges), vagy párbeszédablakban kérdezzen rá (xlUserResolution). Ha nem definiáljuk ezt a paramétert, akkor a párbeszédablakos rákérdezés az alapértelmezett beállítás.

Mielőtt egy konkrét példával illusztrálnánk a fentieket, még két gondolat:

A SaveAs metódussal az eredetileg nyitva lévő fájlunk mentés nélkül lezárásra kerül és az új néven elmentett fájl marad nyitva. Vagyis ha van egy “egyes.xlsx” nevű fájlunk, amit SaveAs metódussal “kettes.xlsx” néven mentünk, akkor a művelet elvégzése után csak a “kettes.xlsx” fájlunk lesz nyitva. Amennyiben azt szeretnénk, hogy az eredeti fájlunk továbbra is nyitva maradjon és abban tovább tudjunk dolgozni, és erről a fájlról készüljön egy mentés, de az ne legyen megnyitva, akkor a SaveCopyAs metódust kell használni. Ennek a paraméterei és használata amúgy mindenben megegyezik a SaveAs metódusnál leírtakkal.

Ahogy a fájlok megnyitásánál, úgy a mentésnél is van arra lehetőségünk, hogy a mentendő fájl nevét és elérési útvonalát ne a programban definiáljuk, hanem egy böngészőablakból válasszuk ki. Ennek utasítása az Application.GetSaveAsFilename metódus lesz, és nem meglepő módon ugyanúgy használandó és ugyanúgy paraméterezhető, mint az előző bejegyzésemben kitárgyalt Application.GetOpenFilename metódus. Az egyedüli különbség, hogy többszörös kiválasztás mentéskor nem értelmezhető.

És akkor lássuk egy komplexebb példát.

Tegyük fel, hogy egy munka Excel fájlban dolgozunk hónapról hónapra, de az adott hónap végén az akkori állapotról szeretnénk egy mentést készíteni. A mentés legyen mindenki által olvasható, de módosítani csak jelszó birtokában lehessen. A fájl nevének megadására nyíljon egy böngészőablak, de ott ajánljon fel egy sztenderd nevet a mai dátummal. A név megadása kötelező legyen, ne lehessen a ‘Cancel’ gomb megnyomásával megszakítani a mentést.

A példa kedvéért a fent tárgyalt paraméterek közül azokat is megadjuk, amit amúgy alapbeállításon hagyunk.

Sub Masolat_mentese()

Dim AjanlottFajlNev As String
Dim MaiDatum        As String
Dim FajlNev         As Variant

    'Böngészőablakban felajánlott sztenderd név a mai dátummal
    AjanlottFajlNev = "Mentés "&Format(Date, "yyyymmdd")&".xlsm"

    'Böngészőablak megnyitása
    Do
        FajlNev = Application.GetSaveAsFilename _
                    (InitialFileName:=AjanlottFajlNev, _
                     FileFilter:="Macro-Enabled Workbook, *.xlsm")
    Loop Until FajlNev<>False
    'Addig nem zárja le az ablakot, amíg érvényes nevet nem adunk meg

    Application.DisplayAlerts = False 'Figyelmeztetések kikapcsolása

    ThisWorkbook.SaveCopyAs _
        Filename:=FajlNev, _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
        WriteResPassword:="Je.lsz^o", _
        ReadOnlyRecommended:=False, _
        AccessMode:=xlExclusive

    Application.DisplayAlerts = True 'Figyelmeztetések visszakapcsolása

End Sub

Néhány kiegészítő megjegyzés:

Az Application.GetSaveAsFilename metódusnál lehetőség van egy kezdeti név beállítására, ezt fogja az Excel a böngészőablakban felajánlani, és – amennyiben nem adunk meg más nevet, vagy nem választunk egy másik, már meglévő fájlt – ezen a néven fogja az állományt menteni.

Amennyiben SaveAs metódusnál egy már létező néven szeretnénk a fájlt elmenteni, akkor az Excel alapesetben figyelmeztet minket erre, mielőtt felülírná a fájlt. Ha nem szeretnénk, hogy ezzel megakassza a program futását, lehetőségünk van ennek, és más hasonló figyelmeztetéseknek a kikapcsolására. Erre szolgál az Application.DisplayAlerts metódus. Ezt célszerű mindig párban alkalmazni (kikapcsolni, majd vissza), illetve a visszakapcsolást a programunk hibakezelő szekciójába is beletenni. Ugyanis ha a programunkkal kikapcsoljuk a figyelmeztetéseket, akkor azok a program lefutása után is kikapcsolva maradnak, nem állnak vissza alaphelyzetbe!

A következő bejegyzésben a  fájlok lezárásáról fogunk értekezni. Továbbra is várjuk kérdéseiket, észrevételeiket!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.