Sử Dụng Excel Cùng Với Access

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,033
Giới tính
Nam
I/ Mục đích và yêu cầu chung
1/ Xuất phát từ 10 lý do hàng đầu cho việc sử dụng Access cùng với Excel
Của Bác Bill Link sau:

2/ Xuất phát từ nhu cầu công việc Của Mạnh và sự cần thiết cho Mạnh Học hỏi, bàn luận và nghiên cứu thêm ....

3/ Mạnh lập thớt này với 1 cái tiêu đề chung nhất ... Vì sẻ có rất nhiều vấn đề và bài viết liên Quan tới Excel & Access cần học tập và bàn luận tại đây cùng với các thành viên khác nữa nếu thích thì cứ Úp hết bài vào đây ta bàn luận và học tập cho vui ..... càng nhiều bài càng tốt .... phản biện càng sâu sắc càng hay

4/ Các Bạn cứ yên tâm tin Mạnh đi ... Mạnh lập thớt nào là thớt đó có phong trào học tập và nghiên cứu khí thế xôi nổi ở đó ... trừ khi Mạnh bận công việc hay Ứ thích nữa thì nó sẻ chìm xuồng ...;):p

II/ Mở màn cho Mạnh hỏi bài thứ 1

Mạnh sử dụng code sau Từ Excel chạy code để CompactRepair Database.accdb thấy chạy rất tốt tuy nhiên nó phát sinh 1 vài lỗi sau rất mong các Bạn trợ giúp

Mã:
Public Function MyFso() As Scripting.FileSystemObject
    Set MyFso = New Scripting.FileSystemObject
End Function

Public Function RepairDatabase(ByVal AccPath As String) As Boolean
    Rem https://msdn.microsoft.com/en-us/library/office/ff194498.aspx
    Call CloseDataBaseAccess                                                 
    On Error GoTo Errorhandler
    Dim Acc As Object, NewName$, Ext$
    NewName = AccPath & ".temp"
    Ext = MyFso.GetExtensionName(AccPath)                                     
    If (UCase(Ext) <> "MDB") And (UCase(Ext) <> "ACCDB") Then Exit Function   
    Set Acc = CreateObject("Access.Application")                             
    If MyFso.FileExists(AccPath) = False Then Exit Function                   
    RepairDatabase = Acc.CompactRepair(AccPath, NewName, True)               
    MyFso.DeleteFile AccPath                                                 
    Name NewName As AccPath                                                   
    Set Acc = Nothing                                                         
    Exit Function                                                             
Errorhandler:                                                                 
    Call UniMsgbox("Error #: " & Err.Number _
        & vbCrLf & Err.Description, 2, 48)                                   
    Err.Clear
End Function
1/ khi file Excel đang kết nối tới File Access có biểu tượng ổ khóa vàng mà đột ngột mất điện ... khi có điện lại nhìn trong Folder có file Database đó nó vẫn còn file có ổ khóa màu vàng thì mở file Excel kết lại thì có 1 vài code có liên quan nó báo lỗi VD như code trên .... cách xử lý nó ???

2/ Khi 2 máy trong Mạng LAN đang kết nối tới Database.accdb mà chưa giải phóng kết nối Mạnh thử nén file thì nó báo lỗi vì còn đang kết nối ở máy khác
Vì Mạnh có cho code nó chạy tự động mỗi ngày nó nén ( CompactRepair ) File 1 lần khi mở file Excel đó lên code lưu cái ngày đó trên máy

Vậy Mạnh muốn hỏi có cách nào khi Mạnh nén file ( CompactRepair ) thì nó giải phóng hết tất cả các kết nối các máy khác trong Mạng LAN ... cách xử lý nó ???

3/ Tại sao Mạnh dùng chức năng CompactRepair của Access khi mở chính nó lên để nén file thì dung lượng file sau đó nó vẫn còn nhiều hơn khi xài công cụ khác nén lại ( CompactRepair )

4/ Có code nào thay thế code trên mà nó chạy tốt hơn mong các bạn úp cho Mạnh xin tham khảo ?!
QLBHPN.JPG

Tạm thời hỏi vậy .... sẻ có nhiều bài tiếp theo Sau !!??

Xin cảm ơn
 
Lần chỉnh sửa cuối:
I/ Mục đích và yêu cầu chung
1/ Xuất phát từ 10 lý do hàng đầu cho việc sử dụng Access cùng với Excel
Của Bác Bill Link sau:

