Thảo luận mở rộng về "Useful functions - Các hàm hữu ích" của Lê Văn Duyệt (2 người xem)

Liên hệ QC

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

Duyệt ơi!
Việc kiểm tra 1 file có đang mở hay không hoàn toàn khác với kiểm tra 1 workbook đang mở
Với 1 file, ta cần đường dẩn đầy đủ đến file, còn người dùng khi cần kiểm tra 1 Workbook có đang mở hay không, họ đâu quan tâm đến đường dẩn ---> Chỉ cần tên của Workbook có tồn tại trong cửa sổ Task Manager thì hàm phải trả về giá trị TRUE và ngược lại thì FALSE
Minh nghĩ 2 chuyện này hoàn toàn khác nhau ---> Nói chung là KHÓ (đã tìm khắp nơi nhưng chưa thấy code nào khả thi)
Hi Anh,
Em chưa hiểu ý anh lắm+-+-+-+

Lê Văn Duyệt
 
Hi Anh,
Em chưa hiểu ý anh lắm+-+-+-+

Lê Văn Duyệt
Tức là thế này:
- Tôi có Workbook mang tên A.xls
- Tôi cần 1 hàm theo cú pháp =WbIsOpen("A")
- Hàm này sẽ trả về giá trị = TRUE nếu Workbook A.xls đang mở và ngược lại
Thế thôi, không quan tâm đến đường dẩn (file ấy nằm ở đâu trên đĩa cứng tùy ý)
---------------
Còn vụ kiểm tra file đang mở lại hoàn toàn khác, nó cần 1 đường dẩn đầy đủ, và đây là điều mà người dùng không quan tâm!
 
Anh ơi,

Em đã giới thiệu rồi (nhưng tại vì em chưa kiểm tra theo ý anh nói thôi.) Anh xem ở đây nha.

Chúc anh nghỉ lễ vui vẻ nha.

Lê Văn Duyệt

Anh Duyệt ơi, nếu workbook đặt thuộc tính share (menu: Tools\Share Workbook...) thì hàm trả về giá trị không đúng. Bất kỳ một file nào, không cứ là Excel, nếu OpenFile với thuộc tính Share thì việc kiển tra như cách đã nêu là không đúng.

Vấn đề này có thể tìm một giải pháp tối ưu là: tìm trong Registry hay ở đâu đó, Microsoft Excel lưu thông tin về những file đang mở. Em cũng đang tìm nhưng chưa ra.
 
Nói tóm lại câu trả lời mình cần tìm là: Viết một hàm với tham số là tên của workbook, và kiểm tra xem workbook này có đang mở hay không? (kiểm tra trong tất cả các session Excel đang mở)

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Đây là một ý tưởng từ ZVI

Mã:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Dim hwnd As Long, IsOpen As Boolean, WbName As String
' Testing subrotine
Sub Test()
    Const Wb = "Book1.xls"
    MsgBox "IsWorkbookOpen = " & IsWorkbookOpen(Wb) & vbLf & WbName, , Wb
End Sub
' IsFileOpen= True if WorkbookName is found in text of any Excel window
Function IsWorkbookOpen(WorkbookName As String) As Boolean
    hwnd = 0: IsOpen = False: WbName = UCase(WorkbookName)
    EnumChildWindows hwnd, AddressOf EnumChildProc, ByVal 0&
    If IsOpen Then IsWorkbookOpen = True Else WbName = ""
End Function
' Aux function for API callback
Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

    Dim s$
    s = Space$(GetWindowTextLength(hwnd) + 1)
    GetWindowText hwnd, s, Len(s)
    s = Left$(s, Len(s) - 1)
    Debug.Print s
    If UCase(s) Like "*MICROSOFT EXCEL *" & WbName & "*" Then
        WbName = s
        IsOpen = True
        Exit Function
    End If
    EnumChildProc = 1
End Function

(Em chưa kiểm tra)
 
Đây là một ý tưởng từ ZVI

Mã:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Dim hwnd As Long, IsOpen As Boolean, WbName As String
' Testing subrotine
Sub Test()
    Const Wb = "Book1.xls"
    MsgBox "IsWorkbookOpen = " & IsWorkbookOpen(Wb) & vbLf & WbName, , Wb
