Chào mọi người,
Dạo này công ty mình có một lượng lớn dữ liệu báo cáo nằm trên SQL Server, và việc xuất thủ công ra Excel hàng ngày tốn khá nhiều thời gian. Mình đã tìm hiểu và áp dụng VBA để tự động hóa việc này, thấy khá hiệu quả nên muốn chia sẻ lại cho anh em nào đang gặp tình huống tương tự.
Mục tiêu: Tự động lấy dữ liệu từ một bảng/view cụ thể trong SQL Server vào một sheet Excel đã định sẵn.
Công cụ: VBA kết hợp với ADO (ActiveX Data Objects).
Các bước thực hiện cơ bản:
- Khai báo các biến cần thiết: kết nối, recordset, chuỗi kết nối.
- Thiết lập chuỗi kết nối đến SQL Server (bao gồm tên server, database, user, password).
- Tạo đối tượng Connection và Recordset.
- Mở kết nối và thực thi câu lệnh SQL để lấy dữ liệu.
- Kiểm tra xem có dữ liệu trả về hay không.
- Nếu có dữ liệu, tiến hành ghi dữ liệu từ Recordset vào Excel. Có thể ghi từng dòng hoặc dùng phương thức CopyFromRecordset để tối ưu.
- Đóng Recordset và Connection, giải phóng bộ nhớ.
Một đoạn code ví dụ (minh họa, cần tùy chỉnh):
Sub GetDataFromSQLServer()
Dim conn As Object
Dim rs As Object
Dim strConn As String
Dim strSQL As String
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
' Thay đổi thông tin kết nối cho phù hợp
strConn = "Provider=SQLOLEDB;Data Source=YourServerName;Initial Catalog=YourDatabaseName;User ID=YourUsername;Password=YourPassword;"
strSQL = "SELECT Column1, Column2 FROM YourTableName"
On Error GoTo ErrorHandler
conn.Open strConn
rs.Open strSQL, conn, 3, 3 ' 3, 3 = adOpenStatic, adLockOptimistic
If Not rs.EOF Then
' Xóa dữ liệu cũ trong sheet đích
ThisWorkbook.Sheets("Sheet1").Cells.ClearContents
' Ghi tiêu đề (tùy chọn)
Dim i As Integer
For i = 0 To rs.Fields.Count - 1
ThisWorkbook.Sheets("Sheet1").Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
' Ghi dữ liệu
ThisWorkbook.Sheets("Sheet1").Cells(2, 1).CopyFromRecordset rs
Else
MsgBox "Không có dữ liệu trả về!", vbInformation
End If
ExitRoutine:
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Exit Sub
ErrorHandler:
MsgBox "Lỗi: " & Err.Description, vbCritical
Resume ExitRoutine
End Sub
Lưu ý:
- Bạn cần bật tham chiếu ADO trong VBA Editor (Tools -> References -> Microsoft ActiveX Data Objects x.x Library). Hoặc dùng cách tạo đối tượng như trên thì không cần bật tham chiếu.
- Chuỗi kết nối cần được điền chính xác thông tin server, database, user, password của bạn.
- Câu lệnh SQL có thể tùy chỉnh để lấy dữ liệu theo yêu cầu.
- Sheet "Sheet1" và tên bảng/view cần được thay đổi cho phù hợp.
Hy vọng chia sẻ này hữu ích cho mọi người. Có ai có kinh nghiệm hay cách làm khác hiệu quả hơn thì cùng thảo luận nhé!