Kihasználva a hétvégét, tovább folytatom elmaradásom feldolgozását, már ami az olvasói kérdéseket illeti és ezúttal egy nagyobb fába vágom a fejszémet, mert az Excel-kérdések egyikének megválaszolása nem is egy posztot fel felölelni, hiszen én több részre osztottam a megoldást - a kérdés önállóan is kezelhető első része egyébként a kedves írónak nem okozott gondot, de hátha másnak is szüksége lehet ilyesmire, így kezdjük ezzel a kifejtést.
Szóval a kérdés ezen része olyasmi, amelyre nem VBA-s megoldást már kínáltam korábbi posztokban (például a command promptból indítható dir parancs vagy a böngészős Select All Content segítségével), de most azt nézzük meg, hogy makróval hogy tudjuk kilistázni egy adott könyvtárunk tartalmát. Célunk tehát ennek a kis táblának az automatikus kitöltése:
Ahogy mindig, most is hangsúlyozni kell, hogy ez csak egy a lehetséges megoldások közül, szóval továbbra is nyitott vagyok más javaslatokra/ötletekre.
Rövid VBA-kódunk 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 értsük a szintaxist, érdemes megjegyezni, hogy a FileSystemObject a Microsoft Scripting Runtime Libraryben található dll-ként.
Visszatérve a mostani kérdéskörhöz, lépjünk be a Visual Basic Editorba, majd hozzunk létre négy változót, hármat objektumként, egyet pedig integer típussal:
FSO a fentebb már említett FileSystemObject objektum, amelyet azért hozunk mindjárt létre, hogy hozzáférjünk a fájlrendszerhez, a Folder és File változók értelemszerűen könyvtár és fájl objektumok tárolására szolgálnak majd, i változónkra pedig a ciklushoz lesz majd szükségünk.
Ha megvannak a változók, akkor állítsuk be, hozzuk létre a FileSystemObject objektumot:
Set FSO = CreateObject("Scripting.FileSystemObject")
Majd a Folder objektumot is állítsuk be arra a könyvtárra, ahol listázni akarunk, ehhez a FileSystemObject objektum GetFolder metódusát használjuk, amely mindig objektumként adja vissza nekünk azt a foldert, amely a megadott elérési úton található:
Set Folder = FSO.GetFolder("c:\")
Ezzel konkrétan már a folderben vagyunk, most jön a ciklusunk, amely egyesével végigmegy a folderben lévő fájlokon és azok nevét egymást követő cellákba írja be.
Miután van fejlécünk, kezdjük alapból az i = 1 értékkel, de mint látni fogjuk ez lehetne 0 de akár 2 is, attól függően hova akarjuk tenni az értéklistát.
A ciklushoz a már jópár alkalommal bemutatott és megismert For Each...Next utasítást fogjuk felhasználni, azaz ha magyarra átfordítva fogalmazzuk meg a kódunkat, akkor minden egyes fájlunk esetén (For Each File) a fentebb definiált folderünk összes fájlja között (in Folder.files), fájlonként haladva az első oszlopunk második cellája (Cells(i + 1, 2)) legyen egyenlő a fájl nevével (File.Name), a második oszlopunk második cellája (Cells(i + 1,2)) pedig legyen egyenlő a fájl elérési útjával (File.Path). Ha ez megvan, akkor ugorjon a következő sorra, azaz i értékét növeljük meg eggyel (i = i + 1).
i = 1
For Each File In Folder.files
Cells(i + 1, 1) = File.Name
Cells(i + 1, 2) = File.Path
i = i + 1
Next File
Vegyük észre, hogy File objektumunknak minden tulajdonságához hozzáférünk, így a nevéhez, elérési útjához is, de ezen analógia mentén férünk hozzá a létrehozási dátumához, utolsó megnyitási időpontjához vagy akár méretéhez is.
Ha ez megvan, akkor meg is van a kódunk, innentől kezdve pedig gombhoz rendelhetjük, vagy ahogy majd én is tenni fogom, egy nagyobb kód első részeként fogjuk felhasználni.
Kódunk szövegként:
Sub Listazo()
Dim FSO As Object
Dim Folder As Object
Dim File As Object
Dim i As Integer
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("c:\")
i = 1
For Each File In Folder.files
Cells(i + 1, 1) = File.Name
Cells(i + 1, 2) = File.Path
i = i + 1
Next File
End Sub