2/ Xuất phát từ nhu cầu công việc Của Mạnh và sự cần thiết cho Mạnh Học hỏi, bàn luận và nghiên cứu thêm ....

3/ Mạnh lập thớt này với 1 cái tiêu đề chung nhất ... Vì sẻ có rất nhiều vấn đề và bài viết liên Quan tới Excel & Access cần học tập và bàn luận tại đây cùng với các thành viên khác nữa nếu thích thì cứ Úp hết bài vào đây ta bàn luận và học tập cho vui ..... càng nhiều bài càng tốt .... phản biện càng sâu sắc càng hay

4/ Các Bạn cứ yên tâm tin Mạnh đi ... Mạnh lập thớt nào là thớt đó có phong trào học tập và nghiên cứu khí thế xôi nổi ở đó ... trừ khi Mạnh bận công việc hay Ứ thích nữa thì nó sẻ chìm xuồng ...;):p

II/ Mở màn cho Mạnh hỏi bài thứ 1

Mạnh sử dụng code sau Từ Excel chạy code để CompactRepair Database.accdb thấy chạy rất tốt tuy nhiên nó phát sinh 1 vài lỗi sau rất mong các Bạn trợ giúp

Mã:
Public Function MyFso() As Scripting.FileSystemObject
    Set MyFso = New Scripting.FileSystemObject
End Function

Public Function RepairDatabase(ByVal AccPath As String) As Boolean
    Rem https://msdn.microsoft.com/en-us/library/office/ff194498.aspx
    Call CloseDataBaseAccess                                                 
    On Error GoTo Errorhandler
    Dim Acc As Object, NewName$, Ext$
    NewName = AccPath & ".temp"
    Ext = MyFso.GetExtensionName(AccPath)                                     
    If (UCase(Ext) <> "MDB") And (UCase(Ext) <> "ACCDB") Then Exit Function   
    Set Acc = CreateObject("Access.Application")                             
    If MyFso.FileExists(AccPath) = False Then Exit Function                   
    RepairDatabase = Acc.CompactRepair(AccPath, NewName, True)               
    MyFso.DeleteFile AccPath                                                 
    Name NewName As AccPath                                                   
    Set Acc = Nothing                                                         
    Exit Function                                                             
Errorhandler:                                                                 
    Call UniMsgbox("Error #: " & Err.Number _
        & vbCrLf & Err.Description, 2, 48)                                   
    Err.Clear
End Function
1/ khi file Excel đang kết nối tới File Access có biểu tượng ổ khóa vàng mà đột ngột mất điện ... khi có điện lại nhìn trong Folder có file Database đó nó vẫn còn file có ổ khóa màu vàng thì mở file Excel kết lại thì có 1 vài code có liên quan nó báo lỗi VD như code trên .... cách xử lý nó ???

2/ Khi 2 máy trong Mạng LAN đang kết nối tới Database.accdb mà chưa giải phóng kết nối Mạnh thử nén file thì nó báo lỗi vì còn đang kết nối ở máy khác
Vì Mạnh có cho code nó chạy tự động mỗi ngày nó nén ( CompactRepair ) File 1 lần khi mở file Excel đó lên code lưu cái ngày đó trên máy

Vậy Mạnh muốn hỏi có cách nào khi Mạnh nén file ( CompactRepair ) thì nó giải phóng hết tất cả các kết nối các máy khác trong Mạng LAN ... cách xử lý nó ???

3/ Tại sao Mạnh dùng chức năng CompactRepair của Access khi mở chính nó lên để nén file thì dung lượng file sau đó nó vẫn còn nhiều hơn khi xài công cụ khác nén lại ( CompactRepair )

4/ Có code nào thay thế code trên mà nó chạy tốt hơn mong các bạn úp cho Mạnh xin tham khảo ?!
View attachment 221529

Tạm thời hỏi vậy .... sẻ có nhiều bài tiếp theo Sau !!??

Xin cảm ơn
Anh mạnh ơi.Em cũng đang tìm hiểu thể loại này anh có thể cho file có code lên để em học tập được không anh.
 
