Bạn muốn trích xuất dữ liệu từ bảng trong email Outlook sang Excel một cách tự động? Bài viết này sẽ hướng dẫn bạn cách thực hiện điều đó bằng VBA (Visual Basic for Applications), giúp tiết kiệm thời gian và công sức. Phương pháp này đặc biệt hữu ích khi bạn cần xử lý số lượng lớn email chứa bảng dữ liệu. Bạn cần có kiến thức VBA cơ bản để hiểu rõ code.
Minh họa email Outlook chứa bảng dữ liệu
Chuẩn bị trước khi bắt đầu
Phân tích vấn đề
Mục tiêu là trích xuất dữ liệu từ bảng trong email Outlook và đưa vào Excel. Do Outlook và Excel đều thuộc bộ Microsoft Office, việc tương tác giữa chúng rất thuận tiện nhờ VBA. Ví dụ, một email có thể chứa nhiều bảng với cấu trúc khác nhau, và chúng ta cần xử lý tất cả chúng.
Thiết lập VBA trong Excel
Trước tiên, cần kích hoạt hai thư viện hỗ trợ:
- Microsoft Outlook Object Library: Cung cấp các đối tượng và phương thức để tương tác với Outlook.
- Microsoft HTML Object Library: Xử lý nội dung HTML của email.
Để kích hoạt, trong VBA Editor (Alt + F11), vào Tools > References… và chọn hai thư viện trên.
Kích hoạt thư viện trong VBA Editor
Sau đó, tạo một module mới để viết code VBA.
Tạo module mới trong VBA Editor
Code VBA trích xuất dữ liệu
Khai báo địa chỉ email
Khai báo địa chỉ email cần trích xuất dữ liệu:
Const myMail As String = "<Địa chỉ email của bạn>"
Khai báo đối tượng Outlook
Khai báo các đối tượng Outlook cần sử dụng:
Dim oApp As Outlook.Application
Dim oMapi As Outlook.MAPIFolder
Dim oMail As Outlook.MailItem
Khởi động Outlook
Khởi động ứng dụng Outlook:
On Error Resume Next
Set oApp = GetObject(, "OUTLOOK.APPLICATION")
If (oApp Is Nothing) Then Set oApp = CreateObject("OUTLOOK.APPLICATION")
On Error GoTo 0
Lấy email từ hộp thư đến (“Inbox”)
Lấy email từ hộp thư đến. Nếu email nằm ở thư mục khác, hãy thay đổi "inbox"
thành tên thư mục tương ứng.
Set oMapi = oApp.GetNamespace("MAPI").Folders(myMail).Folders("inbox")
Set oMail = oMapi.Items(oMapi.Items.Count) ' Lấy email cuối cùng trong hộp thư đến
Khai báo đối tượng HTML
Khai báo các đối tượng để xử lý HTML:
Dim html As MSHTML.HTMLDocument
Set html = New MSHTML.HTMLDocument
Dim htmlNodes As MSHTML.IHTMLElementCollection
Trích xuất bảng từ HTML
Lấy nội dung HTML của email và trích xuất các bảng:
With html
.Body.innerHTML = oMail.HTMLBody
Set htmlNodes = .getElementsByTagName("table")
End With
Lấy dữ liệu và ghi vào Excel
Lặp qua từng bảng, từng hàng, từng ô và ghi dữ liệu vào Excel:
Dim x As Long, y As Long, i As Long, tblbStartRow As Long
For i = 0 To htmlNodes.Length - 1
tblbStartRow = (x + 1)
Range("A" & tblbStartRow).Value = "Table " & (i + 1)
For x = 0 To htmlNodes(i).Rows.Length - 1
For y = 0 To htmlNodes(i).Rows(x).Cells.Length - 1
Range("C1").Offset(x + tblbStartRow - 1, y).Value = htmlNodes(i).Rows(x).Cells(y).innerText
Next y
Next x
Next i
Ảnh gif minh họa VBA
Giải phóng đối tượng
Giải phóng các đối tượng sau khi sử dụng xong:
Set oApp = Nothing
Set oMapi = Nothing
Set oMail = Nothing
Set html = Nothing
Set htmlNodes = Nothing
Toàn bộ code VBA
Option Explicit
Sub importOutlookTableToExcel()
Const myMail As String = "<Địa chỉ email của bạn>"
Dim oApp As Outlook.Application
Dim oMapi As Outlook.MAPIFolder
Dim oMail As Outlook.MailItem
On Error Resume Next
Set oApp = GetObject(, "OUTLOOK.APPLICATION")
If (oApp Is Nothing) Then Set oApp = CreateObject("OUTLOOK.APPLICATION")
On Error GoTo 0
Set oMapi = oApp.GetNamespace("MAPI").Folders(myMail).Folders("inbox")
Set oMail = oMapi.Items(oMapi.Items.Count)
Dim html As MSHTML.HTMLDocument
Set html = New MSHTML.HTMLDocument
Dim htmlNodes As MSHTML.IHTMLElementCollection
With html
.Body.innerHTML = oMail.HTMLBody
Set htmlNodes = .getElementsByTagName("table")
End With
Dim x As Long, y As Long, i As Long, tblbStartRow As Long
For i = 0 To htmlNodes.Length - 1
tblbStartRow = (x + 1)
Range("A" & tblbStartRow).Value = "Table " & (i + 1)
For x = 0 To htmlNodes(i).Rows.Length - 1
For y = 0 To htmlNodes(i).Rows(x).Cells.Length - 1
Range("C1").Offset(x + tblbStartRow - 1, y).Value = htmlNodes(i).Rows(x).Cells(y).innerText
Next y
Next x
Next i
Set oApp = Nothing
Set oMapi = Nothing
Set oMail = Nothing
Set html = Nothing
Set htmlNodes = Nothing
End Sub
Kết luận
VBA cung cấp một giải pháp hiệu quả để trích xuất dữ liệu bảng từ email Outlook sang Excel. Hy vọng bài viết này giúp bạn tự động hóa công việc và tiết kiệm thời gian. Hãy tìm hiểu thêm về VBA để khai thác tối đa tiềm năng của nó.
Discussion about this post