Thẻ: Outlook

Cách lấy bảng trong mail Outlook ra Excel bằng VBA

Trong bài viết này, Thanh sẽ chia sẻ tới các bạn cách trích xuất bảng trong thư của Outlook ra Excel sử dụng VBA. Đối với nội dung này, bạn cần kiến thức VBA cơ bản từ hai khóa học VBA của Thanh là VBA101VBA201. Chúng ta sẽ đi giải thích từng đoạn code, sau đó cuối bài sẽ có toàn bộ code được sử dụng trong ví dụ và một video cho các bạn xem và theo dõi.

Một số thiết lập trước khi bắt đầu

Phân tích vấn đề

Để nắm được vấn đề cần giải quyết, chúng ta hãy tóm tắt lại vấn đề như sau. Outlook là một chương trình đọc Mail trong bộ Office của Microsoft, vậy nên sự tương tác qua lại giữa các phần mềm Microsoft là rất tốt, như mình đã nói trong bài viết mới về cách mình sử dụng VBA. Do đó, muốn trích xuất bảng trong các email của Outlook sau đó ghi dữ liệu ra Excel thì cũng rất khả thi. Giả sử chúng ta có một Email trông như sau:

Lấy bảng outlook ra Excel

Trong hình ảnh trên, bạn có thể nhìn thấy Email của chúng ta nằm trong thư mục Inbox, trong Email có 2 bảng với nội dung khác nhau. Ở đây, các bạn có thể nhìn thấy các bảng này có cấu trúc gần giống nhau. Với ví dụ này, các bảng trong Email của bạn không nhất thiết cần có cấu trúc giống nhau.

Thiết lập VBA trong Excel

Chúng ta sẽ sử dụng Outlook Object Libray và HTML Object Library trong bài này, do đó, trong giao diện của Visual Basic for Applications, chúng ta bấm vào Menu Tools, chọn References … sau đó đánh dấu tick chọn vào 2 mục

  1. Microsoft Outlook Object Library
  2. Microsoft HTML Object Library

Lấy bảng outlook ra Excel

Sau khi thiết lập xong, chúng ta sẽ cần tạo 1 Module mới để chứa Code VBA. Nếu chưa biết bắt đầu với VBA như thế nào, bạn hãy tham khảo bài viết Bắt đầu với VBA của mình.

Lấy bảng outlook ra Excel

Lấy dữ liệu bảng trong thư của Outlook ra Excel

Khai báo email sẽ sử dụng

Đầu tiên, chúng ta sẽ đi khai báo email sẽ sử dụng bằng đoạn code

Const myMail As String = "<thay email của bạn vào đây>"

Khai báo các đối tượng của Outlook

' Early Binding
    Dim oApp As Outlook.Application
    Dim oMapi As Outlook.MAPIFolder
    Dim oMail As Outlook.MailItem

Khởi độ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 các mailitem trong “inbox”

Nếu bạn sử dụng thư mục khác thì hãy thay thế vào inbox


    Set oMapi = oApp.GetNamespace("MAPI").Folders(myMail).Folders("inbox")
    Set oMail = oMapi.Items(oMapi.Items.Count)

Khai báo các đối tượng HTML


    Dim html As MSHTML.HTMLDocument
    Set html = New MSHTML.HTMLDocument
    Dim htmlNodes As MSHTML.IHTMLElementCollection

Lấy ra bảng trong HTML


    With html
        .Body.innerHTML = oMail.HTMLBody
        Set htmlNodes = .getElementsByTagName("table") ' bang trong mail
    End With

Lặp qua các bảng, các ô trong bảng và lấy dữ liệu về 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

Dọn dẹp các đối tượng sau khi code chạy xong


    Set oApp = Nothing
    Set oMapi = Nothing
    Set oMail = Nothing
    Set html = Nothing
    Set htmlNodes = Nothing

Toàn bộ code cho bài viết này


Option Explicit

Sub importOutlookTableToExcel()

    Const myMail As String = ""
    
    ' Early Binding
    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("")
    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") ' bang trong mail
    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

Video hướng dẫn tách bảng trong thư Outlook đổ dữ liệu vào Excel

Và tất nhiên, không thể thiếu được, là video hướng dẫn dành cho các bạn. Hãy tham khảo thêm những khóa học VBA của mình.

YouTube video