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 ta sử dụng hàm CreateObject để tạo đối tượng và hàm GETOBJECT trả về tham chiếu cho đố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. Tên đường dẫn: 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 bỏ qua "tên đường dẫn", 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

Bạn có thể tải Mẫu VBA GetObject này tại đây - Mẫu VBA GetObject

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ã VBA sẽ nhập tất cả các bảng trong tài liệu vào trang tính excel. Để làm 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 cơ bản trực quan 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' ở phía bên trái của trình soạn thảo VBA và chọn 'Workbook' từ danh sách được 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 cho 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 mà 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 sau dòng gây ra lỗi.

  • Bây giờ chúng ta sẽ sử dụng hàm 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 vào bên dưới hai dòng 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 ta cần tìm vị trí và tên tệp của tài liệu word mà từ đó chúng ta 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 ta có thể kiểm tra các thuộc tính của tệp. .

Để 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 không có bảng nào trong tài liệu thì chúng tôi sẽ hiển thị một 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 ta sẽ viết đoạn mã sau.

Bây giờ bất cứ khi nào chúng ta mở tệp excel, phần điền được cập nhật với nội dung bảng từ tài liệu word.

Mã:

Private Sub Workbook_Open () Rem Khai báo biến đối tượng để truy cập đối tượng được tạo bởi GETOBJECT Dim WdApp As Object, wddoc As Object Rem Khai báo một biến chuỗi để truy cập tài liệu Word Dim strDocName As String Rem Xử lý lỗi Khi tiếp tục Lỗi Tiếp theo Rem Kích hoạt MS Word nếu nó đã được mở Đặt WdApp = GetObject (, "Word.Application") Nếu Err.Number = 429 Sau đó Err.Clear Rem Tạo một đối tượng ứng dụng Word nếu MS Word chưa được mở Đặt WdApp = CreateObject ("Word.Application") Kết thúc If WdApp.Vible = True strDocName = "C: \ Users \ CBA7_01 \ Desktop \ Marks Details.docx" Rem Kiểm tra thư mục liên quan cho tài liệu liên quan Rem Nếu không tìm thấy thì thông báo cho người dùng và đóng chương trình If Dir (strDocName) = " "Sau đó MsgBox" Tệp "& strDocName & vbCrLf &"không tìm thấy trong đường dẫn thư mục "& vbCrLf &" C: \ Users \ CBA7_01 \. ", _vbExclamation," Xin lỗi, tên tài liệu đó không tồn tại. "Thoát Sub End Nếu WdApp.Activate Set wddoc = WdApp.Documents (strDocName ) If wddoc Is Nothing then Set wddoc = WdApp.Documents.Open ("C: \ Users \ CBA7_01 \ Desktop \ Marks Details.docx") wddoc Kích hoạt Rem Xác định các biến để truy cập các bảng trong tài liệu word Dim Tble As Integer Dim rowWd As Long Dim colWd As Integer Dim x As Long, y As Long x = 1 y = 1 Với wddoc Tble = wddoc.Tables.Count If Tble = 0 Sau đó MsgBox "Không tìm thấy bảng trong tài liệu Word", vbExclamation, "Không Các bảng cần nhập "Thoát Sub End If Rem Bắt đầu quá trình lặp để truy cập các bảng và các hàng, cột của chúng Đối với i = 1 Đến Tble Với. Bảng (i) Đối với rowWd = 1 Đến .Rows.Count Đối với colWd = 1 Đến .Columns.Đếm ô (x, y) = WorksheetFunction.Clean (.cell (rowWd, colWd) .Range.Text) Rem Truy cập cột tiếp theo y = y + 1 colWd tiếp theo Rem Chuyển đến hàng tiếp theo và bắt đầu từ cột 1 y = 1 x = x + 1 Next rowWd End Với Next End Với Rem chúng ta không cần lưu tài liệu từ wddoc nữa. Đóng Savechanges: = False Rem chúng ta thoát ứng dụng MS Word WdApp.Quit Rem Cuối cùng chúng ta giải phóng bộ nhớ hệ thống được cấp phát cho 2 biến đối tượng Đặt wddoc = Không có gì đặt WdApp = Không có gì kết thúc phụThoát Rem Cuối cùng chúng tôi cũng giải phóng bộ nhớ hệ thống được cấp phát cho 2 biến đối tượng Đặt wddoc = Không có gì Đặt WdApp = Không có gì Kết thúc SubThoát Rem Cuối cùng chúng tôi cũng giải phóng bộ nhớ hệ thống được cấp phát cho 2 biến đối tượng Đặt wddoc = Không có gì Đặt WdApp = Không có gì Kết thúc 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 ra, 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.

$config[zx-auto] not found$config[zx-overlay] not found