Különféle fájlok egyesítése, adattartalmuk egybemásolása elég gyakran felmerülő igény az Office különféle moduljaiban és ez nincs másként a Wordben sem. Így egy olvasói kérdés kicsit kibővített válaszában egy olyan kis VBA-makrót készítünk, amely gombnyomásra összemásolja különböző WORD dokumentumok tartalmát egyetlen fájlba.
Szóval adott egy folder, azon belül pedig ez a két példafájl:
Mindkettő csak teljesen véletlenszerűen generált tartalommal van tele, de értelemszerűen ez a megoldás független a fájlok tartalmától:
Csak a példa kedvéért legyen valahol máshol egy fájlunk, amelyben lesz egy gomb, ami majd elindítja a másolási folyamat - persze ez csak kizárólag ebben a posztban lesz így, amúgy kitehetünk a Ribbonra is egy gombot, akár indítással futtatható makrót is készíthetünk, a lényeg, hogy valamilyen módon indítsuk el a programot:
Szépen lépjünk át a VBA-editorba és a gombhoz hozzárendelt makrót elkezdjük felépíteni, elsőként a változók deklarálásával. Szükségünk lesz három változóra és egy konstans értékre, kell egy változó a fájlnév és elérési út tárolására (File As String), egy változó az új dokumentum létrehozásához (Doc As Document) és egy változó a tartalom begyűjtésére a különböző fájlokból (rng As Range). A konstans értékünk az a folder lesz, ahonnan összesítjük a fájlokat, de ezt roppant egyszerű módon átalakíthatjuk arra is, hogy manuálisan választhassuk ki a foldert, de úgy is a kód átalakításával, hogy a fájlokat választhassuk ki egyesével.
Private Sub CommandButton1_Click()
Dim rng As Range
Dim Doc As Document
Dim File As String
Const Folder = "C:\"
Ezután a Doc változónkat meghatározzuk mint egy Documents.Add metódus, ami jelen esetünkben a Normál WORD template alapján megnyit és létrehoz egy teljesen új WORD-fájlt.
Set Doc = Documents.Add
A File változónk meghatározása előtt a DIR funkcióval kell megismerkednünk, ami egy speciális funkció VBA-ban, ugyanis ez egy olyan Stringet ad nekünk vissza, ami egy fájl nevét, elérési útvonalát jelenti - és ezt hangsúlyozni kell, hogy kizárólag a nevét, elérési útvonalát, mert egyéb attributumok begyűjtéséhez a FileObjectSystemet kell használunk.
File = Dir$(Folder & "*.docx")
Szintaxisa szerint a DIR első paramétereként az elérési utat adjuk meg, ami jelen esetben látszik is, hogy a folder, amit konstansként fentebb megadtunk, majd hozzáfűzve a docx kiterjesztés - azért használunk * karaktert, mert a fájl neve nem, csak a kiterjesztése érdekel minket. És hogy mi a $ jel? Ha ezt írjuk a DIR mögé, akkor biztosan Stringet ad vissza a funkció, ha nem írunk semmit, akkor egyértelműen Variant adattípust. Ilyen karakter például még a %, ami Integert ad vissza, az &, ami Longot és így tovább. Szóval ez jelen esetünkben simán el is hagyható egyébként.
Ezután pedig jön jóbarátunk a Do...Loop utasítás, amely szintaxisa szerint egészen addig ismétel egy vagy több utasítást, amíg a megadott feltételek fennállnak.
Jelen esetünkben például egészen addig másolgassa össze a fájlokat, amíg a folderben van .docx kiterjesztésű dokumentum:
Do Until File = ""
És mit csináljon? Fogja meg az üres, előbb létrehozott új fájlt, a Range.Collapse metódus wdCollapseEnd paramétere segítségével ugorjon a benne esetlegesen lévő tartalom végére, majd a Range.InsertFile metódus segítségével szúrja be ide a ciklusban aktuális kiválasztott fájl tartalmát. Ezután pedig tegye üressé ismét a File változót.
Set rng = Doc.Range
rng.Collapse wdCollapseEnd
rng.InsertFile Folder & File
File = Dir$()
Ezek után már csak egy dolog maradt hátra, méghozzá a Do...Loop utasítás lezárása a Looppal (esetleg egy MsgBox az eredménnyel).
Loop
MsgBox ("Kész!")
End Sub