2013-03-21 30 views
7

Làm cách nào để biết bảng tính Excel 2007 có mở và WHO mở nó bằng VBScript không?Làm cách nào để biết bảng tính Excel 2007 có mở hay không và WHO mở nó bằng cách sử dụng VBScript

Tôi đang cố gắng tìm hiểu xem một bảng tính Excel hiện có đang mở bởi một người dùng khác và trả lại người dùng đó là ai trong tập lệnh của tôi hay không.

Tôi đã tìm ra ai để xác định xem sổ làm việc hiện có đang mở hay không. Đó là một cách giải quyết, nhưng về cơ bản tôi mở sổ làm việc và kiểm tra xem nó có phải là chỉ đọc hay không. Điều đó hoạt động hoàn hảo; Tôi đã thử nghiệm nó.

Tôi biết điều này là có thể vì Excel cung cấp cho bạn người dùng có tệp mở nếu bạn mở tệp qua trình duyệt.

Đây là mã của tôi (isWorkbookOpen.vbs):

Set objExcelTestWorkbook = CreateObject("Excel.Application") 
objExcelTestWorkbook.DisplayAlerts = False 'doesn't display overwrite alert 
testWorkbookFile = "I:\test_workbook.xlsx" 
Set objBook = objExcelTestWorkbook.Workbooks.open(testWorkbookFile) 

If objBook.ReadOnly Then 
    Wscript.echo "The file is read only" 
    Call EndScript 
Else 
    Wscript.echo "The file is available" 
    Call EndScript 
End If 

Function EndScript 
    objExcelTestWorkbook.Workbooks.close 
    objExcelTestWorkbook.Quit 
    WScript.Echo "Closed " & testWorkbookFile 
    WScript.Quit 
End Function 

Ngoài ra, tôi chạy từ dòng lệnh:

cscript isWorkbookOpen.vbs 
+1

@AnsgarWiechers Nó không phải là bản sao. Bài đăng đó đang hỏi cách xác định xem bảng tính excel đã mở chưa, với mã của tôi tôi đã trình bày. Tôi đang tìm cách để WHO mở nó. Tôi đã biết làm thế nào để có được NẾU nó được mở. Tôi có thể làm điều đó sai cho những gì tôi đang tìm kiếm mặc dù. – Steven

Trả lời

11

Đồng nghiệp quan trọng của tôi nhắc tôi về tệp "khóa" của Excel. Khi mở excel, bạn tạo một tệp hệ thống ẩn chứa tên người có tệp mở. Tệp khóa bắt đầu bằng "~ $" trước tên bảng tính. Ví dụ:

Nếu bạn có bảng tính có tên testWorkbook.xlsx, tệp khóa của nó sẽ là ~$testWorkbook.xlsx nằm trong cùng một thư mục.

Đây cũng là phương pháp nhanh hơn và dễ dàng hơn để kiểm tra xem tệp có mở vì bạn không thực sự mở tệp như tôi đã làm trước đây hay không. Bây giờ tôi chỉ kiểm tra xem tệp khóa có tồn tại không và nếu có, tôi kiểm tra xem ai là "chủ sở hữu" của tệp khóa và đó sẽ là người hiện đang mở bảng tính. Hy vọng rằng điều này sẽ giúp một ai đó trong tương lai!

Đây là mã của tôi mà làm việc một cách hoàn hảo:

testWorkbookLockFile = "I:\~$test_workbook.xlsx" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

If objFSO.FileExists(testWorkbookLockFile) Then 
    WScript.Echo "The file is locked by " & GetFileOwner(testWorkbookLockFile) 
Else 
    WScript.Echo "The file is available" 
End If 

Function GetFileOwner(strFileName) 
    'http://www.vbsedit.com/scripts/security/ownership/scr_1386.asp 
    Set objWMIService = GetObject("winmgmts:") 
    Set objFileSecuritySettings = _ 
    objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'") 
    intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD) 

    If intRetVal = 0 Then 
     GetFileOwner = objSD.Owner.Name 
    Else 
     GetFileOwner = "Unknown" 
    End If 
End Function 

tôi muốn chỉ ra rằng tôi đã không viết đủ can đảm Chức năng GetFileOwner. Tôi liên kết với trang web nơi tôi nhận được mã đó trong hàm.

Ngoài ra, nếu bạn không có vị trí được ánh xạ tới bảng tính và trên mạng, đường dẫn UNC sẽ không hoạt động, bạn phải ánh xạ ổ đĩa. Điều này có thể được thực hiện bằng cách sử dụng 2 dòng mã sau:

Set objNetwork = WScript.CreateObject("WScript.Network") 
objNetwork.MapNetworkDrive "Z:", "\\Server1\Share1" 

Hy vọng rằng ai đó sẽ được hưởng lợi từ việc này. Tôi biết không có nhiều thông tin về cách làm điều này trên web vì tôi đã tìm kiếm mãi mãi cho nó!

+0

Phương pháp này rất thiên tài! Nó đã giải quyết cho tôi vấn đề lớn. Cảm ơn bạn đã chia sẻ nó! – lovechillcool

+0

BTW, phương pháp này chỉ hoạt động đối với các tệp phiên bản Excel 2007 trở lên; nó không hoạt động cho .xls – lovechillcool

+0

@Steven Tôi đã thử sử dụng điều này trong VBA và nó hoạt động tốt trên ổ C: \ của tôi nhưng khi chạy mã này trên máy chủ của chúng tôi tất cả được trả về từ hàm của bạn là NULL. Và có, tôi đã ánh xạ một ổ đĩa vào tệp mà tôi đang truy vấn trên máy chủ. Ý tưởng nào? – Josh

1

Bạn đã thử tài sản Workbook.UserStatus? Dưới đây là trích dẫn đoạn mã từ trợ giúp Excel VBA:

users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
    .users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
    .Cells(row, 1) = users(row, 1) 
    .Cells(row, 2) = users(row, 2) 
    Select Case users(row, 3) 
     Case 1 
      .Cells(row, 3).Value = "Exclusive" 
     Case 2 
      .Cells(row, 3).Value = "Shared" 
    End Select 
Next 
End With 
+0

Điều này mang lại cho tôi những gì tôi đang tìm kiếm NẾU bảng tính hiện không mở. Kịch bản hiện tại của tôi sẽ mở tệp trong Chỉ đọc và bạn không thể truy lục bất kỳ nội dung nào từ thuộc tính Workbook.UserStatus mà không gặp lỗi nói rằng bạn không thể truy cập tệp chỉ đọc ... Không chắc chắn nên đi đâu từ đây. – Steven

+0

Đừng bận tâm tôi có sự giúp đỡ của các đồng nghiệp và tìm ra nó. – Steven