Tự động hóa Internet Explorer (IE) bằng VBA

Trang này chứa các ví dụ mã hóa để tự động hóa Internet Explorer (IE) bằng VBA.

** Cập nhật 6/7/2019: Hiện tại, cách tốt nhất để đạt được tự động hóa web với VBA là sử dụng Selenium. Bài viết này KHÔNG đề cập đến Selenium. Các ví dụ dưới đây sẽ hoạt động và có thể đủ cho nhu cầu của bạn. Tuy nhiên, nếu bạn có nhu cầu nâng cao hơn hoặc muốn trở thành chuyên gia về tự động hóa web, tôi thực sự khuyên bạn nên sử dụng Selenium để thay thế. Khóa học của Dan Strong về Tự động hóa web (giảm giá có sẵn qua liên kết này) là một tài nguyên tuyệt vời để học Selenium:

(Tôi nhận được Ủy ban liên kết từ khóa học của Dan)

Điều hướng đến một trang web bằng VBA

Đoạn mã đầu tiên mở IE và điều hướng đến một trang web. Đoạn mã thứ hai mở IE, điều hướng đến một trang web và tương tác với một hộp nhập liệu.

12345678910111213141516171819202122232425262728293031323334353637 Sub Automate_IE_Load_Page ()'Điều này sẽ tải một trang web trong IEDim i As LongLàm mờ URL dưới dạng chuỗiLàm mờ IE dưới dạng đối tượngDim objElement As ObjectDim objCollection As Object'Tạo Đối tượng InternetExplorerĐặt IE = CreateObject ("InternetExplorer.Application")'Đặt IE.Vible = True để hiển thị IE, hoặc False để IE chạy trong nềnIE.Vible = True'Xác định URLURL = "https://www.automateexcel.com/excel/"'Điều hướng đến URLURL IE.Navigate'Thanh trạng thái cho người dùng biết trang web đang tảiApplication.StatusBar = URL & "đang tải. Vui lòng đợi…"'Chờ trong khi tải IE …' IE ReadyState = 4 cho biết trang web đã được tải (vòng lặp đầu tiên được thiết lập để tránh vô tình bỏ qua vòng lặp thứ hai)Do While IE.ReadyState = 4: DoEvents: Loop 'Do WhileDo Until IE.ReadyState = 4: DoEvents: Loop 'Do Until'Trang web đã được tảiApplication.StatusBar = URL & "Đã tải"'Dỡ IEĐặt IE = Không có gìĐặt objElement = Không có gìĐặt objCollection = Không có gìKết thúc Sub

Một vấn đề rất phổ biến mà mọi người gặp phải khi làm việc với IE trong VBA là VBA cố gắng chạy mã trước khi Internet Explorer được tải đầy đủ. Bằng cách sử dụng mã này, bạn yêu cầu VBA lặp lại một vòng lặp cho đến khi IE sẵn sàng (IE.ReadyState - 4).

1234 'Chờ trong khi tải IE …' IE ReadyState = 4 cho biết trang web đã được tải (vòng lặp đầu tiên được thiết lập để tránh vô tình bỏ qua vòng lặp thứ hai)Do While IE.ReadyState = 4: DoEvents: Loop 'Do WhileDo Until IE.ReadyState = 4: DoEvents: Loop 'Do Until

Ngoài ra, hãy lưu ý dòng mã này:

1 IE.Vible = TRUE

Mã này chuyển đổi việc IE chạy ở chế độ nền hay ở chế độ nền trước.

Mở URL và nhập dữ liệu vào biểu mẫu bằng VBA

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 'Điều này phải ở đầu mô-đun của bạn. Nó được sử dụng để đặt IE làm cửa sổ hoạt độngChức năng khai báo công khai SetForegroundWindow Lib "user32" (ByVal HWND As Long)Sub Automate_IE_Enter_Data ()'Điều này sẽ tải một trang web trong IEDim i As LongLàm mờ URL dưới dạng chuỗiLàm mờ IE dưới dạng đối tượngDim objElement As ObjectDim objCollection As ObjectDim HWNDSrc As Long'Tạo Đối tượng InternetExplorerĐặt IE = CreateObject ("InternetExplorer.Application")'Đặt IE.Vible = True để hiển thị IE, hoặc False để IE chạy trong nềnIE.Vible = True'Xác định URLURL = "https://www.automateexcel.com/vba"'Điều hướng đến URLURL IE.Navigate'Thanh trạng thái cho người dùng biết trang web đang tảiApplication.StatusBar = URL & "đang tải. Vui lòng đợi…"'Chờ khi đang tải IE…' IE ReadyState = 4 cho biết trang web đã được tải (vòng lặp đầu tiên được thiết lập để tránh vô tình bỏ qua vòng lặp thứ hai)Làm trong khi IE.ReadyState = 4: DoEvents: Vòng lặpDo Until IE.ReadyState = 4: DoEvents: Loop'Trang web đã được tảiApplication.StatusBar = URL & "Đã tải"'Nhận Window ID cho IE để chúng tôi có thể đặt nó làm cửa sổ kích hoạtHWNDSrc = IE.HWND'Đặt IE làm Cửa sổ Hoạt độngSetForegroundWindow HWNDSrc'Tìm & Điền vào Hộp nhập liệun = 0Đối với từng itm Trong IE.document.allIf itm = "[object HTMLInputElement]" Thìn = n + 1Nếu n = 3 Thìitm.Value = "trang tính"itm.Focus 'Kích hoạt hộp Nhập (làm cho con trỏ xuất hiện)Application.SendKeys "{w}", True 'Mô phỏng phím' W '. True bảo VBA đợi'cho đến khi quá trình gõ phím kết thúc trước khi tiếp tục, cho phép'javascript trên trang để chạy và lọc bảngGoTo endmacroKết thúc nếuKết thúc nếuKế tiếp'Dỡ IEendmacro:Đặt IE = Không có gìĐặt objElement = Không có gìĐặt objCollection = Không có gìKết thúc Sub