End Sub
' IsFileOpen= True if WorkbookName is found in text of any Excel window
Function IsWorkbookOpen(WorkbookName As String) As Boolean
    hwnd = 0: IsOpen = False: WbName = UCase(WorkbookName)
    EnumChildWindows hwnd, AddressOf EnumChildProc, ByVal 0&
    If IsOpen Then IsWorkbookOpen = True Else WbName = ""
End Function
' Aux function for API callback
Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

    Dim s$
    s = Space$(GetWindowTextLength(hwnd) + 1)
    GetWindowText hwnd, s, Len(s)
    s = Left$(s, Len(s) - 1)
    Debug.Print s
    If UCase(s) Like "*MICROSOFT EXCEL *" & WbName & "*" Then
        WbName = s
        IsOpen = True
        Exit Function
    End If
    EnumChildProc = 1
End Function
(Em chưa kiểm tra)
Đang test... Duyệt đưa thiếu 1 hàm API
PHP:
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Kết quả chính xác nhưng còn.. thiếu tí nữa thôi, đó là:
- Kiểm tra workbook trên 1 session khác ---> Kết quả CHÍNH XÁC
- Kiểm tra workbook trên cùng 1 session ---> Kết quả SAI
Hic... Mình nghĩ trục trặc này Duyệt thừa sức khắc phục!
---------------------------------------------
Anh Duyệt ơi, nếu workbook đặt thuộc tính share (menu: Tools\Share Workbook...) thì hàm trả về giá trị không đúng. Bất kỳ một file nào, không cứ là Excel, nếu OpenFile với thuộc tính Share thì việc kiển tra như cách đã nêu là không đúng.
.
Đã thử với share workbook ---> Kết quả chính xác luôn
 
Lần chỉnh sửa cuối:
Đây là một ý tưởng từ ZVI

Mã:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Dim hwnd As Long, IsOpen As Boolean, WbName As String
' Testing subrotine
Sub Test()
    Const Wb = "Book1.xls"
    MsgBox "IsWorkbookOpen = " & IsWorkbookOpen(Wb) & vbLf & WbName, , Wb
End Sub
' IsFileOpen= True if WorkbookName is found in text of any Excel window
Function IsWorkbookOpen(WorkbookName As String) As Boolean
    hwnd = 0: IsOpen = False: WbName = UCase(WorkbookName)
    EnumChildWindows hwnd, AddressOf EnumChildProc, ByVal 0&
    If IsOpen Then IsWorkbookOpen = True Else WbName = ""
End Function
' Aux function for API callback
Private Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

    Dim s$
    s = Space$(GetWindowTextLength(hwnd) + 1)
    GetWindowText hwnd, s, Len(s)
    s = Left$(s, Len(s) - 1)
    Debug.Print s
    If UCase(s) Like "*MICROSOFT EXCEL *" & WbName & "*" Then
        WbName = s
        IsOpen = True
        Exit Function
    End If
    EnumChildProc = 1
End Function

(Em chưa kiểm tra)

Kết quả không đúng anh ạ. Như em đã nói bài trên là dùng các hàm API để kiển tra text/caption của các window đang mở với tên một workbook rồi kết luận nó mở hay không là không chuẩn.

Hàm trên sẽ bị sai khi xảy ra một trong 3 trường hợp dưới đây,
+ Excel đang mở ít nhất 2 file (thực tế người dùng Excel ít khi chỉ mở một file). Giả sử ta cần kiểm tra file book1.xls, nhưng ta đang làm viẹc với book2.xls (ActiveWorkbook) thì kêys quả không đúng.
Việc trả kết quả không đúng vì khi ta đa làm với một workbook thì Window của chương trình sẽ luôn hiện tên của workbook đó, còn các workbooks khác đang mở vẫn chạy âm thầm nhưng không có tên trên window của chương trình.
+ Người dùng khi viết một ứng dụng VBA, thường thay đổi caption/text của window chương trình bằng cách Application.Caption = "Chương trình kiểm kho", khi đó đương nhiên hàm kiểm tra trên là sai.
+ Nếu tên workbook là tên có dấu, ví dụ "kế toán nhập xuất tồn.xls" thì hàm trên đương nhiên sai, vì chúng không hõ trợ Unicode. Tuy nhiên vấn đề này là chuyện nhỏ vì ta có thể unicode được.

Việc sai của hàm IsWorkbookOpen trên là vì ta chỉ dựa vòa một manh mối mong manh là WindowText, mà giá trị này thường bị thay đổi bởi ứng dụng, của người dùng. Việc đặt workbook share hay không không liên quan tời hàm này.

