VBA GetObject - Jak korzystać z funkcji GetObject w Excel VBA?

Funkcja Excel VBA GETOBJECT

Możemy użyć funkcji GetObject w VBA w MS Excel, aby uzyskać dostęp do obiektu ActiveX z pliku Excel, a następnie przypisać obiekt do zmiennej obiektu. Aby użyć technologii OLE (Object Linking and Embedding) lub COM (Compound Object Module) do sterowania dowolną aplikacją Microsoft, taką jak MS Word, MS Outlook, MS PowerPoint i Internet Explorer, itp., Możemy użyć funkcji VBA GETOBJECT.

Do tworzenia obiektu używamy funkcji CreateObject, a funkcja GETOBJECT zwraca odniesienie do obiektu.

Składnia funkcji GETOBJECT

Funkcja GET OBJECT ma następujące nazwane argumenty:

  1. Nazwa ścieżki : musimy określić pełną ścieżkę i nazwę pliku zawierającego obiekt do pobrania. Jest to argument opcjonalny, w rzeczywistości oba argumenty funkcji GetObject są opcjonalne, ale jeśli pominięto „pathname”, wymagany jest drugi argument „class”.
  2. Klasa : jest to również opcjonalny argument, jak określono wcześniej również. Akceptuje ciąg znaków reprezentujący klasę obiektu.

Używamy składni „appname.objecttype”, aby określić argument „class”.

  1. Nazwa aplikacji: Musimy określić nazwę aplikacji, która dostarczy obiekt.
  2. Typ obiektu: określamy typ klasy obiektu do utworzenia.

Przykład funkcji Excel VBA GETOBJECT

Załóżmy, że mamy dokument tekstowy zawierający 3 tabele.

Chcemy napisać kod VBA, który zaimportuje wszystkie tabele w dokumencie do arkusza Excela. Aby zrobić to samo, będziemy musieli użyć funkcji CreateObject i GetObject w VBA.

Kroki byłyby następujące:

  • Utwórz plik programu Excel i zapisz go z rozszerzeniem .xlsm excel (skoroszyt programu Excel z obsługą makr), ponieważ będziemy musieli uruchomić kod VBA (makro).
  • Otwórz podstawowy edytor wizualny za pomocą klawisza skrótu (Alt + F11) lub za pomocą polecenia „Visual Basic” w grupie „Kod” w zakładce „Deweloper” w programie Excel.
  • Kliknij dwukrotnie „ThisWorkbook” po lewej stronie edytora VBA i wybierz „Workbook” z listy pokazanej w dalszej części ekranu u góry ekranu.
  • Wybierz „Otwórz” z listy.
  • Teraz musimy napisać kod pomiędzy tymi dwoma wierszami.
  • Najpierw zadeklarujemy zmienne do przechowywania obiektów (dokument MS Word i obiekt aplikacji MS Word) oraz „Zmienną ciągową”, która będzie przechowywać nazwę dokumentu, z którego musimy wyodrębnić tabele.
  • Do obsługi błędów dodamy jedną instrukcję. Ta instrukcja mówi programowi VBA, aby zignorował błąd i wznowił wykonywanie z następnym wierszem kodu. Instrukcja „On Error Resume Next” nie naprawia błędów wykonawczych, ale po prostu oznacza, że ​​program będzie kontynuowany od wiersza następującego po wierszu, który spowodował błąd.
  • Teraz użyjemy funkcji GetObject, aby uzyskać dostęp do bieżącego wystąpienia obiektu aplikacji Word.
  • Jeśli w przypadku, gdy nie ma bieżącej instancji aplikacji MS Word lub komponent ActiveX nie może utworzyć obiektu lub zwrócić odwołania do tego obiektu, to błąd 429. W tym celu dodamy poniżej dwie linie w kodzie. Po obsłużeniu błędu musimy stworzyć instancję obiektu MS Word Application za pomocą funkcji CreateObject .
  • Aby aplikacja MS Word była widoczna, zmienimy widoczną właściwość obiektu „WdApp” na TRUE .
  • Musimy znaleźć lokalizację i nazwę pliku dokumentu tekstowego, z którego chcemy importować tabele w arkuszu Excel i przydzielić tego samego do „strDocName” Aby znaleźć nazwę i lokalizację, a my możemy sprawdzić właściwości Spośród plik.

Aby otworzyć okno dialogowe „Właściwości” , po prostu wybierz plik i naciśnij „Alt + Enter”.

  • Jeśli plik nie istnieje w określonej lokalizacji, kod zwraca komunikat informujący, że w ścieżce folderu nie znaleziono pliku Marks Details. Tytuł brzmiałby: „Przepraszamy, ta nazwa dokumentu nie istnieje”.
  • Teraz musimy aktywować aplikację MS Word i przypisać zmiennej „wddoc” dokument Word o nazwie pliku zapisanej w „strDocName”.
  • Jeśli plik nie jest jeszcze otwarty, musimy otworzyć dokument i aktywować aplikację.
  • Po aktywacji dokumentu Word musimy uzyskać dostęp do tabel w dokumencie. Aby zrobić to samo, utworzymy kilka zmiennych.

Tble to zmienna całkowita, która będzie przechowywać liczbę tabel w dokumencie.

rowWd to długa zmienna, która będzie przechowywać liczbę wierszy w określonej tabeli.

colWd to długa zmienna, która będzie przechowywać liczbę kolumn w określonej tabeli.

  • Musimy policzyć liczbę tabel w dokumencie, a jeśli w dokumencie jest coś ważnego, wyświetlimy użytkownikowi okno komunikatu „Nie znaleziono tabel w dokumencie programu Word”.
  • Aby uzyskać dostęp do tabel w dokumencie i zapisać zawartość w arkuszu programu Excel, uruchomimy pętlę VBA „For” dla wielu tabel, aw ramach tej pętli VBA uruchomimy zagnieżdżone pętle „for” umożliwiające dostęp do każdego wiersza i każdą kolumnę w rzędzie.
  • Ponieważ nie chcemy zapisywać dokumentu i wychodzić z aplikacji. Powinniśmy również zwolnić pamięć systemu. Aby zrobić to samo, napiszemy następujący kod.

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

Rzeczy do zapamiętania

  1. Istnieje obiekt o pojedynczej instancji, dla którego generowana jest tylko jedna instancja obiektu, niezależnie od liczby, dla której uruchamiany jest CreateObject. Funkcja GetObject zawsze zwraca to samo wystąpienie, gdy jest wywoływana z łańcuchem o zerowej długości, a jeśli nie podano argumentu „pathname”, pojawia się błąd.
  2. Nie możemy użyć GetObject, aby uzyskać dostęp do odwołania do klasy utworzonej za pomocą VBA.
  3. Jeśli w przypadku, gdy nie ma aktywnej instancji aplikacji MS Word lub nie chcemy, aby obiekt został zainicjowany z już załadowanym plikiem, to najpierw używamy funkcji CreateObject do utworzenia obiektu, a następnie korzystamy z funkcji GetObject, aby uzyskać dostęp do obiektu .

Interesujące artykuły...