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
で最小化しておくと、画面のちらつきは最小限で済む。
で、これが「特殊な環境下」でうまく動くかどうかはまだ試せていない。