TechNote

とあるエンジニアのただのメモ

Windows系システム管理者必見!社内の共有Excelファイルが使用中である場合にとるべき行動まとめ

f:id:kojikoji75:20150815222858j:plain

1.社内共有Excelファイルが使用中というよくある問題(背景的な話)
2.社内共有Excelファイルが使用中である場合、一般的と思われる対応方法
3.社内共有Excelファイルが使用中である場合、クライアント操作による対応方法
4.社内共有Excelファイルが使用中でありユーザ名も同一である場合、どこで使用中かを知る方法


1.社内共有Excelファイルが使用中というよくある問題(背景的な話)

社内LAN上で複数人複数部署でExcelファイルを共有するという状況は、Googleスプレッドシートなどが広く普及してきた現在でも多く存在するのではないでしょうか。

そんな環境でよく起こるのが「誰かがファイルを使用中」という状況です。

具体的に説明すると、例えば部署Aと部署Bで共有しているExcel管理表があります。(どれだけ技術が進んでもこのようなExcel管理表はなくならないものですね。)
部署AのX君がこのExcelファイルを開いているときに、部署BのYさんが同一ファイルを開こうとすると、下記のようなメッセージが出て、読み取り専用でしか開くことができません(変更を加えられません)。

f:id:kojikoji75:20150815222224p:plain

ちなみにここで「通知」をクリックしておくと、相手が閉じたタイミングで「編集できます」というメッセージが出ます。ここで「編集する」をクリックすると読み取り専用モードから編集モードに切り替わり、修正ができるようになります。これはただの余談です。

f:id:kojikoji75:20150815222234p:plain

ではこんなときにどうするかという話になったとき、いくつか選択肢はあると思いますのでまとめておきたいと思います。

ちなみに私の会社ではWindowsログオン管理にICカード認証+シングルサインオン方式を採用しており、社内のActive Directoryドメイン環境にてクライアント端末はドメインに参加、そしてユーザは1つしか用意していないという少し変わった環境です。なので全部署のスタッフは同一ユーザでWindowsへログインしている状態となり、誰かが共有Excelファイルを開いていると「使用者は○○です」の"○○"の部分も全く同じということになります。このような人一倍困った環境での対応方法も4あたりに書いてます。



2.社内共有Excelファイルが使用中である場合、一般的と思われる対応方法

とりあえず、メッセージからユーザ名を判別できるような場合はその部署に電話して「すぐに使用したいので一旦閉じてください」などとお願いする、というのが一番最初にとるべき手順でしょう。原始的ですが。

ただ、電話しても「え?今はファイル開いてないけど...」という返事がくることもあると思います。これはクライアント側でファイルを閉じた際に、ファイルサーバ側ではプロセスを正常終了しきれずにプロセスが残っているという状態です。

このようなときは、ファイルサーバを操作して「コンピュータの管理」→「共有」→「開いているファイル」→「開いているファイルを閉じる」とすることで残ったプロセスをきちんと終了させることができます。
f:id:kojikoji75:20150913181335p:plain

「でもサーバー室まで行くの面倒だし...」という場合は、もちろん下記コマンドによりリモートデスクトップでサーバにアクセスして、上記の手順を踏むということも可能です。私も最初の頃はよくしていました。

mstsc

では、リモート操作するにしろサーバ室まで足を運ぶにしろ、わざわざサーバーをGUIで操作しないとできないことなのか?


3.社内共有Excelファイルが使用中である場合、クライアント操作による対応方法

実はクライアントのコマンドプロンプトからだけでもサーバ側の「開いているファイルを閉じる」という操作は可能です。

openfiles /query /s sampleserver001

/s の後ろにあるのはサーバ名です。
これでファイルサーバ上で現在開かれている共有ファイルの一覧をみることができます。

更に、上記コマンドで、閉じたいファイルのIDを確認したら、今度は下記コマンドで強制的に閉じることができます。

openfiles /disconnect /s sampleserver001 /id 123456

/id の後ろにあるのは上記で調べたファイルのIDです。成功したら以下のようなメッセージが表示されます。

成功:開いているファイル "d:\sample\samplefile.xlsx"への接続は切断されました。

これでわざわざサーバーをGUIで操作しなくても、サーバ上で開かれているファイルを閉じることはできます。

ただこれも、本当は使用者は閉じたつもりなのにサーバ側で正常終了しきれてなくてプロセスだけが残っているものか、それとも本当に使用中なのかまではわかりません。なのでこの終了方法も、電話確認などの行為が前提での話になるのかなとは思います。

少なくとも他部署から「この共有ファイルが今誰も開いているはずはないんだけど"使用中"になっちゃうから、サーバ側で閉じてもらっていい?」みたいな依頼が来たような場合は、このコマンドが役に立つことになるでしょう。


4.社内共有Excelファイルが使用中でありユーザ名も同一である場合、どこで使用中かを知る方法

では少し話は変わりますが、各クライアントのWindowsログオンユーザーが例えば全員同じユーザだったら?

前述したとおり、私の職場の環境は実はこのような環境にあります。そのため使用中のファイルを開くと「使用者は○○です」とメッセージは一応でるものの、全員が同じユーザなのでどこの誰が開いているかわからず、2や3の方法で強制終了していいものかどうかも判断がしにくいわけです。
(プロセスが残っているだけかもしれないし、本当にどこかの誰かが開いているかも知れないし...)

そこで、下記のようなVBA(とVBSの合わせ技)を書くことで、とりあえずはどこの誰が使用中(もしくは最後に使用してプロセスが残っているだけ)という状態を把握できるようにしました。

Private Sub Workbook_Open()

    Dim objNetWork
    
    If ActiveWorkbook.ReadOnly = False Then
        '読み取り専用ではない場合

        '端末名取得
        Set objNetWork = CreateObject("WScript.Network")
        ThisWorkbook.Sheets("使用端末").Cells(1, 1) = objNetWork.ComputerName
        Set objNetWork = Nothing
        
        '上書き保存
        Application.DisplayAlerts = False
        ActiveWorkbook.Save

    Else

        '読み取り専用の場合
        tname = ThisWorkbook.Sheets("使用端末").Cells(1, 1)
        MsgBox "端末名:" & tname & "が使用中"
        
    End If


End Sub

詳しい説明は不要でしょう。ブックオープンのイベントで操作側の端末名を毎回保持させる、使用中である場合は「端末名:○○が使用中」と表示させる方法です。

これなら一応端末の設置部署へ連絡して、ファイルを本当に使用中かそうでないかを確認できます。(使用中でなかったら2や3の方法で終了させることができます。)

他にも、「一定時間操作がなかったら自動的に閉じるVBA」とかでも短期間試験運用してみたりもしましたが、あまりユーザ側からいい評価が得られませんでした。

ということで、今のところこれがよい方法ではないかと思ってます。

あわせて読みたい

kojikoji75.hatenablog.com
kojikoji75.hatenablog.com
kojikoji75.hatenablog.com



ひと目でわかるMicrosoft Active Directory (マイクロソフト公式解説書)

ひと目でわかるMicrosoft Active Directory (マイクロソフト公式解説書)