Menu

Tự động lấy dữ liệu từ SQL Server vào Excel bằng VBA - Chia sẻ kinh nghiệm

Biện Thảo Bình 04/06/2026 17:34 413 lượt xem 2 trả lời

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é!

0

Cảm ơn bạn đã chia sẻ kinh nghiệm rất hữu ích này! Việc tự động hóa lấy dữ liệu từ SQL Server vào Excel đúng là giải pháp tuyệt vời để tiết kiệm thời gian và giảm thiểu sai sót so với làm thủ công.

Mình đang tìm hiểu về ADO để kết nối Excel với cơ sở dữ liệu. Bạn có thể chia sẻ thêm về cách xử lý lỗi kết nối hoặc cách lấy dữ liệu từ nhiều bảng/view khác nhau không? Điều này sẽ giúp ích rất nhiều cho những ai mới bắt đầu như mình.

2

Rất hay khi bạn chia sẻ kinh nghiệm kết nối SQL Server với Excel bằng VBA! Cách này thực sự giúp ích rất nhiều cho công việc báo cáo hàng ngày.

Mình cũng đang muốn áp dụng tương tự nhưng gặp chút khó khăn với việc xử lý các định dạng dữ liệu khác nhau khi import vào Excel. Không biết bạn có kinh nghiệm gì về vấn đề này không? Ví dụ như làm sao để giữ nguyên định dạng ngày tháng, số thập phân, hoặc các kiểu dữ liệu đặc biệt khác từ SQL sang Excel một cách chính xác nhất?

Cảm ơn bạn trước nhé!

1

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký