Hỏi về code kiểm tra một file đang mở hay đóng?

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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 Function

Và 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 SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    Lâu nay tìm kiếm code kiểm tra file đang mở trường hợp file mở ở 1 session khác không ra nay đã có code. Nhưng có lẻ trường hợp file có tên tiếng việc có dấu vẫn bị tèo nhỉ?

    Đá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

    Các Thầy Tiếp tục chỉ giáo cho em với ạ! Xin cảm ơn!

    Code của bạn viết rằng:

    Sub CheckWBO()
        Range("A1").ClearContents
        [COLOR=#ff0000][B]If IsFileOpen("B.xls") = False Then[/B][/COLOR]
        Range("A1").FormulaR1C1 = "1"
        Else
        Range("A1").FormulaR1C1 = "0"
        End If
    End Sub

    Phải sửa thành:

    Sub CheckWBO()
        Range("A1").ClearContents
        [B][COLOR=#ff0000]If IsFileOpen(ThisWorkbook.Path & "B.xls") = False Then[/COLOR][/B]
        Range("A1").FormulaR1C1 = "1"
        Else
        Range("A1").FormulaR1C1 = "0"
        End If
    End Sub

    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 đủ

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm