VBA GetObject - Làm thế nào để sử dụng Hàm GetObject trong Excel VBA?

Hàm GETOBJECT VBA trong Excel

Chúng ta có thể sử dụng hàm GetObject trong VBA trong MS Excel để truy cập một đối tượng ActiveX từ tệp excel và sau đó gán đối tượng cho một biến đối tượng. Để sử dụng công nghệ OLE (Object Linking and Embedding) hoặc COM (Compound Object Module) để điều khiển bất kỳ ứng dụng nào của Microsoft như MS Word, MS Outlook, MS PowerPoint và Internet Explorer, v.v., chúng ta có thể sử dụng chức năng VBA GETOBJECT.

Chúng tôi sử dụng hàm CreateObject để tạo đối tượng và hàm GETOBJECT trả về tham chiếu đến đối tượng.

Cú pháp cho hàm GETOBJECT

Hàm GET OBJECT có các đối số được đặt tên sau:

  1. Pathname: Chúng ta cần xác định đường dẫn đầy đủ và tên của tệp chứa đối tượng cần lấy. Đây là một đối số tùy chọn, trên thực tế, cả hai đối số trong hàm GetObject đều là tùy chọn, nhưng nếu "tên đường dẫn" bị bỏ qua, thì đối số thứ hai là "class" là bắt buộc.
  2. Class : Đây cũng là một đối số tùy chọn như đã chỉ định trước đó. Điều này chấp nhận một chuỗi đại diện cho lớp của đối tượng.

Chúng tôi sử dụng cú pháp 'appname.objecttype' để chỉ định đối số 'class'.

  1. Tên ứng dụng : Chúng ta cần chỉ định tên ứng dụng, tên này sẽ cung cấp đối tượng.
  2. Kiểu đối tượng: Chúng ta chỉ định kiểu của lớp đối tượng cần tạo.

Ví dụ về Hàm VBA GETOBJECT trong Excel

Giả sử chúng ta có một tài liệu word chứa 3 bảng.

Chúng tôi muốn viết một mã VBA sẽ nhập tất cả các bảng trong tài liệu vào trang tính excel. Để làm điều tương tự, chúng ta sẽ cần sử dụng chức năng CreateObject và GetObject trong VBA.

Các bước sẽ là:

  • Tạo tệp excel và lưu tệp với phần mở rộng .xlsm excel (Excel Macro-Enabled Workbook) vì chúng ta sẽ cần chạy mã VBA (macro).
  • Mở trình chỉnh sửa trực quan cơ bản bằng phím tắt (Alt + F11) hoặc sử dụng lệnh 'Visual Basic' trong nhóm 'Mã' trong tab 'Nhà phát triển' trong excel.
  • Nhấp đúp vào 'ThisWorkbook' ở bên trái của trình soạn thảo VBA và chọn 'Workbook' từ danh sách hiển thị sau đó trên đầu màn hình.
  • Chọn 'Mở' từ danh sách.
  • Bây giờ chúng ta cần viết mã ở giữa hai dòng này.
  • Đầu tiên, chúng ta sẽ khai báo các biến để giữ các đối tượng (đối tượng Tài liệu MS Word và Ứng dụng MS Word) và một 'Biến chuỗi' để giữ tên của tài liệu từ nơi chúng ta cần trích xuất các bảng.
  • Để xử lý lỗi, chúng tôi sẽ thêm một câu lệnh. Câu lệnh này yêu cầu chương trình VBA bỏ qua lỗi và tiếp tục thực thi với dòng mã tiếp theo. Câu lệnh “On Error Resume Next” không sửa lỗi thời gian chạy, nhưng nó chỉ đơn giản có nghĩa là việc thực thi chương trình sẽ tiếp tục từ dòng tiếp theo dòng gây ra lỗi.
  • Bây giờ chúng ta sẽ sử dụng chức năng GetObject để truy cập vào phiên bản hiện tại của Đối tượng Ứng dụng Word.
  • Nếu trong trường hợp không có phiên bản hiện tại của Ứng dụng MS Word hoặc thành phần ActiveX không thể tạo một đối tượng hoặc trả về tham chiếu cho đối tượng này, thì lỗi 429. Đối với điều này, chúng tôi sẽ thêm hai dòng bên dưới trong mã. Sau khi xử lý lỗi, chúng ta cần tạo một thể hiện của đối tượng Ứng dụng MS Word bằng chức năng CreateObject .
  • Để hiển thị Ứng dụng MS Word, chúng tôi sẽ thay đổi thuộc tính hiển thị của đối tượng 'WdApp' thành TRUE .
  • Chúng tôi cần tìm vị trí và tên tệp của tài liệu word mà từ đó chúng tôi muốn nhập các bảng vào một trang tính excel và gán giống như vậy cho “strDocName”. Để tìm tên và vị trí, chúng tôi có thể kiểm tra các thuộc tính của tập tin.