GetElement trong IE bằng VBA

Tương tác với các đối tượng trong Internet Explorer thường có thể là một vấn đề khó khăn. Bạn cần xác định đối tượng cụ thể để làm việc. Trong đoạn mã trên, chúng ta đang tìm kiếm phiên bản thứ 3 của “[object HTMLInputElement]” (một biểu mẫu đầu vào). Sau đó, chúng tôi nhập “orksheet” vào biểu mẫu đầu vào (itm.value = “orksheet”), di chuyển con trỏ vào biểu mẫu đầu vào (itm.focus) và nhập “w”. Nhập “w” là cần thiết trong trường hợp này để kích hoạt javascript được sử dụng để lọc bảng.

Có nhiều phương pháp trực tiếp hơn để chọn đối tượng, tuy nhiên phương pháp này sẽ hoạt động nếu vẫn thất bại.

Để sử dụng các phương pháp khác, bạn sẽ muốn sử dụng các tùy chọn sau:

1234 IE.document.getelementbyid ("ID"). Value = "value" 'Tìm theo IDIE.document.getelementsbytagname ("ID"). Value = "value" 'Tìm theo thẻIE.document.getelementsbyclassname ("ID"). Value = "value" 'Tìm theo lớpIE.document.getelementsbyname ("ID"). Value = "value" 'Tìm theo tên

Bạn có thể gặp sự cố khi sử dụng các phương pháp này nếu có nhiều phần tử trùng tên. Bằng cách sử dụng một vòng lặp (như trong đoạn mã mẫu ở trên), bạn có thể chỉ định phiên bản của phần tử sẽ sử dụng.

Tương tác với IE bằng VBA

Trong đoạn mã trên, chúng tôi sử dụng sự kiện: Tiêu điểm (itm.focus) để kích hoạt con trỏ trong biểu mẫu.

Bạn có thể tìm thêm các ví dụ về Sự kiện, Phương thức và Thuộc tính Đối tượng / Phần tử tại đây: https://msdn.microsoft.com/en-us/library/ms535893(v=vs.85).aspx

Không phải tất cả những thứ này đều hoạt động với mọi đối tượng / phần tử và có thể có khá nhiều thử nghiệm và lỗi khi tương tác với các đối tượng trong IE.

Sendkey cho Internet Explorer

Chúng tôi đã sử dụng lệnh Sendkeys trong đoạn mã trên:

1 Application.SendKeys "{w}", Đúng

Sendkey nói chung nên là phương sách cuối cùng. Bạn thường có thể tương tác trực tiếp với các đối tượng, tuy nhiên, đôi khi bạn chỉ cần sử dụng lệnh Sendkeys sẽ dễ dàng hơn. Sendkeys về cơ bản giống như gõ bằng bàn phím. Bạn cần đảm bảo chọn đúng cửa sổ và đối tượng trước khi tiếp tục. Sendkey cũng có thể kích hoạt các sự kiện chạy dựa trên tương tác của người dùng trên web. Trong ví dụ trên, chúng tôi sử dụng Sendkeys để kích hoạt bộ lọc Javascript trong Bảng mà chúng tôi sử dụng trên trang web.

Sendkeys có hai đầu vào:
1. phím để nhập (thường được bao quanh bởi {}… {enter}, {q}….)
2. Chờ cho đến khi Sendkeys hoàn tất trước khi tiếp tục TRUE / FALSE. Nói chung, bạn sẽ muốn bộ này thành TRUE khi làm việc với Internet Explorer.

Chạy Internet Explorer trong nền

Để chạy Internet Explorer ở chế độ nền, bạn cần thực hiện hai việc:

1. Gọi macro chứa mã IE bằng Application.Run để macro chạy ẩn khi bạn tiếp tục làm việc:

1 Application.Run ("Automate_IE_Load_Page")

Lưu ý: Mã này có thể làm gián đoạn công việc của bạn hoặc công việc của bạn có thể ảnh hưởng đến mã. Ví dụ: nếu bạn sử dụng SendKeys, Sendkeys có thể gửi một tổ hợp phím đến ứng dụng sai. Hãy rất cẩn thận với điều này.
2. Ẩn IE:

1 IE.Vible = Sai

Selenium & VBA

Nếu bạn thấy bài viết này hữu ích, bạn có thể muốn xem khóa học của Dan Strong về Tự động hóa web. Nó bao gồm cách sử dụng Selenium với VBA.

(Tôi nhận được Ủy ban liên kết từ khóa học của Dan)

Lời chứng thực từ một trong những học sinh của Dan

https://excelvbaisfun.com/wp-content/uploads/2019/06/dan_strong_complete_web_automation_course_review_VbFn2vwul8A_1080p.mp4

Bạn sẽ giúp sự phát triển của trang web, chia sẻ trang web với bạn bè

wave wave wave wave wave