0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

記事投稿キャンペーン 「AI、機械学習」

ネットワーク上のMicrosoft Excelブックが使用中かどうかを確認して開く

Posted at

 開こうとするMicrosoft Excelブックが他で使われているかどうか?
をVBAで判断する際は、速度を稼ぐため「ファイルとして追記(Append)モードで開けるか?」を試してエラーコード(または単にエラーの有無)で判断することが推奨されてますが、
 これ、ネットワーク上のファイルでやるとエラーにならずに返ってきません?
要するに使えないということ。

 なので正攻法で作りました。
引数"ブック名"には「調べるブックへのフルパス」を指定します。
開ければ、True、開けなければ、Falseが戻り値です。
開けた場合、引数"ブック名"には(フルパスから抽出した)単独のファイル名がセットされます。一度ブックを開いたら、あと、扱うのはファイル名ですから、一度にやっておきます。
開けなかった場合、ブックそのものがなければ引数"ブック名"はString型の初期値(vbNullString)がセットされます。
ブックが開かれている場合は、引数そのままです。ここでエラー内容が区別できます。
(開かれている場合もファイル名単独を返そうかとちょっと悩みましたが、エラーメッセージにフルパスを使うかもしれない、と思いとどまりました。
ブックそのものがない場合は「論外!」ということで。)

' [参照設定]からMicrosoft Scripting Runtimeを指定すること
Function OpenBookWritable(ByRef ブック名 As String) As Boolean

Dim fso As FileSystemObject: Set fso = New FileSystemObject

    '開こうとしたファイルが存在しない場合
    If Not fso.FileExists(ブック名) Then
        OpenBookWritable = False
        ブック名 = vbNullString
        Exit Function
    End If

    Application.DisplayAlerts = False

    'ワークブックをオープンした場合、 通知を表示しないようにする。
    Workbooks.Open Filename:=ブック名, Notify:=False

    If ActiveWorkbook.ReadOnly Then
    '開いたブックが読み取り専用となっていたら閉じる。
        ActiveWorkbook.Close
        OpenBookWritable = False
    Else
        OpenBookWritable = True
        ブック名 = fso.GetFileName(ブック名)
    End If
    
    Application.DisplayAlerts = True
    
    Set fso = Nothing

End Function

If ActiveWorkbook.ReadOnly
はようするに
「開いたウィンドウのタイトルに[読み取り専用]がついているかどうか、の判断をしている、ということです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?