• ベストアンサー

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 に引っかかってしまっています。

質問者が選んだベストアンサー

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.1

なかなか回答が付かないようなので。。。 ダメ元で以下のように一旦、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 -------------------------------------------  

Tues17
質問者

お礼

ご回答ありがとうございました。 試してみたところ、xlReadOnlyをセットする時に「読み取り専用の切り替えを行う前に、編集内容を保存しますか?」とメッセージが出てしまいました。 でもWorkbooks.Openの直後なのでいいやー、とxlReadOnlyの直前に ActiveWorkbook.Saved = True をかましたら、黙ってうまく動いてくれました。(xlReadOnly をセットした後にはActiveWorkbook.Saved = False を入れてみました) 一度xlReadOnlyにしてみるという発想は全然なかったので、なんだか目からウロコな気分です。どうもありがとうございました。

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

> 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

Tues17
質問者

補足

ご回答ありがとうございました。 ファイルがあるかどうか、開かれているかどうかは、こうやって調べればいいのですね...今までずっと「開いてみてコケたらファイルが存在しない」というチェック方法ばかりしていました。しかも、複数の人が同時に使うかどうかを意識したコーディングをしたこともありませんでした。 今回はNo.1 のtaocatさんの方法で行くことにしましたが、次からファイルチェックはKenKen_SPさんのこの関数の方法にしようと思います。 どうもありがとうございました。

関連するQ&A

専門家に質問してみよう