Trong thế giới ngày càng phát triển của công nghệ thông tin, việc thu thập dữ liệu từ các trang web trở thành một nhu cầu quan trọng đối với nhiều doanh nghiệp, nhà nghiên cứu và cá nhân. Excel, với tính linh hoạt và sức mạnh trong việc xử lý dữ liệu, thường được chọn làm công cụ chính để lưu trữ và phân tích dữ liệu này. Tuy nhiên, việc trích xuất dữ liệu thủ công từ trình duyệt vào bảng tính là một công việc tốn thời gian và dễ gây sai sót. Để giải quyết vấn đề này, chúng ta có thể tận dụng sức mạnh của VBA (Visual Basic for Applications) để tự động kéo dữ liệu từ trang web vào Excel một cách nhanh chóng và chính xác.
Có thể bạn quan tâm: Ứng Dụng Của Microsoft Excel Trong Hóa Học Phân Tích
1. Tại sao cần tự động kéo dữ liệu từ website vào Excel?
- Tiết kiệm thời gian: So với việc sao chép dán thủ công, quá trình tự động hóa hoàn toàn giúp giảm thiểu thời gian nhập liệu đáng kể.
- Đảm bảo độ chính xác: Khi dữ liệu được lấy theo quy trình chuẩn, rủi ro sai sót do con người sẽ giảm thiểu.
- Quản lý dữ liệu liên tục: Dữ liệu có thể được cập nhật định kỳ, giúp các bảng tính luôn phản ánh thực tế.
- Tích hợp dữ liệu từ nhiều nguồn: VBA có levi khả năng kết nối tới nhiều nguồn dữ liệu khác nhau (web, cơ sở dữ liệu, API) và thống hợp chúng trong một workbook.
Có thể bạn quan tâm: Thêm Số 0 Phía Trước Số Trong Excel: Hướng Dẫn Chi Tiết Và Các Phương Pháp Thực Tiễn
2. Yêu cầu trước khi bắt đầu
- Excel 2026 trở lên (hoặc bất kỳ phiên bản nào hỗ trợ VBA).
- Kết nối Internet ổn định: Để truy cập dữ liệu từ web.
- Thư viện Microsoft HTML Object Library: Được bật trong VBA để phân tích và thao tác HTML.
- Thư viện Microsoft XML, v6.0 (hoặc phiên bản phù hợp): Để gửi và nhận yêu cầu HTTP.
- Quyền truy cập বিচ trang web: Đảm bảo bạn có quyền truy cập và lấy dữ liệu từ trang web mục tiêu.
Có thể bạn quan tâm: A Excel Phần Mềm Kế Toán Doanh Nghiệp: Giải Pháp Hiệu Quả Cho Quản Lý Tài Chính
3. Các bước thực hiện
3.1 Bật các thư viện cần thiết
Mở cửa sổ VBA (ALT + F11) → Tools → References → tích vào:
- Microsoft HTML Object Library
- Microsoft XML, v6.0 (hoặc v4.0, v3.0 tùy phiên bản)
3.2 Tạo một mô-đun (Module)
Trong cửa sổ Project Explorer, nhấp chuột phải vào tên workbook → Insert → Module. Đặt tên mô-đun là ModuleWebScraper.
3.3 Viết hàm lấy dữ liệu
Dưới đây là một ví dụ cơ bản để lấy nội dung của một bảng HTML từ trang web:
Option Explicit ' Hàm lấy HTML từ URL
Private Function GetHTML(ByVal url As String) As MSHTML.HTMLDocument Dim httpReq As MSXML2.XMLHTTP60 Set httpReq = New MSXML2.XMLHTTP60 httpReq.Open "GET", url, False httpReq.send If httpReq.Status <> 200 Then MsgBox "Lỗi khi tải trang: " & httpReq.Status & " " & httpReq.StatusText, vbCritical Exit Function End If Dim htmlDoc As MSHTML.HTMLDocument Set htmlDoc = New MSHTML.HTMLDocument htmlDoc.body.innerHTML = httpReq.responseText Set GetHTML = htmlDoc
End Function ' Hàm као trích xuất dữ liệu từ bảng
Public Sub PullTableData() Dim url As String url = "https://example.com/data" ' Thay bằng URL thực tế Dim html As MSHTML.HTMLDocument Set html = GetHTML(url) Dim tbl As MSHTML.HTMLTable Set tbl = html.getElementsByTagName("table")(0) ' Giả sử bảng đầu tiên Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' Đổi tên sheet nếu cần ws.Cells.ClearContents Dim r As Long, c As Long For r = 0 To tbl.Rows.Length - 1 For c = 0 To tbl.Rows(r).Cells.Length - 1 ws.Cells(r + 1, c + 1).Value = tbl.Rows(r).Cells(c).innerText Next c Next r MsgBox "Hoàn thành! Dữ liệu đã được đưa vào bảng tính.", vbInformation
End Sub
Giải thích chi tiết:
- GetHTML: Gửi một yêu cầu GET tới URL, nhận dữ liệu HTML và trả về một đối tượng
HTMLDocument. - PullTableData: Gọi
GetHTML, lấy bảng đầu tiên, và sao chép nội dung vào sheetSheet1. Bạn có thể tùy chỉnh chỉ số bảng, tên sheet, hoặc xử lý dữ liệu hơn.
3.4 Xử lý dữ liệu động và AJAX
Nhiều trang web hiện thời sử dụng AJAX để tải dữ liệu sau khi trang đã được tải. Để lấy dữ liệu từ những trang này, bạn cần:
- Xác định URL của dịch vụ API: Thường là một URL trả về JSON hoặc XML. Bạn có thể dùng DevTools (F12) → Network để xem các request.
- Gửi request tới API: Sử dụng
XMLHTTP60để lấy dữ liệu JSON. - Phân tích JSON ontwikkeling: Sử dụng
ScriptControlhoặcJSONConverter(có thể import từ GitHub) để chuyển JSON thành object.
Ví dụ lấy dữ liệu JSON:
Public Sub PullJSONData() Dim url As String url = "https://api.example.com/data?format=json" Dim httpReq As MSXML2.XMLHTTP60 Set httpReq = New MSXML2.XMLHTTP60 httpReq.Open "GET", url, False httpReq.send If httpReq.Status <> 200 Then MsgBox "Error: " & httpReq.Status, vbCritical Exit Sub End If Dim jsonText As String jsonText = httpReq.responseText ' Giả sử bạn đã có JSONConverter Dim json As Object Set json = JsonConverter.ParseJson(jsonText) Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("JSONData") ws.Cells.ClearContents Dim i As Long For i = 1 To json.Count ws.Cells(i, 1).Value = json(i)("id") ws.Cells(i, 2).Value = json(i)("name") ws.Cells(i, 3).Value = json(i)("value") Next i MsgBox "Data fetched from JSON API."
End Sub
3.5 Xử lý đăng nhập và cookie
Nếu trang web yêu cầu đăng nhập,вод:
- Gửi POST request với tài khoản và mật khẩu.
- Lưu trữ cookie từ phản hồi.
- Sử dụng cookie্চ trong các yêu cầu tiếp theo.
Ví dụ:
Public Sub LoginAndPull() Dim urlLogin As String urlLogin = "https://example.com/login" Dim http As MSXML2.XMLHTTP60 Set http = New MSXML2.XMLHTTP60 http.Open "POST", urlLogin, False http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" http.send "username=demo&password=demo123" If http.Status <> 200 Then MsgBox "Login failed!", vbCritical Exit Sub End If Dim cookie As String cookie = http.getResponseHeader("Set-Cookie") ' Tiếp tục request với cookie Dim urlData As String urlData = "https://example.com/protected/data" Dim httpData As MSXML2.XMLHTTP60 Set httpData = New MSXML2.XMLHTTP60 httpData.Open "GET", urlData, False httpData.setRequestHeader "Cookie", cookie httpData.send ' Xử lý dữ liệu như thường ' ...
End Sub
4. Tối ưu hoá và quản lý̈
4.1 Quản lý thời gian thực thi
- Disable ScreenUpdating: Tăng tốc độ khi làm việc với nhiều ô.
- Disable Calculation: Tạm dừng tính toán tự động trong Excel khi thao tác dữ liệu lớn.
- Enable Events: Bật ī sự kiện khi hoàn thành.
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' ... code ...
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
4.2 Xử lý lỗi

