Excel VBA GETOBJECT-funktion
Vi kan använda GetObject-funktionen i VBA i MS Excel för att komma åt ett ActiveX-objekt från excel-filen och sedan tilldela objektet till en objektvariabel. För att använda OLE (Object Linking and Embedding) eller COM (Compound Object Module) -teknologi för att styra alla Microsoft-applikationer som MS Word, MS Outlook, MS PowerPoint och Internet Explorer etc. kan vi använda VBA GETOBJECT-funktionen.
Vi använder CreateObject-funktionen för att skapa objektet och GETOBJECT-funktionen returnerar referensen till objektet.
Syntax för GETOBJECT-funktion
GET OBJECT-funktionen har dessa namngivna argument:
- Sökväg: Vi måste ange hela sökvägen och namnet på filen som innehåller objektet som ska hämtas. Detta är ett valfritt argument, i själva verket är båda argumenten i GetObject-funktionen valfria men om 'sökväg' utelämnas krävs det andra argumentet 'klass'.
- Klass : Detta är också ett valfritt argument som tidigare angivits. Detta accepterar en sträng som representerar objektets klass.
Vi använder syntaxen 'appname.objecttype' för att specificera 'class' argument.
- Appnamn: Vi måste ange applikationsnamnet som ger objektet.
- Objektyp: Vi anger typen av objektklass som ska skapas.
Exempel på Excel VBA GETOBJECT-funktion
Du kan ladda ner denna VBA GetObject-mall här - VBA GetObject-mallAntag att vi har ett orddokument som innehåller tre tabeller.
Vi vill skriva en VBA-kod som importerar alla tabeller i dokumentet till excel-arket. För att göra detsamma måste vi använda CreateObject och GetObject-funktionen i VBA.
Stegen skulle vara:
- Skapa en excel-fil och spara filen med .xlsm excel-tillägget (Excel Macro-Enabled Workbook) eftersom vi måste köra VBA-koden (ett makro).
- Öppna den visuella grundredigeraren med en snabbtangent (Alt + F11) eller använd kommandot 'Visual Basic' i gruppen 'Kod' i fliken 'Utvecklare' i Excel.
- Dubbelklicka på 'ThisWorkbook' till vänster i VBA-redigeraren och välj 'Workbook' från listan som visas därefter högst upp på skärmen.
- Välj 'Öppna' i listan.
- Nu måste vi skriva koden mellan dessa två rader.
- Först kommer vi att förklara variabler för att hålla objekten (MS Word-dokument och MS Word-applikationsobjekt) och en 'Strängvariabel' för att hålla namnet på dokumentet varifrån vi behöver extrahera tabellerna.
- För felhantering lägger vi till ett uttalande, detta uttalande säger till VBA-programmet att ignorera felet och återuppta körningen med nästa kodrad. Uttrycket "On Error Resume Next" fixar inte runtime-felen men det betyder helt enkelt att programkörningen fortsätter från raden som följer raden som orsakade felet.
- Nu kommer vi att använda GetObject-funktionen för att få tillgång till den aktuella instansen av Word Application Object.
- Om det inte finns någon aktuell instans av MS Word-applikationen eller kan ActiveX-komponenten inte skapa ett objekt eller returnera referens till detta objekt då fel 429. För detta lägger vi till nedan två rader i koden. Efter att ha hanterat felet måste vi skapa en instans av MS Word Application-objektet med funktionen CreateObject .
- För att göra MS Word-applikationen synlig ändrar vi den synliga egenskapen för 'WdApp'- objektet till SANT .
- Vi måste hitta platsen och filnamnet på orddokumentet från vilket vi vill importera tabellerna till ett excel-ark och tilldela detsamma till "strDocName". För att hitta namn och plats kan vi kolla in filens egenskaper .
För att öppna dialogrutan 'Egenskaper' , välj bara filen och tryck på 'Alt + Enter' .
- Om filen inte finns på den angivna platsen returnerar koden meddelandet om att "Filen märker detaljer hittades inte i mappvägen". Titeln skulle vara "Tyvärr, det dokumentnamnet finns inte."
- Nu måste vi aktivera MS Word-applikationen och tilldela variabeln 'wddoc' med orddokumentet med filnamnet lagrat i 'strDocName' .
- Om filen inte redan har öppnats måste vi öppna dokumentet och aktivera appen.
- Efter att ha aktiverat orddokumentet måste vi komma åt tabellerna i dokumentet. För att göra detsamma skapar vi några variabler.
Tble är heltalsvariabeln, som lagrar antalet tabeller i dokumentet.
rowWd är den långa variabeln som lagrar antalet rader i en viss tabell.
colWd är den långa variabeln som lagrar antalet kolumner i en viss tabell.
- Vi måste räkna antalet tabeller i dokumentet och om det inte finns någon tabell i dokumentet kommer vi att visa en meddelandefält till användaren att "Inga tabeller hittades i Word-dokumentet" .
- För att komma åt tabeller i dokumentet och för att skriva innehållet i excel-arket, kommer vi att köra en "För" VBA-loop för ett antal tabeller gånger och inom denna VBA-loop kommer vi att köra nestade "för" loopar för åtkomst till varje rad varje kolumn i raden.
- Eftersom vi inte vill spara dokumentet och avsluta programmet. Vi bör också frigöra systemets minne. För att göra detsamma skriver vi följande kod.
Nu när vi öppnar excel-filen uppdateras fyllningen med tabellinnehåll från orddokumentet.
Koda:
Private Sub Workbook_Open () Rem Declaring Object variables to access object created by GETOBJECT Dim WdApp As Object, wddoc As Object Rem Deklarerar en strängvariabel för att komma åt Word-dokument Dim strDocName Som sträng Rem Felhantering Vid fel Återuppta nästa rem Aktivera MS Word har redan öppnats Set WdApp = GetObject (, "Word.Application") If Err.Number = 429 Then Err.Clear Rem Skapa ett Word-applikationsobjekt om MS Word inte redan har öppnats Set WdApp = CreateObject ("Word.Application") End Om WdApp.Visible = True strDocName = "C: \ Users \ CBA7_01 \ Desktop \ Marks Details.docx" Rem Kontrollera relevant katalog för relevant dokument Rem Om det inte hittas ska du informera användaren och stänga programmet If Dir (strDocName) = " "Sedan MsgBox" Filen "& strDocName & vbCrLf &"hittades inte i mappvägen "& vbCrLf &" C: \ Users \ CBA7_01 \. ", _vbExclamation," Tyvärr finns det inte namnet på dokumentet. "Avsluta underavslutning om WdApp.Activate Set wddoc = WdApp.Documents (strDocName ) Om wddoc inte är något, ange sedan wddoc = WdApp.Documents.Open ("C: \ Users \ CBA7_01 \ Desktop \ Marks Details.docx") wddoc.Activate Rem Definiera variabler för att komma åt tabellerna i orddokumentet Dim Tble As Integer Dim radWd så lång dimma colWd som heltal Dim x så lång, y så lång x = 1 y = 1 med wddoc Tble = wddoc.Tables.Count Om Tble = 0 Då MsgBox "Inga tabeller hittades i Word-dokumentet", vbExclamation, "No Tabeller för att importera "Avsluta undre slut om rem Startar loopningsprocessen för att komma åt tabeller och deras rader, kolumner För i = 1 Att tabla med. Tabeller (i) För radWd = 1 Till .Rows.Count För colWd = 1 Till .Kolumner.Räkna celler (x, y) = WorksheetFunction.Clean (.cell (rowWd, colWd) .Range.Text) Rem Åtkomst till nästa kolumn y = y + 1 Nästa colWd Rem Gå till nästa rad och börja från kolumn 1 y = 1 x = x + 1 Nästa radWd End With Next End With Rem behöver vi inte spara orddokumentet wddoc.Stäng Savechanges: = False Rem vi avslutar MS Word-applikationen WdApp.Quit Rem Vi släpper äntligen systemminnet tilldelat för de 2 objektvariablerna Ställ in wddoc = Nothing Set WdApp = Nothing End SubAvsluta rem Vi släpper äntligen systemminnet som tilldelats för de två objektvariablerna Set wddoc = Nothing Set WdApp = Nothing End SubAvsluta rem Vi släpper äntligen systemminnet som tilldelats för de 2 objektvariablerna Set wddoc = Nothing Set WdApp = Nothing End Sub
Saker att komma ihåg
- Det finns något enstaka objekt, för vilket endast en instans av objektet genereras, oavsett antalet som CreateObject körs för. GetObject-funktionen returnerar hela tiden samma instans när den anropas med en sträng med noll längd och ett fel kommer om argumentet 'sökväg' inte nämns.
- Vi kan inte använda GetObject för att komma åt en referens till en klass skapad med VBA.
- Om det i fallet inte finns någon aktiv instans av MS Word-applikationen, eller om vi inte vill att objektet ska initieras med en fil redan laddad, använder vi först funktionen CreateObject för att skapa objektet och använder sedan GetObject-funktionen för att komma åt objektet.