Hỏi về code kiểm tra một file đang mở hay đóng?
Xin chào mọi người.
Em có 2 file A.xls & B.xls trong cùng một thư mục.
Từ file A em muốn kiểm tra file B xem là đang đóng hay mở thì sử dụng code nào ạ?
Mong được giúp đỡ, Xin cám ơn!Bạn thử với Hàm này:
Function IsWorkBookOpen(ByRef BookName As String) As Boolean
On Error Resume Next
IsWorkBookOpen = Not (Application.Workbooks(BookName) Is Nothing)
End FunctionVà thủ tục kiểm tra như vầy:
Sub CheckWBO()
MsgBox IsWorkBookOpen("BookName.xls")
End Sub
Mấy cái code trên chẳng giúp được gì nếu người ta mở bằng 2 session khác nhau, thậm chí code nằm trong file đang mở bằng Excel 2007 còn file kiểm tra lại đang mở bằng Excel 2003 thì cũng.. tèo
Giải thuật của bài toán này là: Dùng code thử mở file, nếu bị lỗi tức là file đã mở và ngược lại
Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long
Function IsFileOpen(FileName As String) As Boolean
Dim hFile As Long, lastErr As Long
hFile = -1
hFile = lOpen(FileName, &H10)
If hFile = -1 Then
lastErr = Err.LastDllError
Else
lClose (hFile)
End If
IsFileOpen = (hFile = -1) And (lastErr = 32)
End Function
Cũng có thể dùng Scripting.FileSystemObhect thử Move file, nếu không move được nghĩa là file đang mở. Tuy nhiên cách này chỉ tạm dùng được trên Excel thôi chứ cũng có thể không chính xác (trong trường hợp file không mở nhưng cũng không Move được file vì những lý do của hệ thống)
Có thể tham khảo cách làm từ MS:
https://support.microsoft.com/kb/213383
www.giaiphapexcel.com/diendan/threads/h%E1%BB%8Fi-v%E1%BB%81-code-ki%E1%BB%83m-tra-m%E1%BB%99t-file-%C4%91ang-m%E1%BB%9F-hay-%C4%91%C3%B3ng.75116/#post460762
Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...
Xem khóa học
Đáng tiếc hàm lOpen không hổ trợ Unicode
Vậy thì tạm dùng Scripting.FileSystemObject nhé:
Function IsFileOpen(FileName As String) As Boolean
Dim fso As Object
On Error Resume Next
Application.Volatile
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile FileName, FileName
IsFileOpen = (Err.Number <> 0)
End Function
Code của bạn viết rằng:
Phải sửa thành:
Code VBA nó đâu có "khôn" đến múc biết rõ file B.xls là nằm cùng thư mục với file A.xls chứ —> Muốn nói đến file nào phải chỉ rõ đường dẫn đầy đủ