Dùng câu lệnh gì để xác định là file trước đó đã thoát bình thường hay bị thoát đột ngột do mất điện

Liên hệ QC

1+1=2

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
5/7/20
Bài viết
62
Được thích
12
Cháu chào tất cả cô chú anh chị diễn Đàn. Cháu hay dùng Excel mà điện nhà cháu nó hay chập chờn , mỗi lần mất điện mở lên lại thì mở Excel nó hiện cái khung bên Tay Trái
1594772306186.png

Vây cho cháu hỏi dùng câu lệnh nào để phân biệt Là file Trước đó là đã tắt Close bình thường với File bị tắt đột ngột do mất điện
Ví dụ Sub bên dưới chổ màu đỏ dùng câu lệnh gì. Cháu xin cảm ơn tất cả moi người

Sub kiemtrafile()
if File trước đó tắt bình thường= True then
Range("a1") = 0
Else
Range("a1") = 1
End If
End Sub
 
Nguồn điện như vậy thì nguy hiểm quá. Mất điện đột ngột như vậy mà file đang làm việc là hỏng luôn file, không dùng được đâu chứ làm gì cho 'Recovery' thế kia.
Chưa kể nhanh hỏng máy tính, các thiết bị điện khác trong nhà nữa.

Mình nghiên cứu làm một bộ UPS cho máy tính ấy.
Mua acquy + mạch PLC về lập trình... đại khái

Sub giai_cuu_net()
If mất điện = True Then
If có UPS = True then
Máy tính and File Excel = Not Lỗi
Else
Máy tính bị tắt đột ngột and File Excel = cu tèo
End If
End If
End Sub
 
Upvote 0
Vụ này hình như tôi có đề xuất 1 lần. Vấn đề là cần biết file đã lưu chưa (orgin) hay chưa lưu kịp (autorecover, *version n)
Kiểm tra path xem là my document\x\y hay là c:\user\m\n
Chứ cần biết cúp điện hay không làm gì
 
Upvote 0
Nguồn điện như vậy thì nguy hiểm quá. ...
Ủa bạn không biết sao.
Thớt này hỏi thì phải trả lời cho thật đúng. Không có bàn gì khác cả.
Tuy rằng người ta thường khoe là sắm đồ thật xịn nhưng riêng thiết bị máy tính thì đồ thật xoàng. (hình như do đồ xịn mình xài, máy tính nhân viên xài)

Giải thuật để phòng cúp điện là:
- Viết một sub workbook open event, save workbook với version time stamp
- Viết một sub ghi một ký hiệu ngày giờ/time stamp (dùng một name cũng được)
- Viết một sub, cứ 15 phút thì gọi sub trên, save workbook với version time stamp
- Viết một sub workbook close event, gọi sub trên, và delete các versions kể trên.
Tôi chỉ mách cho kỹ thuật disaster recovery system. Còn code loại này tôi lười lắm, để cho lính làm.
 
Upvote 0
Giải thuật để phòng cúp điện là:
- Viết một sub workbook open event, save workbook với version time stamp
- Viết một sub ghi một ký hiệu ngày giờ/time stamp (dùng một name cũng được)
- Viết một sub, cứ 15 phút thì gọi sub trên, save workbook với version time stamp
- Viết một sub workbook close event, gọi sub trên, và delete các versions kể trên.
Tôi chỉ mách cho kỹ thuật disaster recovery system. Còn code loại này tôi lười lắm, để cho lính làm.
Em thấy chưa đáp ứng yêu cầu rồi anh ơi.
Chủ thớt cần xác định liên quan tới mất điện mà, chứ đâu cần đề phòng.
1594780177422.png

Mất điện đột ngột thì chưa chắc File cho 'Recovery', nếu 'Force close' thì thường có 'Recovery'.

Em thấy phương án xác định mất điện đột ngột thì chỉ có dùng mạch PLC, một cảm biến dòng điện (cản biến Hall) rồi cắm vào máy tính, lập trình xê gì đó.

Giải thuật đại khái:

If máy tính đang chạy bình thường = True Then
If giá trị_cảm biến = 0 Then
thông_báo: Mất điện đột ngột
End If
End If
 
Upvote 0
KHÔNG cần tới mất điện hàng ngày lúc Rảnh mình hay quậy code DLL API viết trên Delphi khi Call Code nó lỗi làm đơ cứng File Excel thì nó cũng bị lỗi Y trang hình bài số 1 -0-0-0-

