Bạn tham khảo link này:http://www.giaiphapexcel.com/forum/showthread.php?35489-Useful-functions-Các-hàm-hữu-íchXin 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!
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!
Function IsWorkBookOpen(ByRef BookName As String) As Boolean
On Error Resume Next
IsWorkBookOpen = Not (Application.Workbooks(BookName) Is Nothing)
End Function
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èoBạ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
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
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ỉ?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
[GPECODE=vb]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
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ỉ?
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
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 ạ?
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
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
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ả.Đá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
Code của bạn viết rằng:
Phải sửa thành: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
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 đủ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
Bài này có liên quan gì với chủ đề đâu?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