Để mở hộp thoại 'Thuộc tính' , chỉ cần chọn tệp và nhấn 'Alt + Enter.'

  • Nếu tệp không tồn tại ở vị trí được chỉ định, thì mã trả về thông báo cho biết, “Không tìm thấy tệp Đánh dấu chi tiết trong đường dẫn thư mục”. Tiêu đề sẽ là "Xin lỗi, tên tài liệu đó không tồn tại."
  • Bây giờ chúng ta cần kích hoạt Ứng dụng MS Word và gán biến 'wddoc' với tài liệu word có tên tệp được lưu trữ trong 'strDocName.'
  • Nếu tệp chưa được mở, thì chúng ta cần mở tài liệu và kích hoạt ứng dụng.
  • Sau khi kích hoạt tài liệu word, chúng ta cần truy cập vào các bảng trong tài liệu. Để làm tương tự, chúng ta sẽ tạo một số biến.

Tble là biến số nguyên, sẽ lưu trữ số lượng bảng trong tài liệu.

rowWd là biến dài, sẽ lưu trữ số hàng trong một bảng cụ thể.

colWd là biến dài, sẽ lưu trữ số cột trong một bảng cụ thể.

  • Chúng tôi cần đếm số lượng bảng trong tài liệu và nếu có nội dung đáng chú ý trong tài liệu, thì chúng tôi sẽ hiển thị hộp thông báo cho người dùng rằng “Không tìm thấy bảng nào trong tài liệu Word”.
  • Để truy cập các bảng trong tài liệu và để viết nội dung trong trang tính excel, chúng tôi sẽ chạy vòng lặp VBA 'For' cho một số lần bảng và trong vòng lặp VBA này, chúng tôi sẽ chạy các vòng lặp 'for' lồng nhau để truy cập mọi hàng và mọi cột trong hàng.
  • Vì chúng tôi không muốn lưu tài liệu và thoát khỏi ứng dụng. Chúng ta cũng nên giải phóng bộ nhớ của hệ thống. Để làm tương tự, chúng tôi sẽ viết đoạn mã sau.

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

Những điều cần ghi nhớ

  1. Có một số đối tượng đơn thể hiện, mà chỉ một thể hiện của đối tượng được tạo, bất kể số mà CreateObject được chạy. Hàm GetObject luôn trả về cùng một trường hợp khi nó được gọi với một chuỗi có độ dài bằng 0 và lỗi xảy ra nếu đối số 'tên đường dẫn' không được đề cập.
  2. Chúng tôi không thể sử dụng GetObject để truy cập một tham chiếu đến một lớp được tạo bằng VBA.
  3. Nếu trong trường hợp, không có phiên bản nào đang hoạt động của Ứng dụng MS Word hoặc chúng tôi không muốn đối tượng được khởi tạo bằng tệp đã được tải, thì trước tiên chúng tôi sử dụng hàm CreateObject để tạo đối tượng và sau đó sử dụng hàm GetObject để truy cập đối tượng .

thú vị bài viết...