開こうとする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
はようするに
「開いたウィンドウのタイトルに[読み取り専用]がついているかどうか、の判断をしている、ということです。