Upvote 0
Nếu dịch Compact thành nén là hiểu sai bản chất của quá trình Compact trong Access. Không phải vô tình Microsoft dùng từ Compact thay vì dùng từ Compress. Trong máy tính, nén đi đôi với giải nén, nếu Compact là việc nén dữ liệu thì sẽ phát sinh công đoạn giải nén dữ liệu tiêu tốn tài nguyên (thời gian, CPU, RAM) và lúc đó mục đích cải thiện hiệu năng của CompactRepair sẽ thành nghịch lý.

Khi xóa một record trong Access, không gian lưu trữ của record bị xóa này sẽ không được giải phóng mà vẫn bị chiếm dụng bởi file Access. Điều này bảo đảm cho tốc độ thực thi của CSDL vẫn nhanh (tại sao lại nhanh thì cũng là một vấn đề phức tạp khác). Theo thời gian file Access phình to khi mà số lượng record bị xóa tăng nhưng vẫn chiếm dung lượng file Access. Điều này tương đồng với quá trình Fragment phát sinh khi xóa file.

Dưới đây là minh họa việc cái record bị xóa (XXX) chiếm dụng dung lượng lưu trữ trong Access.
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────
│ AAA │ XXX │ ABA │ AAA │ XXX │ BCA │ XXX │ ...
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────


Quá trình Compact trong Access thực chất là loại bỏ những không gian lưu trữ bị chiếm dụng lãng phí từ đó giảm nhẹ dung lượng file Access như minh họa kết quả quá trình Compact ở dưới.
┌─────┬─────┬─────┬─────┬─────
│ AAA │ ABA │ AAA │ BCA │ ...

└─────┴─────┴─────┴─────┴─────

Với trình độ có hạn nên đây là vài ý chủ quan và nếu bạn nào có ý kiến khác thì tôi chắc cũng không đủ trình độ để phản biện. :unknw:
 
Lần chỉnh sửa cuối:
Upvote 0
Anh mạnh ơi.Em cũng đang tìm hiểu thể loại này anh có thể cho file có code lên để em học tập được không anh.
Mạnh thì mới mò tới Access chỉ biết xài ADO Or DAO lấy lên hay ghi xuống ... Nhưng chỉ sử dụng nó như 1 cái Database.accdb thôi và tạo mấy cái lặt vặt ...

Nếu muốn hiểu nó có bài bản và chuyên sâu thì nên hỏi mấy thành viên này: @ongke0711 , @Hai Lúa Miền Tây ,@VetMini, @Vô danh Tiểu tốt ...

nếu có chi khác thì úp bài chi tiết ... nếu Mạnh biết sẻ viết cho ! :p
 
Upvote 0
Mạnh thì mới mò tới Access chỉ biết xài ADO Or DAO lấy lên hay ghi xuống ... Nhưng chỉ sử dụng nó như 1 cái Database.accdb thôi và tạo mấy cái lặt vặt ...

Nếu muốn hiểu nó có bài bản và chuyên sâu thì nên hỏi mấy thành viên này: @ongke0711 , @Hai Lúa Miền Tây ,@VetMini, @Vô danh Tiểu tốt ...

nếu có chi khác thì úp bài chi tiết ... nếu Mạnh biết sẻ viết cho ! :p
Em cũng muốn cai access nó như cái data lưu dữ liệu còn đâu làm việc trên excel mà.
 
Upvote 0
1/ khi file Excel đang kết nối tới File Access có biểu tượng ổ khóa vàng mà đột ngột mất điện ... khi có điện lại nhìn trong Folder có file Database đó nó vẫn còn file có ổ khóa màu vàng thì mở file Excel kết lại thì có 1 vài code có liên quan nó báo lỗi VD như code trên .... cách xử lý nó ???

- File có hình ổ khoá là file Lock Access database (.lccdb). Khi mở file Access lên là nó tự động tạo ra file Lock này để khoá table Access ngăn ngừa việc nhiều người dùng cập nhật, thay đổi dữ liệu trong Table ở cùng 1 thời điểm. Nghĩa là khi có 1 người (User 1) đang thao tác dữ liệu ở 1 table nào đó, thì các record ở table đó bị Locked, người khác truy cập từ máy khác không thể sửa các record đó. Sau khi User 1 thoát thì các Locked record mới được giải phóng, người khác mới có thể cập nhật tiếp cho nó.
- Trong vài trường hợp đang sử dụng, file Access bị lỗi, thoát thì Access không thể tự động xoá file lock (laccdb). Khi đó bạn vẫn có thể vô Window Explorer để xoá tay file này, không ảnh hưởng gì. File này (.laccdb) chỉ có thể xoá được (thủ công) khi không còn máy nào kết nối hoặc đang mở ứng dụng Access đó.