Hy vọng chúng ta sẽ tìm được giải pháp chuẩn cho hàm IsWorkbookOpen.
 
Lần chỉnh sửa cuối:
Theo tôi thì việc kiểm tra trạng thái 1 workbook có đang được mở hay không thì kiểm tra trên 1 Session của Excel là đủ rồi, tôi chưa thấy có nhu cầu nào cần phải kiểm tra trên tất cả các session Excel đang chạy cả. Không rõ có bác nào gặp phải tình huống cần phải kiểm tra trên toàn bộ các session của Excel hay chưa???
 
Theo tôi thì việc kiểm tra trạng thái 1 workbook có đang được mở hay không thì kiểm tra trên 1 Session của Excel là đủ rồi, tôi chưa thấy có nhu cầu nào cần phải kiểm tra trên tất cả các session Excel đang chạy cả. Không rõ có bác nào gặp phải tình huống cần phải kiểm tra trên toàn bộ các session của Excel hay chưa???

Với các loại database khác thì có lẽ không thực sự cần thiết vì nếu là file có thể share cho nhiều người dùng thì nó luôn được mở ở trạng thái share, khi đó nhiều người đều có thể ghi vào file này khi nó đang mở. Nhưng với Excel, khi file đã mở ở một session, nếu mở một lần nữa trên session khác thì nó luôn là trạng thái ReadOnly - Chỉ đọc mà không ghi được, khi đó các lệnh ghi dữ liệu trên file này sẽ xảy ra lỗi. Trừ khi file này người dùng đặt thuộc tính "Share Workbook".
 
Với các loại database khác thì có lẽ không thực sự cần thiết vì nếu là file có thể share cho nhiều người dùng thì nó luôn được mở ở trạng thái share, khi đó nhiều người đều có thể ghi vào file này khi nó đang mở. Nhưng với Excel, khi file đã mở ở một session, nếu mở một lần nữa trên session khác thì nó luôn là trạng thái ReadOnly - Chỉ đọc mà không ghi được, khi đó các lệnh ghi dữ liệu trên file này sẽ xảy ra lỗi. Trừ khi file này người dùng đặt thuộc tính "Share Workbook".
Nếu để phục vụ yêu cầu này theo tôi không không phải kiểm tra tên Workbook đang mở mà phải kiểm tra Tên file đầy đủ mới đúng. Vì nếu tôi có 2 file cùng tên nhưng đặt ở 2 thư mục khác nhau, như vậy khi mở ra nó sẽ có cùng tên Workbook(mở trên 2 session của excel), việc kiểm tra để phục vụ yêu cầu này sẽ không chính xác. Mặt khác việc mở cùng 1 file thì về mặt người dùng sẽ nhận được cảnh báo file in use. Còn về mặt người xử lý dưới code thì cần quan tâm tới trạng thái ReadOnly của file đang xử lý.
 
Nếu để phục vụ yêu cầu này theo tôi không không phải kiểm tra tên Workbook đang mở mà phải kiểm tra Tên file đầy đủ mới đúng. Vì nếu tôi có 2 file cùng tên nhưng đặt ở 2 thư mục khác nhau, như vậy khi mở ra nó sẽ có cùng tên Workbook(mở trên 2 session của excel), việc kiểm tra để phục vụ yêu cầu này sẽ không chính xác. Mặt khác việc mở cùng 1 file thì về mặt người dùng sẽ nhận được cảnh báo file in use. Còn về mặt người xử lý dưới code thì cần quan tâm tới trạng thái ReadOnly của file đang xử lý.

Trước khi open file thì kiểm tra xem tên của Workbook đã tồn tại hay chưa. Nếu đã có thì không mở nữa hoặc làm gì đấy...
Vấn đề kiểm tra trạng thái đã mở hay chưa mới là khó. Khi viết ứng dụng, người ta kiểm tra file trước khi mở nó ra, chứ mở rồi mới kiểm tra thì không ổn.
 
