Kiểm tra xem file có đang mở hay không (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tunglinhmot

Thành viên chính thức
Tham gia
17/5/17
Bài viết
59
Được thích
6
Giới tính
Nam
Chào mọi người, mình muốn kết hợp lệnh Application.GetOpenFilename để kiểm tra xem file có được mở hay không. Nếu file mở thì thực thi việc Copy sheet A sang sheet B nào đó và nếu file không được mở thì sẽ mở file và cũng thực thi việc copy đó.
Khi mình không dùng lệnh Application.GetOpenFilename mà gõ link file trực tiếp (ví dụ "D:\Book2.xlsx") thì chạy OK.
Còn khi mình dùng kết hợp với lệnh Application.GetOpenFilename để gắn link lại báo lỗi.
Code nay mình lấy trên mạng rồi tự sửa lại một chút nhưng vẫn không chạy như ý.
Nhờ các anh chị em GPE sửa dùm ạ. Cụ thể thì mọi người xem code trong file dưới nhé. Các yêu cầu mình đã viết trong phần comment Block rồi đấy ạ. Xin cảm ơn.
 

File đính kèm

Chào mọi người, mình muốn kết hợp lệnh Application.GetOpenFilename để kiểm tra xem file có được mở hay không. Nếu file mở thì thực thi việc Copy sheet A sang sheet B nào đó và nếu file không được mở thì sẽ mở file và cũng thực thi việc copy đó.
Khi mình không dùng lệnh Application.GetOpenFilename mà gõ link file trực tiếp (ví dụ "D:\Book2.xlsx") thì chạy OK.
Còn khi mình dùng kết hợp với lệnh Application.GetOpenFilename để gắn link lại báo lỗi.
Code nay mình lấy trên mạng rồi tự sửa lại một chút nhưng vẫn không chạy như ý.
Nhờ các anh chị em GPE sửa dùm ạ. Cụ thể thì mọi người xem code trong file dưới nhé. Các yêu cầu mình đã viết trong phần comment Block rồi đấy ạ. Xin cảm ơn.
Code của bạn sai vài chỗ. Sửa lại thành:
Mã:
Sub TestFileOpened()
  Dim X As Variant
  X = Application.GetOpenFilename("Excel Files,*.xls?")
  If TypeName(X) = "String" Then
    If IsFileOpen(CStr(X)) Then
      MsgBox "File already in use!"
    Else
      MsgBox "File not in use!"
      Workbooks.Open X
           
        ' CUNG THUC HIEN VIEC COPY SHEET A SANG SHEET B NAO DO NHU O TREN
        ' O day co cach nao de nhay luon sang cho THUCTHI : o tren ma khong
        ' can phai viet lai code khong a
    End If
  End If
End Sub
Ngoài ra tôi cũng có hàm kiểm tra file đã mở hay chưa theo cách khác:
Mã:
Function isFileOpen(ByVal FilePath As String) As Boolean
  With CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    .MoveFile FilePath, FilePath
    If Err.Number Then isFileOpen = True
  End With
End Function
Tuy rằng hàm này không phải luôn chính xác trong mọi trường hợp nhưng có thể dùng được (vì sự đơn giản và dễ hiểu). Thuật toán của hàm là: Thử di chuyển file, nếu di chuyển được nghĩa là file chưa mở và ngược lại
 
Upvote 0
Em xin cảm ơn anh ndu96081631. Em đã thử và nó chạy OK rồi anh ạ.
Em còn một vấn đề nữa là khi file không được mở thì nó sẽ mở file lên rồi làm lại cái việc mà khi file được mở nó làm ý.
Kiểu như là sau cái đoạn này :
Else
MsgBox "File not in use!"
Workbooks.Open X
Goto .......

sau lệnh goto nó nhảy lên chỗ này :

MsgBox "File already in use!"
..............
Nhảy lên chỗ này

Muốn làm thế mình phải đặt lệnh thế nào ? Xin anh chỉ nốt với ạ.
 
Upvote 0
Em xin cảm ơn anh ndu96081631. Em đã thử và nó chạy OK rồi anh ạ.
Em còn một vấn đề nữa là khi file không được mở thì nó sẽ mở file lên rồi làm lại cái việc mà khi file được mở nó làm ý.
Kiểu như là sau cái đoạn này :
Else
MsgBox "File not in use!"
Workbooks.Open X
Goto .......

sau lệnh goto nó nhảy lên chỗ này :

MsgBox "File already in use!"
..............
Nhảy lên chỗ này

Muốn làm thế mình phải đặt lệnh thế nào ? Xin anh chỉ nốt với ạ.
Hơi khó hiểu! Đoán đại:
Mã:
Sub TestFileOpened()
  Dim vFile As Variant
  Dim wkb As Workbook, fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  vFile = Application.GetOpenFilename("Excel Files,*.xls?")
  If TypeName(vFile) = "String" Then
    vFile = CStr(vFile)
    If isFileOpen(vFile) Then
      Set wkb = Workbooks(fso.GetFile(vFile).ShortName)
    Else
      Set wkb = Workbooks.Open(vFile)
    End If
  End If
  If Not wkb Is Nothing Then 
    'Làm gì đó tùy ý với 'wkb' tại đây
  End If
End Sub
 
Upvote 0
Hơi khó hiểu! Đoán đại:
Mã:
Sub TestFileOpened()
  Dim vFile As Variant
  Dim wkb As Workbook, fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  vFile = Application.GetOpenFilename("Excel Files,*.xls?")
  If TypeName(vFile) = "String" Then
    vFile = CStr(vFile)
    If isFileOpen(vFile) Then
      Set wkb = Workbooks(fso.GetFile(vFile).ShortName)
    Else
      Set wkb = Workbooks.Open(vFile)
    End If
  End If
  If Not wkb Is Nothing Then
    'Làm gì đó tùy ý với 'wkb' tại đây
  End If
End Sub
Ý em là kiểm tra xem file có mở hay không, và cho dù mở hay không mở thì nó vẫn tiếp tục thực hiện cùng một việc như nhau.
Cái code này của anh em chạy thử nó báo lỗi Compile error : ByRef argument type mismatch anh ạ. Em không biết sửa thế nào.
 
Upvote 0
Ý em là kiểm tra xem file có mở hay không, và cho dù mở hay không mở thì nó vẫn tiếp tục thực hiện cùng một việc như nhau.
.
Thì code bài trên nó vậy đấy! Ngày đoạn tôi ghi "Làm gì đó tùy ý với 'wkb' tại đây" chính là để bạn thực hiện công việc
Cái code này của anh em chạy thử nó báo lỗi Compile error : ByRef argument type mismatch anh ạ. Em không biết sửa thế nào.
Bạn "ráp" code thế nào mà lỗi?
 
Upvote 0
Em copy nguyên đoạn code đấy vào thay cho cái đoạn code trước đó của anh thôi ạ. Đoạn code trước chạy ok. Nhưng đoạn này lại có lỗi như thế. Sau khi lỗi nó chỉ vào cái tên của cái Sub TestFileOpened() đấy anh ạ.
 
Upvote 0
Em copy nguyên đoạn code đấy vào thay cho cái đoạn code trước đó của anh thôi ạ. Đoạn code trước chạy ok. Nhưng đoạn này lại có lỗi như thế. Sau khi lỗi nó chỉ vào cái tên của cái Sub TestFileOpened() đấy anh ạ.
Bạn làm thế nào thì cứ đưa "nguyên con" lên đây người ta mới biết có gì sai trong đó hay không chứ. Mô tả chung chung vậy thì... bó tay thôi
 
Upvote 0

File đính kèm

Upvote 0
Em ráp code lại rồi. Được rồi anh ạ. Dùng hàm nào cũng được nhưng em chỉ muốn biết là tại sao dùng hàm này thì lỗi còn hàm kia thì không thôi.
Giờ thì em hiểu rồi. Cảm ơn anh nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom