Chào mọi người,
Dạo này mình đang phải làm việc với nhiều nguồn dữ liệu khác nhau, trong đó có cả Google Sheets. Mình muốn tìm cách để dữ liệu trong file Excel của mình luôn được cập nhật tự động từ Google Sheets mà không cần phải ngồi tải về hay dùng Power Query (vì đôi khi Power Query hơi chậm hoặc phức tạp với một số người dùng quen thuộc với VBA).
Sau một thời gian tìm tòi, mình đã tìm ra một giải pháp khá hay bằng VBA. Về cơ bản, nó sẽ lấy dữ liệu từ một URL được chia sẻ của Google Sheet và đưa vào file Excel của mình.
Cách thực hiện:
- Đầu tiên, bạn cần chia sẻ Google Sheet của mình ở chế độ Bất kỳ ai có đường liên kết đều có thể xem.
- Sau đó, bạn tạo một URL để xuất dữ liệu dưới dạng CSV hoặc TSV. Ví dụ, nếu URL Google Sheet của bạn là:
https://docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_ABCDEFG/edit#gid=0, thì URL để lấy dữ liệu dạng CSV sẽ là:https://docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_ABCDEFG/export?format=csv&gid=0 - Tiếp theo, bạn sử dụng VBA để tải dữ liệu từ URL này vào một Sheet trong Excel. Dưới đây là một đoạn code ví dụ bạn có thể tham khảo:
Sub ImportFromGoogleSheetsCSV()
Dim wsDest As Worksheet
Dim url As String
Dim xmlHttp As Object
Dim data As String
' Thay thế bằng URL xuất CSV của bạn
url = "https://docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_ABCDEFG/export?format=csv&gid=0"
Set wsDest = ThisWorkbook.Sheets("Sheet1") ' Thay "Sheet1" bằng tên sheet bạn muốn nhập dữ liệu vào
On Error Resume Next
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
xmlHttp.Open "GET", url, False
xmlHttp.Send
If xmlHttp.Status = 200 Then
data = xmlHttp.responseText
' Xóa dữ liệu cũ trong sheet đích
wsDest.Cells.ClearContents
' Chuyển đổi dữ liệu CSV thành mảng và ghi vào Excel
Dim arrData As Variant
arrData = Split(data, vbCrLf) ' Tách theo dòng
Dim i As Long
For i = LBound(arrData) To UBound(arrData)
Dim arrRow As Variant
arrRow = Split(arrData(i), ",") ' Tách theo dấu phẩy (hoặc ký tự phân tách khác nếu có)
wsDest.Cells(i + 1, 1).Resize(1, UBound(arrRow) + 1).Value = arrRow
Next i
MsgBox "Đã cập nhật dữ liệu từ Google Sheets thành công!", vbInformation
Else
MsgBox "Không thể tải dữ liệu. Lỗi: " & xmlHttp.Status & " - " & xmlHttp.StatusText, vbCritical
End If
On Error GoTo 0
Set xmlHttp = Nothing
End Sub
Lưu ý:
- Đoạn code trên giả định dữ liệu được phân tách bằng dấu phẩy. Nếu Google Sheet của bạn dùng dấu chấm phẩy hoặc ký tự khác, bạn cần chỉnh sửa dòng
arrRow = Split(arrData(i), ",")cho phù hợp. - Bạn có thể đặt đoạn code này vào một Module và gọi nó bằng nút bấm hoặc sự kiện nào đó để tự động hóa quy trình.
Hy vọng chia sẻ này hữu ích với mọi người!