VBA GetObject - Hogyan kell használni a GetObject függvényt az Excel VBA-ban?

Excel VBA GETOBJECT függvény

Használhatjuk a GetObject függvényt a VBA-ban az MS Excel programban az ActiveX-objektumok eléréséhez az excel fájlból, majd az objektumot egy objektumváltozóhoz rendelhetjük. Az OLE (Objektum-összekapcsolás és beágyazás) vagy a COM (Összetett objektum-modul) technológia használatával bármilyen Microsoft-alkalmazás, például MS Word, MS Outlook, MS PowerPoint, Internet Explorer stb. Vezérlésére használhatjuk a VBA GETOBJECT funkciót.

Az objektum létrehozásához a CreateObject függvényt használjuk, a GETOBJECT függvény pedig visszaadja az objektum hivatkozását.

Szintaxis a GETOBJECT függvényhez

A GET OBJECT függvény a következő argumentumokkal rendelkezik:

  1. Útnév: Meg kell adnunk a lekérni kívánt objektumot tartalmazó fájl teljes elérési útját és nevét. Ez egy opcionális argumentum, valójában a GetObject függvény mindkét argumentuma opcionális, de ha az „elérési út” elhagyásra kerül, akkor a második „class” argumentumra van szükség.
  2. Osztály : Ez szintén opcionális argumentum, amint azt korábban is meghatároztuk. Ez elfogadja az objektum osztályát reprezentáló karakterláncot.

Az „appname.objecttype” szintaxist használjuk az „class” argumentum megadására.

  1. Appname: Meg kell adnunk az alkalmazás nevét, amely megadja az objektumot.
  2. Objektumtípus: Megadjuk a létrehozandó objektum osztályának típusát.

Példa az Excel VBA GETOBJECT függvényre

Tegyük fel, hogy van egy 3 táblázatot tartalmazó word dokumentum.

Írni akarunk egy VBA kódot, amely a dokumentum összes tábláját importálja az excel lapra. Ehhez a VBA CreateObject és GetObject függvényét kell használnunk.

A következő lépések lennének:

  • Hozzon létre egy excel fájlt, és mentse a fájlt .xlsm excel kiterjesztéssel (Excel Macro-Enabled Workbook), mivel a VBA kódot (makró) kell futtatnunk.
  • Nyissa meg az alapvető vizuális szerkesztőt egy gyorsbillentyűvel (Alt + F11), vagy használja az Excel programban a „Fejlesztő” lap „Kód” csoportjában található „Visual Basic” parancsot.
  • Kattintson duplán a „ThisWorkbook” elemre a VBA szerkesztő bal oldalán, és válassza a „Munkafüzet” lehetőséget a képernyő tetején látható listából.
  • Válassza a 'Megnyitás' lehetőséget a listából.
  • Most be kell írnunk a kódot e két sor közé.
  • Először deklaráljuk a változókat az objektumok (MS Word dokumentum és az MS Word alkalmazás objektum) és egy „String változó”, amely a dokumentum nevét tárolja, ahonnan a táblákat ki kell nyernünk.
  • A hibakezeléshez hozzáadunk egy állítást. Ez az utasítás azt mondja a VBA programnak, hogy hagyja figyelmen kívül a hibát, és folytassa a végrehajtást a következő kódsorral. Az „On Error Resume Next” utasítás nem javítja a futásidejű hibákat, hanem egyszerűen azt jelenti, hogy a program végrehajtása a hibát okozó sort követő sorból folytatódik.
  • Most a GetObject függvény segítségével fogunk hozzáférni a Word Application Object aktuális példányához.
  • Ha nincs az MS Word alkalmazás aktuális példánya, vagy az ActiveX összetevő nem tud objektumot létrehozni, vagy nem adhat vissza hivatkozást erre az objektumra, akkor a 429. hiba jelenik meg. Ehhez két sort írunk a kódba. A hiba kezelése után létre kell hoznunk az MS Word Application objektum egy példányát a CreateObject függvény segítségével .
  • Ahhoz, hogy a MS Word alkalmazás látható, mi fog változni a látható tulajdonsága az „WdApp” objektumot IGAZ .
  • Meg kell találnunk a helyét és a fájl nevét a word dokumentum, amelyből szeretnénk importálni a táblákat egy Excel táblázatot, és rendelheti ugyanazt a „strDocName” Ahhoz, hogy megtalálja a nevét és helyét, és nézd meg a tulajdonságait a fájl.

