Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hướng dẫn] Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access
#11
(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ỉ
Reply
Những người đã cảm ơn
#12
(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]
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn kieu manh
#13
(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
Reply
Những người đã cảm ơn maidinhdan
#14
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. 
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan
#15
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
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Thủ Thuật] Demo Tổng hợp tất cả các kiểu thông báo tiếng việt trong Access maidinhdan 39 8,478 22-09-18, 12:40 PM
Bài mới nhất: NguyenDungAnh
  [Hỏi] Điền kết quả của 1 query từ Access sang Excel killitmore 0 215 21-08-18, 12:33 PM
Bài mới nhất: killitmore
  Sử dụng Class Module và Kết nối dữ liệu SQL SERVER trong Access VBA lehongduc 62 34,485 03-08-18, 12:41 PM
Bài mới nhất: Cuong Servenet
  [Hàm] [Demo] Hàm kiểm tra IP tắt hay mở maidinhdan 10 2,422 26-07-18, 04:27 PM
Bài mới nhất: Cuong Servenet
  Gửi tin nhắn SMS bằng Access lmthu 9 2,045 23-07-18, 07:09 PM
Bài mới nhất: tt1212

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line