2013-03-21 6 views
7

Excel 2007スプレッドシートが開いていて、WHOがVBScriptを使用して開いているかどうかを確認するにはどうすればよいですか?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 
+1

@AnsgarWiechersこれは複製ではありません。この記事では、Excelスプレッドシートが既に公開されているかどうかを判断する方法を尋ねています。私はWHOがそれを開くようにするために探しています。私はすでにそれが開いている場合取得する方法を知っています。私はそれが私が探しているもののために間違っている可能性があります。 – Steven

答えて

11

私の天才の同僚は、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" 

うまくいけば、誰かがこれで恩恵を受けることを望みます。私は永遠にそれを探していたので、Web上でこれを行う方法に関する多くの情報がないことを知っています!

+0

このメソッドは非常に天才です!それは私に大きな問題を解決しました。共有してくれてありがとう! – lovechillcool

+0

ところで、この方法はExcel 2007以上のバージョンファイルでのみ動作します。 .xlsのためには動作しません – lovechillcool

+0

@Steven私はこれをVBAで使用しようとしましたが、ローカルのC:\ドライブで正常に動作しますが、このコードをサーバー上で実行すると、関数から返されるものはすべてNULLになります。そして、はい、私はサーバー上で照会しているファイルにドライブをマップしました。何か案は? – Josh

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 
+0

これは、スプレッドシートが現在開いていない場合に私が探しているものを私に与えます。私の現在のスクリプトはファイルを読み取り専用で開き、読み取り専用ファイルにアクセスできないというエラーを出さずにWorkbook.UserStatusプロパティから何も取得することはできません。 – Steven

+0

私は同僚の助けを借りて考え出したことはありません。 – Steven

関連する問題