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

  • Thread starter Thread starter KUMI
  • Ngày gửi Ngày gửi
Liên hệ QC

KUMI

Bụi phấn
Tham gia
17/1/12
Bài viết
564
Được thích
571
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!
 
Upvote 0
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:

PHP:
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:

PHP:
Sub CheckWBO()
    MsgBox IsWorkBookOpen("BookName.xls")
End Sub
 
Upvote 0
Bạn thử với Hàm này:

PHP:
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:

PHP:
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
Mã:
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
[GPECODE=vb]
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[/GPECODE]
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:
http://support.microsoft.com/kb/213383
 
Lần chỉnh sửa cuối:
Upvote 0
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
Mã:
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
[GPECODE=vb]
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[/GPECODE]
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:
http://support.microsoft.com/kb/213383
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ỉ?
 
Upvote 0
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é:
PHP:
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
 
Upvote 0
Hix! Các Thầy kiểm tra giúp em Xem cách bố trí code của em có lỗi không mà sao kết quả lại không đạt như yêu cầu ạ?
 

File đính kèm

Upvote 0
Hix! Các Thầy kiểm tra giúp em Xem cách bố trí code của em có lỗi không mà sao kết quả lại không đạt như yêu cầu ạ?

Code của bạn viết rằng:
Mã:
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:
Mã:
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 đủ
 
Upvote 0
Đáng tiếc hàm lOpen không hổ trợ Unicode
Vậy thì tạm dùng Scripting.FileSystemObject nhé:
PHP:
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
Thầy ơi, cho em hỏi cái hàm này có thể thử một file hình, một file Word, file video hay bất kỳ một file nào khác được không? Chứ em thử file .png mở hay không mở nó đều ra kết quả FALSE hết cả.
Cám ơn Thầy nhiều.
 
Upvote 0
Code của bạn viết rằng:
Mã:
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:
Mã:
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 đủ

Thầy ơi cho em hỏi dùng lệnh nào để đếm được số khoảng trắng ở đầu một chuỗi ký tự ạ
VD: chuỗi "________TPE0118221 N rev 1003 " giả sử dấu "_" là " " vì trên này không viết được nhiều khoảng trắng liền nhau
 
Upvote 0
Thầy ơi cho em hỏi dùng lệnh nào để đếm được số khoảng trắng ở đầu một chuỗi ký tự ạ
VD: chuỗi "________TPE0118221 N rev 1003 " giả sử dấu "_" là " " vì trên này không viết được nhiều khoảng trắng liền nhau
Bài này có liên quan gì với chủ đề đâu?
 
Upvote 0
Web KT

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

Back
Top Bottom