Trước khi open file thì kiểm tra xem tên của Workbook đã tồn tại hay chưa. Nếu đã có thì không mở nữa hoặc làm gì đấy...
Vấn đề kiểm tra trạng thái đã mở hay chưa mới là khó. Khi viết ứng dụng, người ta kiểm tra file trước khi mở nó ra, chứ mở rồi mới kiểm tra thì không ổn.
Thế thì vấn đề chuyển sang là kiểm tra 1 file đã được mở hay chưa(in use), chứ không phải kiểm tra Workbook có tên cụ thể có đang được mở hay không. Tên Workbook có thể đang mở nhưng chắc gì đã phải là cái file mà ta đang định mở??? Để kiểm tra file hiện có được mở hay không thì phải kiểm tra Fullname của file đó mới xác định được. Bạn thử dùng hàm này kiểm tra tình trạng file đang được mở hay không xem có vấn đề gì không nhé
Mã:
Function IsOpen(strFullname As String) As Boolean
    Dim iFile As Integer
    iFile = FreeFile
    On Error Resume Next
    Open strFullname For Binary Access Read Write Lock Read Write As #iFile
    Close #iFile
    If Err.Number <> 0 Then
        IsOpen = True
        Err.Clear
    Else
        IsOpen = False
    End If
End Function
 
Thế thì vấn đề chuyển sang là kiểm tra 1 file đã được mở hay chưa(in use), chứ không phải kiểm tra Workbook có tên cụ thể có đang được mở hay không. Tên Workbook có thể đang mở nhưng chắc gì đã phải là cái file mà ta đang định mở??? Để kiểm tra file hiện có được mở hay không thì phải kiểm tra Fullname của file đó mới xác định được. Bạn thử dùng hàm này kiểm tra tình trạng file đang được mở hay không xem có vấn đề gì không nhé
Có tính huống thế này:
- Người dùng có file A.xls nằm đâu đó trên đĩa cứng
- File A.xls này đôi lúc bị thay đổi vị trí (tức thay đổi đường dẩn)
- Khi làm việc gì đó, người ta chỉ muốn biết file A.xls này đã mở hay chưa (chỉ cần biết tên file)
Thế thì không thể xác định file đã mở bằng vào đường dẩn được (Mà thực chất người dùng cũng không quan tâm đến đường dẩn luôn)
Vói người dùng Excel có kinh nghiệm sẽ luôn "tránh né" vấn đề này, nhưng trên thực tế nhu cầu trên là có thật
(Thế mới khoai... chứ để xác định 1 file có đường dẩn cụ thể đã mở hay chưa thì ta đã không bàn luận gì nữa rồi)
 
Có tính huống thế này:
- Người dùng có file A.xls nằm đâu đó trên đĩa cứng
- File A.xls này đôi lúc bị thay đổi vị trí (tức thay đổi đường dẩn)
- Khi làm việc gì đó, người ta chỉ muốn biết file A.xls này đã mở hay chưa (chỉ cần biết tên file)
Thế thì không thể xác định file đã mở bằng vào đường dẩn được (Mà thực chất người dùng cũng không quan tâm đến đường dẩn luôn)
Vói người dùng Excel có kinh nghiệm sẽ luôn "tránh né" vấn đề này, nhưng trên thực tế nhu cầu trên là có thật
(Thế mới khoai... chứ để xác định 1 file có đường dẩn cụ thể đã mở hay chưa thì ta đã không bàn luận gì nữa rồi)
Tôi thấy đây vẫn chỉ là giả thuyết để rồi lại dẫn dắt tới việc thực hiện cái yêu cầu ban đâu chứ chưa phải là 1 trường hợp cụ thể cần cái nhu cầu này(vẫn ở đâu đó với làm việc gì đó), còn nhu cầu thực tế tôi thấy nó vẫn không cần thiết, bản thân excel cũng không hề quan tâm tới việc 1 Workbook có tên cụ thể đã được mở trên session khác hay chưa. Còn nếu bác nào thực sự có nhu cầu này thật thì có thể can thiệp để khi mở 1 workbook bất kỳ thì lưu tạm tên workbook vào đâu đó(có thể là regitry), khi close workbook thì lại xóa nó đi, như vậy khi cần kiểm tra có thể kiểm tra tại đó. Còn tôi thì thực sự chưa thấy có nhu cầu nào để thực hiện yêu cầu này cả.
 
Thế thì vấn đề chuyển sang là kiểm tra 1 file đã được mở hay chưa(in use), chứ không phải kiểm tra Workbook có tên cụ thể có đang được mở hay không. Tên Workbook có thể đang mở nhưng chắc gì đã phải là cái file mà ta đang định mở??? Để kiểm tra file hiện có được mở hay không thì phải kiểm tra Fullname của file đó mới xác định được. Bạn thử dùng hàm này kiểm tra tình trạng file đang được mở hay không xem có vấn đề gì không nhé
Mã:
Function IsOpen(strFullname As String) As Boolean
    Dim iFile As Integer
    iFile = FreeFile
    On Error Resume Next
    Open strFullname For Binary Access Read Write Lock Read Write As #iFile
    Close #iFile
    If Err.Number <> 0 Then
        IsOpen = True
        Err.Clear
    Else
        IsOpen = False
    End If
