-
RE: nén file Access bằng VBA
danhxetnghiem > 03-06-14, 03:54 PM
(03-06-14, 02:41 PM)tmtien261 Đã viết: Chào bạn "danhxetnghiem" !
Như yêu cầu của bạn thì:
1. Muốn nén khi mỗi lần thoát chương trình: Bạn tạo 1 formMain form này phải được đóng sau cùng, tại thủ tục On Close của formMain bạn gọi thực hiện đoạn code nén trên.
2. Muốn nén sau một số ngày nào đó: Bạn tạo 1 table có trường Ngaydanen kiểu Date/Time, lần đầu tiên nén chương bạn Save ngày này vào Ngaydannen. Mỗi khi mở (Hoặc đóng) chương trình bạn so sánh ngày hiện tại với ngày đã lưu, nếu "ngày hiện tại - Ngày đã lưu >= số ngày qui định" thì chương trình gọi lệnh nén.
Chúc bạn thành công !
ý 1 thì ok. Còn Cái ý 2 Mình hiểu nhưng mà không biết thực hiện! -
RE: nén file Access bằng VBA
Xuân Thanh > 03-06-14, 08:46 PM
Mã PHP:Private Sub Form_Close()
Dim rsCom As recordset
Set rsCom = CurrentDb.OpenRecordset("tblNgay", dbOpenTable)
If rsCom.RecordCount > 0 Then 'File đã nén
If rsCom!NgayDaNen + 30 > Date Then
rsCom.Edit
rsCom!NgayGaNen = Date
rsCom.Update
' Gọi lệnh nén file ở đây
End If
Else ' File chưa nén lần nào
rsCom.AddNew
rsCom!NgayDaNen = Date
rsCom.Update
' Gọi lệnh nén file ở đây
End If
End Sub
Sau 30 ngày nén file một lần
Thân mến -
RE: nén file Access bằng VBA
nhimsieunhan > 26-12-16, 12:08 AM
(23-03-13, 01:22 PM)Minh Tiên Đã viết: Đoạn code trên chỉ dùng cho ms Access 2003, còn Ms Access 2007 dùng đoạn code sau để nén (Thay cho chọn Compact on close):
Private Sub Form_Unload(Cancel As Integer)
SendKeys ("%T D C")
End Sub
Mình dùng đoạn mã của bạn nén OK nhưng sau khi nén mình không cách nào vào Design View của Form có chứa nút lệnh nén được. Bạn có ý tưởng gì không. -
RE: nén file Access bằng VBA
kieu manh > 30-03-17, 10:51 AM
Các Bạn vui lòng cho mình hỏi một chút 2 cách sau nó khác nhau cái gì ...tại Sao ...?!
Xin Cảm ơn
1/ GetDBEngine.CompactDatabase
2/ GetDBEngine.RepairDatabase -
RE: nén file Access bằng VBA
maidinhdan > 30-03-17, 11:36 AM
(30-03-17, 10:51 AM)kieu manh Đã viết: Các Bạn vui lòng cho mình hỏi một chút 2 cách sau nó khác nhau cái gì ...tại Sao ...?!
Xin Cảm ơn
1/ GetDBEngine.CompactDatabase
2/ GetDBEngine.RepairDatabase
GetDBEngine.CompactDatabase nghĩa là nén file lại
GetDBEngine.RepairDatabase sửa chửa nếu file đó gặp vấn đề hư hỏng.
Cho nên khi bạn dùng lệnh CompactDatabase, nên thêm lệnh RepairDatabase.
Trong một số trường hợp file ta đang làm bị hỏng do mất điện đột ngột ta sẽ dùng lệnh GetDBEngine.RepairDatabase để xử lý.
Lưu ý : 2 lệnh này chỉ dùng được trên Access 2013 và Access 2016
Thân mến! -
RE: nén file Access bằng VBA
kieu manh > 30-03-17, 11:58 AM
(30-03-17, 11:36 AM)maidinhdan Đã viết:
(30-03-17, 10:51 AM)kieu manh Đã viết: Các Bạn vui lòng cho mình hỏi một chút 2 cách sau nó khác nhau cái gì ...tại Sao ...?!
Xin Cảm ơn
1/ GetDBEngine.CompactDatabase
2/ GetDBEngine.RepairDatabase
GetDBEngine.CompactDatabase nghĩa là nén file lại
GetDBEngine.RepairDatabase sửa chửa nếu file đó gặp vấn đề hư hỏng.
Cho nên khi bạn dùng lệnh CompactDatabase, nên thêm lệnh RepairDatabase.
Trong một số trường hợp file ta đang làm bị hỏng do mất điện đột ngột ta sẽ dùng lệnh GetDBEngine.RepairDatabase để xử lý.
Lưu ý : 2 lệnh này chỉ dùng được trên Access 2013 và Access 2016
Thân mến!
Cảm ơn Bạn ...Nếu vậy ta Viết chung vào 1 Code CompactDatabase xong RepairDatabase Luôn liệu có ảnh hưởng gì tới File không Bạn
Sao Mình Thấy Link nhà sản xuất có lệnh sau hay là dùng chung cho 2 trường hợp đó ...Vào 1 ?!
RepairDatabase = Access.Application.CompactRepair(sourceDb, destDb, True)
https://msdn.microsoft.com/en-us/library...94498.aspx -
RE: nén file Access bằng VBA
kieu manh > 30-03-17, 12:36 PM
dựa trên Gợi ý của link sau Mạnh viết thành một Hàm chạy trên Excel ...Nhờ các Bạn xem dùm thế nào ...có bổ sung thêm gì không
https://msdn.microsoft.com/en-us/library...94498.aspx
Mã PHP:Private Function RepairDatabase(ByVal AccPath As String) As Boolean
Rem https://msdn.microsoft.com/en-us/library/office/ff194498.aspx
Dim Acc As Object, Fso As Object, NewName As String
On Error GoTo ErrorHandler
NewName = AccPath & ".temp"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Acc = CreateObject("Access.Application") ''Manh Viet Them cho nay chay tren Excel
If Fso.FileExists(AccPath) = False Then Exit Function
RepairDatabase = Acc.CompactRepair(AccPath, NewName, True) ''Tien Hanh CompactRepair
Fso.DeleteFile AccPath ''Xoa File Cua
Name NewName As AccPath ''Chuyen ten File NewName Thanh File AccPath
ErrorExit: Set Fso = Nothing: Set Acc = Nothing ''Giai Phong Bien Sau Khi CompactDatabase
Exit Function ''Thoat khi thuc hien xong
ErrorHandler: ''Thong bao Loi
MsgBox "Error #: " & Err.Number _
& vbCrLf & vbCrLf & Err.Description ''Thong bao Loi ma Loi
Err.Clear ''Xoa ma loi
Resume ErrorExit ''Giai Phong Bien ...Khi Gap Loi
End Function
Rem ==========
Public Sub Main_CompactRepair()
Dim Repaired As Boolean, Path As String
Path = ThisWorkbook.Path & "\Data2.accdb"
Repaired = RepairDatabase(Path)
Beep
MsgBox Repaired
End Sub -
RE: nén file Access bằng VBA
maidinhdan > 30-03-17, 05:51 PM
(30-03-17, 12:36 PM)kieu manh Đã viết: dựa trên Gợi ý của link sau Mạnh viết thành một Hàm chạy trên Excel ...Nhờ các Bạn xem dùm thế nào ...có bổ sung thêm gì không
https://msdn.microsoft.com/en-us/library...94498.aspx
[php]
Private Function RepairDatabase(ByVal AccPath As String) As Boolean
Rem https://msdn.microsoft.com/en-us/library...94498.aspx
Dim Acc As Object, Fso As Object, NewName As String
On Error GoTo ErrorHandler
NewName = AccPath & ".temp"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Acc = CreateObject("Access.Application") ''Manh Viet Them cho nay chay tren Excel
If Fso.FileExists(AccPath) = False Then Exit Function
RepairDatabase = Acc.CompactRepair(AccPath, NewName, True) ''Tien Hanh CompactRepair
Trả lời:
1. Hàm RepairDatabase và hàm GetDBEngine.CompactDatabase; GetDBEngine.RepairDatabase về chức năng thì giống, nhưng về cách thực hoạt động khác nhau hoàn toàn
* Sự khác nhau:
- Về thư viện tham chiếu
+ RepairDatabase : thuộc lớp thư viện Visual Basic for Applications; cho nên ta sẽ gọi thẳng với cú pháp Application.CompactRepair(SourceFile, DestinationFile, LogFile) và nó chỉ dùng được trên Access 2016; Access 2013; Access 2010; Nó hoàn toàn không dùng được trên Access 2007, 2003 hoặc thấp hơn ( vài hôm trước mình có 1 bài nói về cái này rồi: Link http://thuthuataccess.com/forum/thread-8...l#pid34534)
+ GetDBEngine.CompactDatabase; GetDBEngine.RepairDatabase: dùng lớp thư viện " Microsoft Data Access Objects reference" lớp phương thức của thư viện DAO; Như trên có trả lời 2 lệnh này chỉ dùng được trên Access 2013 và Access 2016
và một ý bạn có hỏi
Trích dẫn:Sao Mình Thấy Link nhà sản xuất có lệnh sau hay là dùng chung cho 2 trường hợp đó ...Vào 1 ?!
RepairDatabase = Access.Application.CompactRepair(sourceDb, destDb, True)
https://msdn.microsoft.com/en-us/library...94498.aspx
Cái này liên quan đến phiên bản Access, bởi đến khi có Access 2013 thì nhà sản xuất ta tách hàm compact và repair thành 2 cái lệnh riêng, chứ không để chung.
* Điểm giống nhau:....
.....Tôi có việc bận, nên tam trả lời ngắn gọn, có gì bạn thắc mắc tối nay ta trao đổi tiếp