Nikolas đã phát triển một truy vấn Web để truy xuất dữ liệu bên ngoài một cách thường xuyên. Vấn đề là anh ấy thường xuyên nhận được thông báo lỗi “Không thể mở trang web …​” khi chạy truy vấn Web. Thông báo này xuất hiện khi có một số gián đoạn kết nối Internet giữa Nikolas và máy chủ Web và anh ta cần nhấp vào OK trên thông báo lỗi để Excel tiếp tục.

Điều này cho thấy một vấn đề khi Nikolas không có máy tính của anh ấy vì nó có thể có nghĩa là truy vấn Web không thu thập tất cả dữ liệu đáng lẽ phải kiên nhẫn chờ đợi nút OK được nhấp khi nó gặp sự cố. Nikolas muốn một cách để thông báo cho truy vấn Web không hiển thị thông báo và chỉ cần quay lại chờ nếu nó không thể kết nối trong lần thử hiện tại.

Thật không may, không có cách nào để yêu cầu Excel làm những gì bạn muốn. Khi thông báo “Không thể mở trang web …​” xuất hiện, hầu như không thể chặn thông báo. Giải pháp duy nhất là cố gắng tạo một macro hoạt động xung quanh vấn đề. Ví dụ: bạn có thể phát triển một macro tạo một phiên bản của Internet Explorer (không có vấn đề) để kiểm tra lỗi khi truy cập trang Web.

Macro sau đây thực hiện phương pháp này.

Option Explicit 'Declare Sleep API Private Declare Sub Sleep Lib "kernel32" (ByVal nMilliseconds As Long)



Function GetData(strStartURL As String) As String     Dim Attempt As Long     Dim Connected As Boolean     Dim ieDocNew As MSHTML.HTMLDocument

GetData = "N/A"

Attempt = 0

retry:

Attempt = Attempt + 1

'Create browser object references and open an IE window     Dim ieNew As New InternetExplorer     'Load page     With ieNew         .Visible = True       'show window         .navigate strStartURL 'open page         While Not .readyState = READYSTATE_COMPLETE             Sleep 500         'wait 1/2 sec before trying again         Wend     End With

'The page should be open in IE, time for parsing     'Create document object model references     Set ieDocNew = ieNew.Document

If ieDocNew.Scripts.Length = 13 _       And ieNew.LocationName = "Microsoft Excel Tips" _       Then         Connected = True         GetData = "Data successfully captured"



'This is where you do something with the data     End If

'Clean up IE objects     Set ieDocNew = Nothing     ieNew.Quit     Set ieNew = Nothing     DoEvents     If Attempt < 10 And Not Connected Then GoTo retry End Function

Lưu ý rằng macro này yêu cầu một số cấu hình trong giao diện VBA để hoạt động đúng cách. Cụ thể, bạn cần chọn Tham chiếu từ menu Công cụ và đảm bảo rằng dự án bao gồm các tham chiếu đến Thư viện đối tượng HTML của Microsoft và Microsoft Internet Controls.

Những gì macro làm là sử dụng IE để kết nối với URL được chuyển đến hàm (trong strStartURL) và sau đó lấy nội dung được tìm thấy ở đó.

Nếu kết nối thành công, thì Connected được đặt thành True và bạn có thể phân tích cú pháp và sử dụng dữ liệu tại trang web. Hàm, như đã viết, trả lại “Dữ liệu đã được thu thập thành công” cho quy trình gọi, nhưng bạn có thể dễ dàng trả lại một số giá trị đã lấy từ trang web từ xa. Giá trị đó sau đó có thể được nhồi, nhưng quy trình gọi, vào một trang tính.

Cũng lưu ý rằng hàm thực hiện một số phân tích cú pháp thô sơ trên trang mà nó nắm bắt và chỉ coi kết nối thành công nếu nó tìm thấy một số từ ngữ mong đợi trong tiêu đề trang được tìm thấy tại URL.

Để biết cách hoạt động của macro, hãy sử dụng một số macro như sau:

Sub TEST_GetData1()

MsgBox GetData("http://excel.tips.net")

End Sub
Sub TEST_GetData2()

MsgBox GetData("http://excel.tipsxx.net")

End Sub
Sub TEST_GetData3()

MsgBox GetData("http://excel.tips.net/junk")

End Sub

Cái đầu tiên sẽ hoạt động; hai thứ hai sẽ hiển thị một thông báo cho biết “Không có”.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (10525) áp dụng cho Microsoft Excel 2007 và 2010.