Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

xuanthanh

Member
Hội viên mới
Dear All!
Đã có rất nhiều bạn hỏi về việc xuất dữ liệu từ Access ra Excel. Tôi cũng đã nhiều lần muốn nói về chuyện này nhưng ngặt nỗi thời gian không cho phép. Nay tranh thủ hướng dẫn các bạn dùng DAO để chuyển dữ liệu. Các bạn cũng có thể dùng ADODB nhưng sẽ phức tạp hơn và sẽ nói ở một chuyên đề khác.
Để đơn giản và dễ hình dung, tôi sử dụng một database Access có tên là "Vi du chuyen du lieu tu Ac ra Ex bang DAO". Trong datbase này chỉ có một table duy nhất là tblKhach để ghi toàn bộ danh sách khách hàng có trong CSDL và một form frmKhach để cập nhật DSKH. Tôi không bàn sâu về cách thiết kế table và form vì đã có chuyên đề hướng dẫn riêng. Giả sủ ở đây CSDL đã có dữ liệu sẵn. Bây giờ làm sao đưa được dữ liệu từ table tblKhach ra Excel. Tôi dùng bộ Office 2003. Lưu ý cả file Access và Excel phải để chung cùng một thư mục
Các bạn thiết kế một file Excel "Danh sach khach hang.xls" như trong file đính kèm. Trong file Access, các bạn xem kỹ phần code ở nút bấm "In Danh Sach". Để làm được việc này, trong cửa sổ modul, các bạn chọn Tools/References... và chọn cho đủ hai thành phần sau :
1/ Microsoft DAO 3.6 Object Libary(hoặc cao hơn)
2/ Microsoft Excel 11.0 Object Libary(hoặc cao hơn)
Toàn bộ phần code của nút "In Danh Sach" như sau
PHP:
Private Sub In_Click()
'Dinh nghia cac bien
    Dim Khach As Recordset
    Set Khach = CurrentDb.OpenRecordset("tblKhach", dbOpenTable)
    Dim Ex As Excel.Application
    Dim Wb As Workbook
    Dim Ws As Worksheet
    Dim TenFile
    Dim k As Integer
'Xac dinh vi tri cac bien
    TenFile = CurrentProject.Path & "\Danh sach khach hang.xls"
    Set Ex = New Excel.Application
    Set Wb = Ex.Workbooks.Open(TenFile)
    Set Ws = Wb.Worksheets("Danh sach")
    k = Ws.Range("A65000").End(xlUp).Row
'Loc va chuyen du lieu ra Ex
    If Khach.RecordCount = 0 Then MsgBox "Khong co du lieu de in", , "Xin loi": Exit Sub
    Khach.MoveFirst
    Do Until Khach.EOF
        n = Ws.Range("A65000").End(xlUp).Row
        If Ws.Range("A" & n) = "STT" Then Ws.Range("A" & n + 1) = 1 Else Ws.Range("A" & n + 1) = Ws.Range("A" & n) + 1
        Ws.Range("B" & n + 1) = Khach.Fields(0)
        Ws.Range("C" & n + 1) = Khach.Fields(1)
        Ws.Range("D" & n + 1) = Khach.Fields(2)
        Khach.MoveNext
    Loop
'Dinh dang File Ex
    n = Ws.Range("A65000").End(xlUp).Row
    Ws.Range("A" & k + 1 & ":B" & n).HorizontalAlignment = xlCenter
    With Ws.Range("A" & k + 1 & ":D" & n)
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        If n > k + 1 Then .Borders(xlInsideHorizontal).LineStyle = xlDot
    End With
'Xoa bien, giai phong bo nho va cho Ex hien thi
    Khach.Close
    Ex.Visible = True
    Set Ex = Nothing
End Sub
Các bạn download file bên dưới về nghiên cứu. Có gì thắc mắc hoặc chưa hiểu liên hệ với tôi qua hộp thư bachdanggiang_2006@yahoo.com
Thân mến

P/S : Các bạn vào C:-/Windows\System32 tìm xem có file DAO36.dll không, nếu không có thì tìm trên google mà chép vào
Như vậy sẽ không bị lổi
 

Đính kèm

Sửa lần cuối:

Mít Ướt

Muốn là có thể
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

KO hiểu Mod viết gì ở trên hết, liệu có được liên lạc ko vì rằng thắc mắc toàn tập :blush:
 

domfootwear

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Còn cách khác tối ưu hơn là khỏi dùng vòng lặp. Chạy nhanh và gọn hơn.
 

socnau

New Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Còn cách khác tối ưu hơn là khỏi dùng vòng lặp. Chạy nhanh và gọn hơn.
Bạn có cách nào hay thì chia xẻ cho mọi người học hỏi.
Cám ơn bạn.
 