End Function

Cái hàm này cũng như cái hàm bác Duyệt đã giới thiệu thôi. Nó sai khi workbook đặt thuộc tính share (Tools\Share Workbook...).
Vấn đề tôi quan tâm thực sự là file đó đã được mở hay chưa mà thôi (kiểm tra fullname), chứ tên workbook là một chuyện khác.

Về ý tưởng lưu file mở vào registry để lấy chỗ để kiểm tra thì không được đâu. Một file Excel thuần túy (không có VBA) người ta có thể mở một cách thông thường là nhấp đúp chuột từ "My Computer"

Vấn của tôi là thực tế. Tôi quan tâm tới kết quả trả về của hàm phải đúng.
 
Lần chỉnh sửa cuối:
Cái hàm này cũng như cái hàm bác Duyệt đã giới thiệu thôi. Nó sai khi workbook đặt thuộc tính share (Tools\Share Workbook...).
Vấn đề tôi quan tâm thực sự là file đó đã được mở hay chưa mà thôi (kiểm tra fullname), chứ tên workbook là một chuyện khác.

Về ý tưởng lưu file mở vào registry để lấy chỗ để kiểm tra thì không được đâu. Một file Excel thuần túy (không có VBA) người ta có thể mở một cách thông thường là nhấp đúp chuột từ "My Computer"

Vấn của tôi là thực tế. Tôi quan tâm tới kết quả trả về của hàm phải đúng.
Có bị lộn gì ở đây không? Tôi thấy mọi người đang bàn đến chuyện kiểm tra tên 1 Workbook có được mở trên bất kỳ 1 session nào hay không, và tôi thấy chỉ cần check trên 1 session hiện tại mà code chạy là đủ. Còn code kiểm tra file có đang mở hay không thì hàm đó trả về kết quả đúng. Riêng trường hợp Share Workbook thì khi 1 Workbook đã được share thì cơ chế làm việc của nó khác hoàn toàn, nếu ai đã dùng các phần mềm quản lý SourceSafe sẽ hiểu là khi đó thì file đó sẽ không được mở thực sự, khi 1 người dùng mở file đó thì thực chất nó tạo ra 1 bản sao của file đó trên local và làm việc trên bản đó, chỉ khi nào thực sự ghi lại thì nó mới làm việc với file thực sự đó. Như vậy tôi thấy yêu cầu mà bạn đang quan tâm có vẻ đang không giống như yêu cầu mà bác NDU đang quan tâm thì phải. Còn nhu cầu bạn muốn kiểm tra 1 file đã share workbook rồi có thực sự được mở hay không thì tôi đang không rõ trường hợp cụ thể nào dẫn đến nhu cầu này???
 
Có bị lộn gì ở đây không? Tôi thấy mọi người đang bàn đến chuyện kiểm tra tên 1 Workbook có được mở trên bất kỳ 1 session nào hay không, và tôi thấy chỉ cần check trên 1 session hiện tại mà code chạy là đủ. Còn code kiểm tra file có đang mở hay không thì hàm đó trả về kết quả đúng. Riêng trường hợp Share Workbook thì khi 1 Workbook đã được share thì cơ chế làm việc của nó khác hoàn toàn, nếu ai đã dùng các phần mềm quản lý SourceSafe sẽ hiểu là khi đó thì file đó sẽ không được mở thực sự, khi 1 người dùng mở file đó thì thực chất nó tạo ra 1 bản sao của file đó trên local và làm việc trên bản đó, chỉ khi nào thực sự ghi lại thì nó mới làm việc với file thực sự đó. Như vậy tôi thấy yêu cầu mà bạn đang quan tâm có vẻ đang không giống như yêu cầu mà bác NDU đang quan tâm thì phải. Còn nhu cầu bạn muốn kiểm tra 1 file đã share workbook rồi có thực sự được mở hay không thì tôi đang không rõ trường hợp cụ thể nào dẫn đến nhu cầu này???

