Újabb olvasói kérdés kerül feltérképezésre a következő posztban, méghozzá egy olyan, amelynek megoldása valószínűleg sokak számára segítség lenne, ha egyáltalán ilyen feladatok esetén felmerülne ötletként az automatizálás/nagyobb csomagban történő végrehajtás. A kérdés alapvetően VBA-ra irányul, méghozzá arra, hogy hogyan lehet Excelből egy bizonyos könyvtár összes üres alkönyvtárát törölni.
Mielőtt rátérnénk az Excelre, azért meg kell említeni, hogy van ennél egyszerűbb megoldás is, méghozzá a parancssor használata. Windows 7 esetében a Start menü keresőmezőjébe írjuk be, hogy cmd és nyissuk meg a parancssort, majd szimplán a következő paranccsal hajtsuk végre, amit szeretnénk:
robocopy c:\officeguru\proba c:\officeguru\proba /S /MOVE
Alapvetően a Robust File Copy nagy mennyiségű fájl mozgatásában segítene, de kihasználjuk azt a lehetőséget, hogy a /S paraméterrel ki tudjuk kapcsolni az üres folderek másolását - azaz az elsőként megadott könyvtárból a másodikként megadott könyvtárba (tehát konkrétan ugyanoda) másolja a nem üres foldereket. Ha pedig a /MOVE paramétert is hozzátesszük, akkor mozgatni fog a parancs, tehát nem másol - így látható, hogy hogyan fogjuk elérni a megfelelő eredményt.
Mindenesetre ettől függetlenül fókuszáljunk kedves Olvasónk kérdésére, azaz nézzük meg, hogy VBA-ban hogy oldjuk meg ezt a problémát.
Adott tehát három folder a proba mappánkban, ebből kettőben nincs semmi, egyben pedig van egy fájl. Értelemszerűen a két üres könyvtárat akarjuk törölni:
Első lépésként a VBA-editorba lépünk ALT+F11 billentyűkombinációval, majd nekilátunk a kódunknak, méghozzá a változók definiálásával. Rövid kódsorunk magját és legfontosabb elemét a FileSystemObject objektum adja, amely objektumalapú lehetőséget ad számunkra, hogy hozzáférjünk a számítógépünk fájlrendszeréhez. Egyszerűen csak létre kell hoznunk egy FileSystemObject objektumot VBA-ban a Scripting.FileSystemObject szintaxis segítségével, aztán már törölhetünk, beolvashatunk vagy akár létre is hozhatunk fájlokat. Hogy jól tudjuk használni a szintaxist, érdemes megjegyezni, hogy a FileSystemObject a Microsoft Scripting Runtime Libraryben található dll-ként.
Sub konyvtartorles()
Dim fso As Scripting.FileSystemObject
Dim fokonyvtar As Scripting.Folder
Dim alkonyvtar As Scripting.Folder
FSO a fentebb már említett FileSystemObject objektum, amelyet azért hozunk létre, hogy hozzáférjünk a fájlrendszerhez, majd be is állítjuk az FSO objektumot:
Set fso = New Scripting.FileSystemObject
"fokonyvtar" és "alkonyvtar" változóknak már a neve magáért beszél, hogy mire fog szolgálni, most szépen defináltuk őket folderként. Ezután defináljuk a főkönyvtárunk útvonalát:
fokonyvtarut = "C:\proba"
Majd beállítjuk a fokonyvtar változót a FileSystemObject.GetFolder metódus segítségével, amely metódus egy folder objektumot ad vissza eredményül.
Set fokonyvtar = fso.GetFolder(fokonyvtarut)
Ezután már csak egy For Each...Next ciklus van hátra, amelyben megnézzük, hogy a főkönyvtárunk összes alkönyvtára közül melyikben vannak fájlok és melyikben nincsenek, majd töröljük az üreseket. Hasonlóan a fokonyvtarhoz, definiáljuk a subfolderek eléséri útját is, majd a GetFolder metódussal hivatkozunk is erre az objektumra. Ezt azért a ciklus belsejében tesszük meg, mert a jelenlegi kódban egyetlen főkönyvtár van, de bármennyi alkönyvtár lehet.
For Each alkonyvtar In fokonyvtar.SubFolders
utvonal = fokonyvtarut & "\" & alkonyvtar.Name
Set alkonyvtar = fso.GetFolder(utvonal)
If alkonyvtar.Files.Count = 0 Then alkonyvtar.Delete
Next alkonyvtar
End Sub
Ahogy látható, a subfoldereken egyesével fogunk végigmenni és megvizsgáljuk, hogy vannak-e benne fájlok, mert ha nincsenek (.files.count = 0), akkor az adott alkönyvtárat törölni fogjuk. És így megyünk tovább.