2/ Khi 2 máy trong Mạng LAN đang kết nối tới Database.accdb mà chưa giải phóng kết nối Mạnh thử nén file thì nó báo lỗi vì còn đang kết nối ở máy khác
Vì Mạnh có cho code nó chạy tự động mỗi ngày nó nén ( CompactRepair ) File 1 lần khi mở file Excel đó lên code lưu cái ngày đó trên máy

Vậy Mạnh muốn hỏi có cách nào khi Mạnh nén file ( CompactRepair ) thì nó giải phóng hết tất cả các kết nối các máy khác trong Mạng LAN ... cách xử lý nó ???

- Khi còn file lock này (tức là có máy đang chạy ứng dụng Access) thì bạn không thể dùng tính năng Compact & Repair Database. Nó chỉ chạy được khi file Access cần nén đang đóng.
- Việc "Compact & Repair database" là việc liên quan đến bảo trì CSDL. Việc bảo trì này chỉ được thực hiện khi không còn máy nào truy cập và đang thao tác trên CSDL này. Nếu người ta đang cập nhật dữ liệu mà bạn ngồi đâu dó tự động đóng CSDL lại để nén/ sửa thì dữ liệu thì hậu quả nó sẽ như thế nào? Do đó Access tự động khoá tính năng này lại khi còn người truy cập CSDL (còn mở file).
- Tốt nhất bạn chỉ nên chạy Compact dữ liệu vào những ngày cuối tuần khi không còn ai truy cập dữ liệu.

3/ Tại sao Mạnh dùng chức năng CompactRepair của Access khi mở chính nó lên để nén file thì dung lượng file sau đó nó vẫn còn nhiều hơn khi xài công cụ khác nén lại ( CompactRepair )

- Bạn VodanhTieuTot đã trả lời rồi.


4/ Có code nào thay thế code trên mà nó chạy tốt hơn mong các bạn úp cho Mạnh xin tham khảo ?!

Bản chất hoạt động "Compact & Repair Database" của Access là nó sẽ tự đóng file lại, copy ra file mới, nén file mới, xoá file cũ, rồi đổi đổi tên file mới thành tên file cũ vậy thôi.
Code của Mạnh tôi chưa test nhưng thấy cũng hoạt động trên qui trình đó nên nghĩ cũng ok rồi, chỉ code thêm:
- cho trường hợp file .accdb có cài mật khẩu.
- Kiểm tra file có đang mở không.
- Có thể thêm tính năng: nếu trong mạng LAN, hiện thông báo cho người dùng biết "5 phút nữa sẽ bảo trì CSDL", mọi người lưu công việc đang làm lại, hệ thống sẽ tự đóng trong 5 phút nữa....
 
Lần chỉnh sửa cuối:
Upvote 0
To @ongke0711
1/ Mạnh thấy bên thủ thuật Access bạn có viết mấy hàm sử dụng cho Compact & Repair Database có hàm nào theo bạn là chuẩn nhất Úp cho mạnh xin với ... tham khảo nghiên cứu thêm ?

2/ Có cách nào dùng code mà đóng hết tất cả các kết nối trong Mạng LAN không chỉ dùm Mạnh

3/ Mạnh làm kiểu các máy trong LAN khi kết nối tới Database xong thì đóng lại luôn mà ko duy trì kết nối thì ok đó nhưng ko thích lắm

Vì có nghe ai đó trên GPE đã từng nói với mạnh kết nối như cái cổng kho mà mỗi lần vào ra lại mở liên tục thấy mất công .... trong khi đó hàng ngày Mạnh bán hàng phải vào ra liên tục truy xuất dữ liệu .... chỉ kẹt là đang tinh chỉnh lại khi Compact & Repair Database tự động theo máy là nó báo lỗi

To snow25

Mai mốt rảnh Mạnh viết cho vài code mẫu Xài DAO hay ADO chi đó được hết úp cho he ... lấy lên ghi xuống ... lấy lên vào Mảng tính toán link tinh xong ghi xuống vào Tablename khác được hết .... có điều đang bận chút (Rảnh ngó tẹo à )
 
Upvote 0
Web KT
Back
Top Bottom