A "Tulajdonságok" párbeszédpanel megnyitásához csak válassza ki a fájlt, és nyomja meg az "Alt + Enter" billentyűt.

  • Ha a fájl nem létezik a megadott helyen, akkor a kód a következő üzenetet adja vissza: „A fájl jelölési adatai nem találhatók a mappa elérési útjában.” A címe „Sajnáljuk, hogy a dokumentum neve nem létezik.”
  • Most aktiválnunk kell az MS Word alkalmazást, és hozzárendeljük a „wddoc” változót a dokumentum szóhoz, amelynek fájlneve az „strDocName” fájlban van tárolva .
  • Ha a fájl még nincs megnyitva, akkor meg kell nyitnunk a dokumentumot és aktiválnunk kell az alkalmazást.
  • A dokumentum szó aktiválása után hozzáférnünk kell a dokumentum tábláihoz. Ehhez létrehozunk néhány változót.

A Tble az az egész változó, amely a táblák számát tárolja a dokumentumban.

A rowWd a hosszú változó, amely tárolja a sorok számát egy adott táblázatban.

A colWd a hosszú változó, amely az oszlopok számát tárolja egy adott táblázatban.

  • Meg kell számolnunk a dokumentumban szereplő táblák számát, és ha van ilyen figyelemre méltó a dokumentumban, akkor megjelenítünk egy üzenetmezőt a felhasználó számára, hogy „Nincsenek táblázatok a Word dokumentumban”.
  • A dokumentumban található táblák eléréséhez és a tartalom beírásához az excel lapba egy "For" VBA ciklust futtatunk, számos táblázatot, és ezen a VBA cikluson belül beágyazott "for" ciklusokat futtatunk minden sor eléréséhez és a sor minden oszlopát.
  • Mivel nem akarjuk elmenteni a dokumentumot és kilépni az alkalmazásból. Fel kell szabadítanunk a rendszer memóriáját is. Ehhez írjuk a következő kódot.

Now, whenever we open the excel file, the fill is updated with table content from the word document.

Code:

Private Sub Workbook_Open() Rem Declaring Object variables to access object created by GETOBJECT Dim WdApp As Object, wddoc As Object Rem Declaring a string variable to access the Word document Dim strDocName As String Rem Error handling On Error Resume Next Rem Activating MS Word if it is already opened Set WdApp = GetObject(, "Word.Application") If Err.Number = 429 Then Err.Clear Rem Creating a Word application object if MS Word is not already opened Set WdApp = CreateObject("Word.Application") End If WdApp.Visible = True strDocName = "C:UsersCBA7_01DesktopMarks Details.docx" Rem Checking relevant directory for the relevant document Rem If not found then informing the user and closing the program If Dir(strDocName) = "" Then MsgBox "The file " & strDocName & vbCrLf & "was not found in the folder path" & vbCrLf & "C:UsersCBA7_01.", _vbExclamation, "Sorry, that document name does not exist." Exit Sub End If WdApp.Activate Set wddoc = WdApp.Documents(strDocName) If wddoc Is Nothing Then Set wddoc = WdApp.Documents.Open("C:UsersCBA7_01DesktopMarks Details.docx") wddoc.Activate Rem Defining variables to access the tables in the word document Dim Tble As Integer Dim rowWd As Long Dim colWd As Integer Dim x As Long, y As Long x = 1 y = 1 With wddoc Tble = wddoc.Tables.Count If Tble = 0 Then MsgBox "No Tables found in the Word document", vbExclamation, "No Tables to Import" Exit Sub End If Rem Starting the looping process to access tables and their rows, columns For i = 1 To Tble With.Tables(i) For rowWd = 1 To .Rows.Count For colWd = 1 To .Columns.Count Cells(x, y) = WorksheetFunction.Clean(.cell(rowWd, colWd).Range.Text) Rem Accessing next column y = y + 1 Next colWd Rem Going to next row and start from column 1 y = 1 x = x + 1 Next rowWd End With Next End With Rem we do not need to save the word document wddoc.Close Savechanges:=False Rem we quit MS Word application WdApp.Quit Rem We finally release system memory allocated for the 2 object variables Set wddoc = Nothing Set WdApp = Nothing End Sub

Dolgok, amikre emlékezni kell

  1. Van néhány egypéldányos objektum, amelyhez az objektumból csak egy példány jön létre, függetlenül attól, hogy hány számot futtat a CreateObject. A GetObject függvény mindig ugyanazt a példányt adja vissza, amikor nulla hosszúságú karakterlánccal hívják meg, és hiba lép fel, ha a "pathname" argumentumot nem említik.
  2. Nem használhatjuk a GetObject-et egy VBA-val létrehozott osztály hivatkozásának eléréséhez.
  3. Ha abban az esetben nincs aktív példánya az MS Word alkalmazásnak, vagy nem akarjuk, hogy az objektum már betöltött fájllal induljon, akkor először a CreateObject függvény segítségével hozzuk létre az objektumot, majd a GetObject függvény segítségével érjük el az objektumot. .

érdekes cikkek...