vậy đại ý thêm code 1 tí như sau
If code viết tào lao then
đơ cứng file Excel ... gây ra lỗi đó
else
....
 
Upvote 0
Em thấy chưa đáp ứng yêu cầu rồi anh ơi.
Chủ thớt cần xác định liên quan tới mất điện mà, chứ đâu cần đề phòng.
...
Tôi đâu có trả lời cho thớt. Tôi biết thớt này khó tính, muón trả lời hải cho code đầy đủ, test được 100% trường hợp.

Cái timestamp chứa trong file lúc close sẽ cho biết nó có được close đàng hoàng hay không. Nó chỉ là ý tưởng. Nếu bạn muốn chính xác 100% thì phải có 2-3 cái để so sánh.
Lúc mở file lên, nếu bị lỗi thì chắc chắn là nó lỗi. Nếu không lỗi thì chạy một cái code so sánh mấy cái timestamps này.
 
Upvote 0
Vụ này hình như tôi có đề xuất 1 lần. Vấn đề là cần biết file đã lưu chưa (orgin) hay chưa lưu kịp (autorecover, *version n)
Kiểm tra path xem là my document\x\y hay là c:\user\m\n
Chứ cần biết cúp điện hay không làm gì

Cháu cảm ơn các bác @befaint @VetMini @ptm0412 cháu đã xử lý xong vụ này rồi. Code hơi 2 lúa 1 chúc nhưng chạy đúng rồi. Có điều lúc mở file lên nó phải Save mất 2 giây

Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("data").Range("a1").Value = 2
End Sub

Private Sub Workbook_Open()

If Sheets("data").Range("a1").Value = 1 Then
  MsgBox ("File tat Truoc Do Bi Mat dien")
Else
  MsgBox ("File tat Truoc Do Binh Thuong")
End If

    Sheets("data").Range("a1").Value = 1 '
    ActiveWorkbook.Save
End Sub
 
Upvote 0
Bạn có thể sử dụng hàm dưới đây:

Debug.print IsAutoSaved(ThisWorkbook)

--------------------------------------------
JavaScript:
Public Function IsAutoSaved(ByVal ProjectOffice As Object) As Boolean
' Last Edit: 15/07/2020 10:17
  Dim FSO As Object, o1 As Object, o2 As Object 'Scripting.File
  Dim T1 As Date, T2 As Date
  Set FSO = VBA.Interaction.CreateObject("Scripting.FileSystemObject")
  If Not FSO.FileExists(ProjectOffice.FullName) Then GoTo Ends
  Dim ExcelRoaming As String
  ExcelRoaming = Environ("AppData") & "\Microsoft\Excel\" & ProjectOffice.Name
  If Not FSO.FileExists(ExcelRoaming) Then GoTo Ends
  Set o1 = FSO.GetFile(ProjectOffice.FullName)
  Set o2 = FSO.GetFile(ExcelRoaming)
  T1 = o1.DateLastModified: T2 = o2.DateLastModified
  IsAutoSaved = T2 > T1
Ends:  Set FSO = Nothing: Set o1 = Nothing: Set o2 = Nothing
End Function
-------------------------------------------

Hoặc tạo một Add-ins tự động sao các bản sao của ứng dụng Excel sau 30 giây, hoặc tùy biến.
Hầu hết các ứng dụng hiện đại đều được save sau khi nhập. Tuy nhiên Excel không có hỗ trợ này.
 
Upvote 0
Upvote 0
Bạn có thể sử dụng hàm dưới đây:

Debug.print IsAutoSaved(ThisWorkbook)

--------------------------------------------
JavaScript:
Public Function IsAutoSaved(ByVal ProjectOffice As Object) As Boolean
' Last Edit: 15/07/2020 10:17
  Dim FSO As Object, o1 As Object, o2 As Object 'Scripting.File
  Dim T1 As Date, T2 As Date
  Set FSO = VBA.Interaction.CreateObject("Scripting.FileSystemObject")
  If Not FSO.FileExists(ProjectOffice.FullName) Then GoTo Ends
  Dim ExcelRoaming As String
  ExcelRoaming = Environ("AppData") & "\Microsoft\Excel\" & ProjectOffice.Name
  If Not FSO.FileExists(ExcelRoaming) Then GoTo Ends
  Set o1 = FSO.GetFile(ProjectOffice.FullName)
  Set o2 = FSO.GetFile(ExcelRoaming)
  T1 = o1.DateLastModified: T2 = o2.DateLastModified
  IsAutoSaved = T2 > T1
