Office Guru

Word dokumentumokat egyesítő makrókezdemény

2017. április 30. - Office Guru

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:

w1_1.jpgMindkettő 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:

w2_1.jpgCsak 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:

w3_1.jpgSzé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

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr1412468527

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Gukker 2017.05.02. 16:23:47

A Beszúrás/Objektum/Szöveg fájlból... miért nem jó?

Office Guru 2017.07.01. 11:02:42

@Gukker: Teljesen jó az is, a fenti egyszerű esetben mindenképpen, viszont ha egy hosszabb folyamat egyik állomása ez a lépés, akkor mindenképpen jobb VBA-editorban bütykölni.
süti beállítások módosítása