- ベストアンサー
Excel VBA の ChangeFileAccess
Excel(2000 SP-3) VBAの ChangeFileAccessがうまく行きません。 VBAからあるExcelファイルをWorkbooks.Open で開く処理の制御で悩んでいます。 2人で同時にマクロでhoge.xls をOpenすると、どちらも「他のユーザが使用中です」的なメッセージが出ませんでした。 (エクスプローラからクリックしたりして、hoge.xlsを直接開くと、他のユーザが使用中かどうかがわかります) それでは困るので、ChangeFileAccess のNotify:=true をセットしてみたら、2人目は他のユーザが使用中である旨のメッセージが出るようになりました。 しかし、ChangeFileAccess のNotifyはちゃんと設定されているようなのですが、 'ChangeFileAccess'メソッドは失敗しました:'_Workbook'オブジェクト とエラーが出ています。 ChangeFileAccessはどう使うのが正しいのでしょうか? ソースは Workbooks.Open Filename:=ThisWorkbook.Path & "\hoge.xls", updatelinks:=1, Notify:=True ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True って感じなのですが。 Workbooks.Openはちゃんとできています。Workbooks.OpenがコケたらOn Error Goto で拾ってMsgBoxでメッセージを出す、という処理をしているのですが、Workbooks.OpenはOKなのにChangeFileAccessでコケて、On Error Goto に引っかかってしまっています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
なかなか回答が付かないようなので。。。 ダメ元で以下のように一旦、xlReadOnlyにしたあと再度xlReadWriteに戻してみてください。 ---------------------------------------------- Workbooks.Open Filename:=ThisWorkbook.Path & "\hoge.xls", updatelinks:=1, Notify:=True ● If ActiveWorkbook.ReadOnly = False Then ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly, notify:=True End If ● ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True -------------------------------------------
その他の回答 (1)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 2人で同時にマクロでhoge.xls をOpenすると、どちらも「他のユーザが > 使用中です」的なメッセージが出ませんでした。 Workbooks.Open の前にこんな感じの関数でチェックしてもダメですか? Function FileUsable(ByVal strFilename As String) As Long '--------------------------------------------------------- ' @Description: ファイルは使用可能かどうか調べる ' @Return : -1 ファイルは存在しない ' : 0 既に開かれている ' : 1 使用可能 '--------------------------------------------------------- Dim n As Integer If Dir$(strFilename) <> vbNullString Then n = FreeFile() On Error Resume Next Open strFilename For Binary Lock Read Write As #n Close #n If Err.Number = 0 Then FileUsable = 1 On Error GoTo 0 Else FileUsable = -1 End If End Function
補足
ご回答ありがとうございました。 ファイルがあるかどうか、開かれているかどうかは、こうやって調べればいいのですね...今までずっと「開いてみてコケたらファイルが存在しない」というチェック方法ばかりしていました。しかも、複数の人が同時に使うかどうかを意識したコーディングをしたこともありませんでした。 今回はNo.1 のtaocatさんの方法で行くことにしましたが、次からファイルチェックはKenKen_SPさんのこの関数の方法にしようと思います。 どうもありがとうございました。
お礼
ご回答ありがとうございました。 試してみたところ、xlReadOnlyをセットする時に「読み取り専用の切り替えを行う前に、編集内容を保存しますか?」とメッセージが出てしまいました。 でもWorkbooks.Openの直後なのでいいやー、とxlReadOnlyの直前に ActiveWorkbook.Saved = True をかましたら、黙ってうまく動いてくれました。(xlReadOnly をセットした後にはActiveWorkbook.Saved = False を入れてみました) 一度xlReadOnlyにしてみるという発想は全然なかったので、なんだか目からウロコな気分です。どうもありがとうございました。