Ends:  Set FSO = Nothing: Set o1 = Nothing: Set o2 = Nothing
End Function
-------------------------------------------

Hoặc tạo một Add-ins tự động sao các bản sao của ứng dụng Excel sau 30 giây, hoặc tùy biến.
Hầu hết các ứng dụng hiện đại đều được save sau khi nhập. Tuy nhiên Excel không có hỗ trợ này.

hàm đó dùng làm sao anh em đã thử như vầy không biết đúng không nữa. Mong anh chỉ chi tiết hơn

Mã:
Public Function IsAutoSaved(ByVal ProjectOffice As Object) As Boolean
' Last Edit: 15/07/2020 10:17
  Dim FSO As Object, o1 As Object, o2 As Object 'Scripting.File
  Dim T1 As Date, T2 As Date
  Set FSO = VBA.Interaction.CreateObject("Scripting.FileSystemObject")
  If Not FSO.FileExists(ProjectOffice.FullName) Then GoTo Ends
  Dim ExcelRoaming As String
  ExcelRoaming = Environ("AppData") & "\Microsoft\Excel\" & ProjectOffice.Name
  If Not FSO.FileExists(ExcelRoaming) Then GoTo Ends
  Set o1 = FSO.GetFile(ProjectOffice.FullName)
  Set o2 = FSO.GetFile(ExcelRoaming)
  T1 = o1.DateLastModified: T2 = o2.DateLastModified
  IsAutoSaved = T2 > T1
Ends:  Set FSO = Nothing: Set o1 = Nothing: Set o2 = Nothing
End Function

Sub dad()
If IsAutoSaved(ThisWorkbook) = True Then
MsgBox ("mat dien")
Else
MsgBox ("binh thuong")
End If
End Sub

Em thử nảy giờ rút điện ngang nó vẫn không báo "Mất điện "
Bài đã được tự động gộp:

Thử sửa tùm lum không lưu rồi rút dây điện xem Before close có chạy không
dạ cháu thử rồi bác Mở lên nó báo " Trước đó mất điện "
 
Lần chỉnh sửa cuối:
Upvote 0
hàm đó dùng làm sao anh em đã thử như vầy không biết đúng không nữa. Mong anh chỉ chi tiết hơn
Em thử nảy giờ rút điện ngang nó vẫn không báo "Mất điện "
--------------------------------------

File recovery phụ thuộc cài đặt bao lâu mới tự động tạo file recovery, vì vậy nếu chưa đủ thời gian thì file sẽ chưa được tạo

-------------------------------
Dự án của bạn có lớn hay không?

Nếu nhỏ thì sử dụng Lệnh sau 10 giây lưu một lần nhé

JavaScript:
Public TimeoutAutoSave As Date

Public Sub AutoSaveAfterSomeSeconds()
  VBA.DoEvents
  TimeoutAutoSave = VBA.Now + 10 / 24 / 60 / 60
  'ThisWorkbook.SaveCopyAs NewName 'ThisWorkbook_(copy 1x).FullName
  Application.OnTime TimeoutAutoSave, "'" & ThisWorkbook.Name & "'!AutoSaveAfterSomeSeconds"
End Sub
'Private Sub Workbook_BeforeClose(Cancel As Boolean)
'  Application.OnTime TimeoutAutoSave, "'" & ThisWorkbook.Name & "'!AutoSaveAfterSomeSeconds", , False
'End Sub
 
Upvote 0
dạ cháu thử rồi bác Mở lên nó báo " Trước đó mất điện "
Trong các việc sửa tùm lum, nếu có việc xoá ô A1 sheet Data? Nếu có việc đổi tên sheet Data? Nếu chèn cột trước cột A, chèn dòng trên dòng 1?
 
Upvote 0
Trong các việc sửa tùm lum, nếu có việc xoá ô A1 sheet Data? Nếu có việc đổi tên sheet Data? Nếu chèn cột trước cột A, chèn dòng trên dòng 1?

dạ code trên cháu làm ví dụ là sheet data và ô A1. tức nhiên là khi làm thực tế cháu sẻ lấy 1 sheet nào bí mật và 1 ô bí mật người dùng không có khả năng xóa ô đó. Thì giờ chỉ biết cách đó chứ biết sao giờ
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom