9

Excel 2007スプレッドシートが開いていて、WHOがVBScriptを使用して開いているかどうかを確認するにはどうすればよいですか?

Excelブックが現在別のユーザーによって開かれているかどうかを調べ、そのユーザーがスクリプトに含まれているユーザーを返します。

ブックが現在開いているかどうかを誰が判断するかはすでにわかっています。これは回避策ですが、基本的にはブックを開いて読み取り専用かどうかを確認します。それは完璧に機能します。私はそれをテストしました。

ブラウザでファイルを開くと、Excelでファイルを開いているユーザーが表示されるため、これが可能であることはわかっています。

これが私のコード(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

また、コマンドラインからこれを実行します。

cscript isWorkbookOpen.vbs
4

2 に答える 2

13

Genious の同僚は、Excel の「ロック」ファイルについて思い出させてくれました。Excelを開くと、ファイルを開いた人の名前を保持する隠しシステムファイルが作成されます。ロック ファイルは、スプレッドシート名の前に「~$」で始まります。例:

testWorkbook.xlsxロックファイルと呼ばれるスプレッドシートがある場合~$testWorkbook.xlsx、同じディレクトリに配置されます。

これは、以前のように実際にファイルを開いているわけではないため、ファイルが開いているかどうかを確認するためのより高速で簡単な方法でもあります。現在、ロック ファイルが存在するかどうかを確認しています。存在する場合は、ロック ファイルの「所有者」が誰であるかを確認し、それが現在スプレッドシートを開いている人物になります。うまくいけば、これは将来誰かを助けるでしょう!

これは完璧に動作する私のコードです:

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

GetFileOwner 関数のガッツを書いていないことを指摘しておきます。関数でそのコードを取得したWebサイトにリンクしました。

また、スプレッドシートにマップされた場所がなく、ネットワーク上にある場合、UNC パスは機能せず、ドライブをマップする必要があります。これは、次の 2 行のコードを使用して実行できます。

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

うまくいけば、誰かがこれから恩恵を受けるでしょう。私はそれを永遠に探していたので、ウェブ上でこれを行う方法についての情報があまりないことを知っています!

于 2013-03-22T21:26:07.860 に答える
1

Workbook.UserStatus プロパティを試しましたか? 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 
于 2013-03-22T13:52:39.947 に答える