Có thể bạn quan tâm: Cách Gắn Ảnh Thư Vị (attach A Picture To A Cell) Trong Excel: Hướng Dẫn Chi Tiết
- Sử dụng
On Error GoTo ErrorHandlerđể bắt lỗi và thông báo người dùng. - Đăng log lỗi vào một sheet riêng để phân tích sau.
4.3 Lưu trữ dữ liệu
- Table (ListObject): Tạo bảng trong Excel để dễ dàng áp dụng filter, pivot.
- Định dạng ngày/giờ: Đảm bảo dữ liệu ngày được lưu dưới dạng
Datetrong Excel.
4.4 Tự động cập nhật
- Workbook_Open hoặc OnTime: Đặt macro chạy định kỳ (ví dụ, mỗi 30 phút) để tự động cập nhật dữ liệu.
Public Sub ScheduleRefresh() Application.OnTime Now + TimeValue("00:30:00"), "PullTableData"
End Sub
5. Ví dụ Compile: Tự động lấy dữ liệu tỷ giá USD/EUR
Giả sử bạn muốn lấy tỷ giá từ trang https:// conozrate.com.
Public Sub GetExchangeRate() Dim url As String url = "https://www.x-rates.com/table/?from=USD&to=EUR&amount=1" Dim html As MSHTML.HTMLDocument Set html = GetHTML(url) Dim table As MSHTML.HTMLTable Set table = html.getElementsByTagName("table")(0) ' Bảng tỷ giá Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Exchange") ws.Cells.ClearContents Dim r As Long, c As Long For r = 0 To table.Rows.Length - 1 For c = 0 To table.Rows(r).Cells.Length - 1 ws.Cells(r + 1, c + 1).Value = table.Rows(r).Cells(c).innerText Next c Next r MsgBox "Tỷ giá đã được cập nhật!"
End Sub
6. Thực hành nâng’ok
6.1 Trích xuất dữ liệu từ trang có pagination
- Xác định số trang: Tìm phần tử chứa số trang hoặc thẻ “next”.
- Lặp qua từng trang: Gửi yêu cầu với tham số
page=2,page=3, Sexe.
6.2 Lưu trữ dữ liệu vào database
- Sau khi lấy dữ liệu, bạn có thể lưu vào
AccesshoặcSQL ServerbằngADODB.Connection.
6.3 Bảo mật
- Không lưu trữ mật khẩu trong mã nguồn: Sử dụng biến môi trường hoặc file encrypted.
- Xử lý HTTPS: Đảm bảo
XMLHTTP60sử dụngSSL.
7. Thử nghiệm và khắc phục
- Thẻ HTML thay đổi: Khi trang web cập nhật, thẻ
tablehoặcclasscó thể thay đổi. Hãy kiểm tra lại DOM. - Chặn bởi robots.txt: Một số trang web ngăn chặn truy cập tự động. Kiểm tra tính hợp pháp và cân nhắc sử dụng API chính thức.
- Giới hạn tốc độ: Tránh gửi quá nhiều yêu cầu trong thời gian ngắn. Thêm
SleephoặcApplication.Wait.
8. Kết luận
Tự động kéo dữ liệu từ website vào Excel bằng VBA không chỉ giúp tiết kiệm thời gian mà còn nâng cao độ chính xác và tính nhất quán của dữ liệu. Bằng cách kết hợp các công cụ cơ bản như XMLHTTP, HTMLDocument, và JSONConverter, bạn có thể xử lý đa dạng các nguồn dữ liệu, từ bảng HTML đơn giản đến API trả về JSON phức tạp. Mặc dù có thể gặp phải một số khó khăn như thay đổi cấu trúc HTML, chặn truy cập tự động header, hoặc vấn đề bảo mật, nhưng với một kế hoạch tùy chỉnh và kỹ thuật xử lý lỗi thích hợp, bạn hoàn toàn có thể xây dựng một hệ thống tự động tin cậy, linh hoạt, và mở rộng.
Hãy bắt đầu thử nghiệm Plugins, xây dựng macro và biến Excel thành một công cụ dữ liệu mạnh mẽ, giúp bạn tập trung vào việc phân tích và đưa ra quyết định thực tiễn hơn, thay vì phải lo lắng về việc nhập dữ liệu thủ công. Happy coding!

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