xuanthanh

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Còn cách khác tối ưu hơn là khỏi dùng vòng lặp. Chạy nhanh và gọn hơn.
Khi mọi người mới tiếp cận với VBA thì nên hướng dẫn họ từ dễ đến khó
Thân
 

tht9

Ngoan nhất DKT ^^"
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Học access siu đẳng rùi mà đọc vẫn thấy ngu ngu!!!!! :thodai:
 

domfootwear

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Khi mọi người mới tiếp cận với VBA thì nên hướng dẫn họ từ dễ đến khó
Thân
Code của bạn chạy bị lỗi ở dòng
Mã:
 k = Ws.Range("A65000").End(xlUp).Row
 

xuanthanh

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Code của bạn chạy bị lỗi ở dòng
Mã:
 k = Ws.Range("A65000").End(xlUp).Row
Không lỗi đâu. Bạn kiểm tra lại giùm
Thân

P/S : Download thử file của minh về, giải nén vào một thư mục bất kỳ rồi chạy code(Trong file đã có sẵn dữ liệu)
 

domfootwear

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Không lỗi đâu. Bạn kiểm tra lại giùm
Thân

P/S : Download thử file của minh về, giải nén vào một thư mục bất kỳ rồi chạy code(Trong file đã có sẵn dữ liệu)
Chắc chắn mình đã làm như bạn hướng dẫn, lổi ngay dòng ấy.
 

xuanthanh

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Chắc chắn mình đã làm như bạn hướng dẫn, lổi ngay dòng ấy.
Bạn kiểm tra lại theo dòng chữ màu đỏ ở #1 xem sao nhé
Thân
 

domfootwear

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Bạn kiểm tra lại theo dòng chữ màu đỏ ở #1 xem sao nhé
Thân
Cái này thì có bạn à, theo mình thì nên chuyển cái file Excel thành file Template để lấy định dạng, tránh trường hợp ghi chồng hoặc xuất dữ liệu ra lần 2 đến n lần... Không dùng vòng lặp code sẽ ngắn gọn hơn và truy vấn sẽ nhanh hơn. Bạn thử theo ý tưởng mình xem nhé.
 

domfootwear

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Cái này thì có bạn à, theo mình thì nên chuyển cái file Excel thành file Template để lấy định dạng, tránh trường hợp ghi chồng hoặc xuất dữ liệu ra lần 2 đến n lần... Không dùng vòng lặp code sẽ ngắn gọn hơn và truy vấn sẽ nhanh hơn. Bạn thử theo ý tưởng mình xem nhé.
Buồn buồn ngồi làm thử, gửi các anh chị tham khảo.

Mã:
Private Sub cmdExport_Click()
On Error Resume Next
Dim db As DAO.Database, rs As DAO.Recordset, mySQL As String
Dim oApp As New Excel.Application, oBook As Excel.Workbook, oSheet As Excel.Worksheet

    Set oBook = oApp.Workbooks.Open(CurrentProject.Path & "\Danh sach khach hang.xlt")
    mySQL = "select * from tblKhach"
    Set oSheet = oBook.Sheets("Danh Sach")
    Set db = CurrentDb
    Set rs = db.OpenRecordset(mySQL, dbOpenSnapshot)
    oSheet.Range("b7").CopyFromRecordset rs
    
    With oBook.Sheets("Danh Sach")
        With .Range("A7:A" & .Range("B65000").End(xlUp).Row)
            .FormulaR1C1 = "=ROW()-6"
            .Value = .Value
        End With
    End With
   
    rs.Close
    oApp.Visible = True
    oApp.UserControl = True
    db.Close
 
  Exit Sub


End Sub
File đính kèm: Vi Du.rar
 

Access2k

Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Code của bạn chạy bị lỗi ở dòng
Mã:
 k = Ws.Range("A65000").End(xlUp).Row
Lỗi ở dòng trên khi sử dụng khai báo rõ ràng:
Option Compare Database
Option Explicit


Còn chủ thớt không bị do sử dụng khai báo không rõ ràng:
Option Compare Database
 

suteki

New Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Co cach nao ma khi minh an In du lieu nhieu lan no chi mo 1 file excel thoi khong ban. Cam on ban nhieu.
 

cpucloi

New Member
Hội viên mới
Ðề: Chuyên đề : Sử dụng DAO để chuyển dữ liệu từ Access ra Excel

Sau khi ấn cho thuộc tính của nút ấn enabled = false là xong, không ấn được nút nữa :bdance:
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Kỹ thuật giải trình thanh tra BHXH

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top