2014-08-28
ExcelVBA覚書 誰かが使ってる・・・
Excelファイルを開く。
だけど、誰かが開いているから保存はできないよ。
だから処理をやめるね。
ってなことがやりたい!ということで調べてみた。
なんか、Open xxx For Append とか Open xxx For Binary とかで誰かがつかんでることを確認する方法とかあったのだけど、ファイルがちょっと特殊なところにあり、こういうことができない。
それに、パスワード設定しているため、誰かが使っているときにReadOnlyをFalseにして開くと、パスワードまで聞いてくる始末・・・
なので、脳みその10%をフル活用してみた。
'
' 引数で指定されたパスを開いて、開いたブックを返す
' (ここではパスワード設定は省略)
Private Function OpenBook(filePath As String, readonlyFlg as Boolean) As Workbook
Dim fileName As String
On Error Goto ErrorFunc
'(1) とにかく読取専用で開く(確認メッセージとか出さない)
Set OpenBook= Application.Workbooks.Open(Filename:=filePath , UpdateLinks:=False _
, Notify:=False, ReadOnly:=True)
'(2) 読取専用で開くときはここで終わり
If readonlyFlg Then Exit Function
'(3) 開いたブックを読み書きできるようにする(確認メッセージとか出さない)
fileName = OpenBook.Name
OpenBook.ChangeFileAccess Mode:=xlReadWrite, Notify:=False
'(4) なぜか、開き直しになり設定が切れてしまうので、もう一度設定しなおす
Set OpenBook = Workbooks(fileName)
'(5)ファイルが読取専用でなかったら、編集可能なブック!
If Not OpenBook.ReadOnly Then Exit Funtion
'(6) OpenBook.ReadOnly = True なら、誰かが掴んでる!=> 閉じる
OpenBook.Close SaveChanges:=False
Set OpenBook = Nothing
Exit Function
ErrorFunc:
'指定したパスのファイルがないときは、(1)でエラー発生し、ここに来る!
End Function
ということで、回りくどいやり方をすれば何とかできることが分かった。
上の例だと、ファイルがないときも、開けないときもNothingで返してしまうので、区別したいときはフラグを返してやるとか工夫が必要。
ブックを開いた後は
OpenBook.Windows(1).WindowState = xlMinimized
で最小化しておくと、画面のちらつきは最小限で済む。
で、これが「特殊な環境下」でうまく動くかどうかはまだ試せていない。