• Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access
  • RE: Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access

    kieu manh > 11-11-18, 10:56 AM

    (11-11-18, 09:57 AM)ongke0711 Đã viết:
    (11-11-18, 07:50 AM)kieu manh Đã viết: Ý mình nói là khi ta dùng code lấy dữ liệu lên TableName xong rồi nhưng nhìn vào TableName đó chưa thấy có dữ liệu mà phải thao tác thủ công là bấm vào Refresh All trên Menu Access ấy thì dữ liệu trên TableName nó mới Show ra thì mới nhìn thấy được


    Nếu theo như file demo của bạn maidinhdan thì khi bấm nút lấy dữ liệu thì dữ liệu đã được load về table rồi. 
    - Nếu bạn mở table đó lên trước để xem khi bấm nút lấy dữ liệu thì sau khi load về dữ liệu không cập nhật trên màn hình thôi. Mọi truy vấn đối với table đó vẫn có dữ liệu.
    - Nếu bạn muốn hiển thị dữ liệu cập nhật lên trên màn hình luôn thì chỉ cần thêm Requery cho Form hay SubForm là được rồi.
           Me.Requery
       Me.SubForm.Requery
    Me: đại diện cho Form có Source là table vừa nạp dữ liệu.
    Tại Mình cũng đang viết 1 hàm sử dụng cho Excel và Access thấy bài này Úp bên GPE tiện đây mình viết ADO
     
    1/ Từ Excel lưu dữ liệu Sheet đó vào Table Access (chạy code trên Excel )
    2/ Từ Access chạy code lấy dữ liệu từ Excel đó lên Mảng xong lưu vào Table Access (Chạy code trên Access )
    3/ Sử dung chung 1 Hàm cho 2 vấn đề trên nên mới tiện đây hỏi thêm vậy
    ....
    Cảm ơn Bạn Access mình chưa hiểu lắm ... nếu viết thành code chạy chung cho toàn bộ File Access để Refresh All thì mình viết thế nào bạn nhỉ
  • RE: Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access

    ongke0711 > 13-11-18, 09:12 PM

    (11-11-18, 10:56 AM)kieu manh Đã viết: Tại Mình cũng đang viết 1 hàm sử dụng cho Excel và Access thấy bài này Úp bên GPE tiện đây mình viết ADO
     
    1/ Từ Excel lưu dữ liệu Sheet đó vào Table Access (chạy code trên Excel )
    2/ Từ Access chạy code lấy dữ liệu từ Excel đó lên Mảng xong lưu vào Table Access (Chạy code trên Access )
    3/ Sử dung chung 1 Hàm cho 2 vấn đề trên nên mới tiện đây hỏi thêm vậy
    ....
    Cảm ơn Bạn Access mình chưa hiểu lắm ... nếu viết thành code chạy chung cho toàn bộ File Access để Refresh All thì mình viết thế nào bạn nhỉ

    Tôi có viết cái Class dùng ADO để kết nối với 3 loại CSLD: SQL Server, MS Access và Excel. Bạn có thể tham khảo trong bài post này: http://thuthuataccess.com/forum/thread-10003.html

    Trong bài này tôi rút gọn cái Class kết nối với Excel không thôi để đỡ rối.

    Theo cách tôi thì không dùng mảng vì khi dùng ADO kết nối, nó đã tạo Recordset đó trên bộ nhớ rồi và mình chỉ cần dùng nó để ghi xuống table trong Access hoặc hiển thị thông tin để xem trên Form. Thay vì mất thêm thời gian cho công đoạn chuyển từ in-memory Recordset sang Mảng (cũng nằm trên bộ nhớ) rồi mới dùng cái biến mảng cho các thao tác kế tiếp.
    - Dùng Recordset có thể sẽ chậm hơn mảng nhưng sẽ tận dụng được các thuộc tính, phương thức của nó như: Filter, Find, UpdateBatch v.v..Cái này mảng không làm được.
    - Đối với dữ liệu ít dòng, ít field, không cần thao tác xử lý gì lại cái recordset đó thì tôi mới dùng Array, hoặc Collection nhưng phần lớn thì thích dùng Recordset hơn (khỏi phải Redim lại mảng).

    Riêng đối với Sheet Excel thì kiểu gì cũng phải định dạng nó cho chuẩn hoá trước khi Import chứ không thì Access cũng sẽ bỏ qua các record có dữ liệu không đồng nhất -> sai dữ liệu.
    Vd: cột dạng Text có nhưng dòng lẫn dạng Number thì Access vẫn import nhưng cột dữ liệu đó sẽ là Null. Tốt nhất nên chuyển các dữ liệu Number về Text để Access import ít lỗi mất dữ liệu hơn.

    Link demo: http://www.mediafire.com/file/bwv0bbnfzcwmzmb/Demo_Import_Du_lieu_tu_Excel.rar/file
    [/url]

    [url=https://flic.kr/p/2bLuBm1][Hình: 45135768084_be51038e72_o.png]
  • RE: Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access

    kieu manh > 14-11-18, 03:33 PM

    (13-11-18, 09:12 PM)ongke0711 Đã viết:
    (11-11-18, 10:56 AM)kieu manh Đã viết: Tại Mình cũng đang viết 1 hàm sử dụng cho Excel và Access thấy bài này Úp bên GPE tiện đây mình viết ADO
     
    1/ Từ Excel lưu dữ liệu Sheet đó vào Table Access (chạy code trên Excel )
    2/ Từ Access chạy code lấy dữ liệu từ Excel đó lên Mảng xong lưu vào Table Access (Chạy code trên Access )
    3/ Sử dung chung 1 Hàm cho 2 vấn đề trên nên mới tiện đây hỏi thêm vậy
    ....
    Cảm ơn Bạn Access mình chưa hiểu lắm ... nếu viết thành code chạy chung cho toàn bộ File Access để Refresh All thì mình viết thế nào bạn nhỉ

    Tôi có viết cái Class dùng ADO để kết nối với 3 loại CSLD: SQL Server, MS Access và Excel. Bạn có thể tham khảo trong bài post này: http://thuthuataccess.com/forum/thread-10003.html

    Trong bài này tôi rút gọn cái Class kết nối với Excel không thôi để đỡ rối.

    Theo cách tôi thì không dùng mảng vì khi dùng ADO kết nối, nó đã tạo Recordset đó trên bộ nhớ rồi và mình chỉ cần dùng nó để ghi xuống table trong Access hoặc hiển thị thông tin để xem trên Form. Thay vì mất thêm thời gian cho công đoạn chuyển từ in-memory Recordset sang Mảng (cũng nằm trên bộ nhớ) rồi mới dùng cái biến mảng cho các thao tác kế tiếp.
    - Dùng Recordset có thể sẽ chậm hơn mảng nhưng sẽ tận dụng được các thuộc tính, phương thức của nó như: Filter, Find, UpdateBatch v.v..Cái này mảng không làm được.
    - Đối với dữ liệu ít dòng, ít field, không cần thao tác xử lý gì lại cái recordset đó thì tôi mới dùng Array, hoặc Collection nhưng phần lớn thì thích dùng Recordset hơn (khỏi phải Redim lại mảng).

    Riêng đối với Sheet Excel thì kiểu gì cũng phải định dạng nó cho chuẩn hoá trước khi Import chứ không thì Access cũng sẽ bỏ qua các record có dữ liệu không đồng nhất -> sai dữ liệu.
    Vd: cột dạng Text có nhưng dòng lẫn dạng Number thì Access vẫn import nhưng cột dữ liệu đó sẽ là Null. Tốt nhất nên chuyển các dữ liệu Number về Text để Access import ít lỗi mất dữ liệu hơn.

    Link demo: http://www.mediafire.com/file/bwv0bbnfzcwmzmb/Demo_Import_Du_lieu_tu_Excel.rar/file
    [/url]

    [url=https://flic.kr/p/2bLuBm1][Hình: 45135768084_be51038e72_o.png]

    tại Mạnh quen xài mảng để còn Cộng, trừ,nhân, chia trong mảng tính toán xong mới lưu vào nên làm vậy chứ
    còn lấy Recordset xong ghi nguyên 1 bảng đó thì mạnh mượn code DAO của bạn viết thêm 1 chút ADO nữa là xong à
    Mã:
    Sub ImportExcelToAccess()
        Dim Rs As Object, SQL As String
        Dim Strcon As String, ExcelPath As String
        ExcelPath = CurrentProject.Path & "\Test.xlsx"
        
        Set Rs = CreateObject("ADODB.Recordset")
        SQL = "select * from [Sheet1$A6:L15]" ''Tuy chon Mo Rong de lay du lieu
        Strcon = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ExcelPath _
                    & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";")
        Rs.Open SQL, Strcon, 3, 1
        
        Rem CurrentDb.Execute "DELETE * FROM tblExcelImportTemp", dbFailOnError ''xoa hay luu xuong thì tuy
        Dim i As Long
        Dim rsDAO As DAO.Recordset
        Set rsDAO = CurrentDb.OpenRecordset("tblExcelImportTemp", dbOpenDynaset)
        With Rs
            Do While Not .EOF
                With .Fields
                    rsDAO.AddNew
                    For i = 0 To (.Count - 1)
                        rsDAO.Fields(i).Value = .Item(i).Value
                    Next
                    rsDAO.Update
                End With
                .MoveNext
            Loop
            MsgBoxUni ChrW(272) & "ã import d" & ChrW(7919) & " li" & ChrW(7879) & "u vào table: [tblExcelImportTemp]."
        End With

        Rs.Close
        Set Rs = Nothing
        rsDAO.Close
        Set rsDAO = Nothing
    End Sub
  • RE: Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access

    ongke0711 > 15-11-18, 03:50 PM

    007  Nếu muốn tính toán thì đối tượng Recordset cũng sẽ tính toán tiện hơn vì có thể gọi đích danh tên Field nào cần dùng trong công thức (Nó cũng giống Key trong Dictionary vậy) chứ không cần phải nhớ vị trí của nó như trong mảng.

    Demo này của tôi xử lý trên nền tảng Access nên sẽ khác chút so với Excel.
    Những dữ liệu import thường là dữ liệu thô, import vào Access sau đó khi cần thì mới dùng các công cụ như Query hoặc code VBA để xử lý tính toán chứ không tính toán ngay khi import.
    Tương tự nếu CSDL back end là SQL Server cũng vậy, xử lý tính toán ngay trên SQL Server rồi mới kết nối ADO để lấy dữ liệu (Recordset) về cho report Access.

    Riêng về cái Class tôi viết nó dài dòng chút là vì nó là Class và tôi muốn có thể tái sử dụng, gọi lại bất kỳ lúc nào trong code, trong form chứ không muốn mỗi lần cần dùng là phải viết lại, khai báo lại... và các tham số như: đường dẫn file, tên file, range lấy dữ liệu của file excel... trong đó tôi cũng để là động chứ không dùng hardcode như bạn viết để người dùng có thể linh động tuỳ chọn vậy thôi. 
  • RE: Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access

    maidinhdan > 16-11-18, 01:36 AM

    Nhân 1 bạn có hỏi mình Xin đóng góp 1 code này: http://thuthuataccess.com/forum/thread-9...l#pid40852