Vấn đề bác NDU quan tâm là tên workbook, còn tôi quan tâm tới file (fullname). Tôi quan tâm tới IsOpen() phải trả về đúng, dù file đó đặt thuộc tính gì, cơ chế gì. Còn nếu chúng ta không làm được thì thôi tạm bỏ qua hàm này. Vấn đề này trên mạng hình như cũng chưa có ai làm được thì phải?

Còn nhu cầu bạn muốn kiểm tra 1 file đã share workbook rồi có thực sự được mở hay không thì tôi đang không rõ trường hợp cụ thể nào dẫn đến nhu cầu này???

Một file, do tính chất công việc phải hợp tác, chia sẻ dữ liệu với nhiều người, người ta share nó trong mạng LAN (đương nhiên phải đặt Share Workbook). Từ một chương trình người ta có hàm IsOpen(...) để kiểm tra.
 
Lần chỉnh sửa cuối:
Vấn đề bác NDU quan tâm là tên workbook, còn tôi quan tâm tới file (fullname). Tôi quan tâm tới IsOpen() phải trả về đúng, dù file đó đặt thuộc tính gì, cơ chế gì. Còn nếu chúng ta không làm được thì thôi tạm bỏ qua hàm này. Vấn đề này trên mạng hình như cũng chưa có ai làm được thì phải?



Một file, do tính chất công việc phải hợp tác, chia sẻ dữ liệu với nhiều người, người ta share nó trong mạng LAN (đương nhiên phải đặt Share Workbook). Từ một chương trình người ta có hàm IsOpen(...) để kiểm tra.
Sở dĩ tôi hỏi trường hợp cụ thể nhu cầu vì đôi khi có thể không dùng cách này thì dùng cách khác. Còn hàm IsOpen nếu đối với 1 file không share thì chắc không còn vấn đề gì phải bàn. Trường hợp Share thì tôi không rõ code từ 1 nơi khác(không phải file cần kiểm tra) có kiểm tra được file đó có phải share hay không? do đó việc kiểm tra IsOpen khó mà thực hiện được, tuy nhiên nếu code tại file đó ta hoàn toàn có thể kiểm tra file đó có được share hay không, nếu được share thì hiện tại có bao nhiêu người đang mở file đó. Từ đây tôi nghĩ chắc cũng đủ dùng cho 1 số trường hợp rồi, tuy nhiên tôi không rõ trường hợp cụ thể của bạn là gì nên không rõ nó có đáp ứng được yêu cầu của bạn hay không.
 
Sở dĩ tôi hỏi trường hợp cụ thể nhu cầu vì đôi khi có thể không dùng cách này thì dùng cách khác. Còn hàm IsOpen nếu đối với 1 file không share thì chắc không còn vấn đề gì phải bàn. Trường hợp Share thì tôi không rõ code từ 1 nơi khác(không phải file cần kiểm tra) có kiểm tra được file đó có phải share hay không? do đó việc kiểm tra IsOpen khó mà thực hiện được, tuy nhiên nếu code tại file đó ta hoàn toàn có thể kiểm tra file đó có được share hay không, nếu được share thì hiện tại có bao nhiêu người đang mở file đó. Từ đây tôi nghĩ chắc cũng đủ dùng cho 1 số trường hợp rồi, tuy nhiên tôi không rõ trường hợp cụ thể của bạn là gì nên không rõ nó có đáp ứng được yêu cầu của bạn hay không.
Hi rollover79,

Vậy theo bạn có cách nào, hàm nào để kiểm tra việc workbook trong tình trạng shared và đang mở hay đóng không?

Lê Văn Duyệt
 
Hi rollover79,

Vậy theo bạn có cách nào, hàm nào để kiểm tra việc workbook trong tình trạng shared và đang mở hay đóng không?

Lê Văn Duyệt
Nếu ở tại workbook đó thì ta có thể dùng thuộc tính MultiUserEditing hoặc UserStatus của workbook để kiểm tra, ví dụ sau sẽ liệt kê danh sách User đang mở workbook và tình trạng share
Mã:
Sub ShowUsers()
    On Error Resume Next
    Dim arrUsers()
    Dim strMsg As String
    Dim i As Integer
    arrUsers = ThisWorkbook.UserStatus
    For i = 1 To UBound(arrUsers)
        strMsg = strMsg & arrUsers(i, 1) & " Opened: " & arrUsers(i, 2) & ", " & IIf(arrUsers(i, 3) = 2, "Shared", "Not Shared") & vbNewLine
    Next
    MsgBox strMsg
End Sub
 
Web KT

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

Back
Top Bottom