アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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
-------------------------------------------
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/26 12:39

> 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さんのこの関数の方法にしようと思います。
どうもありがとうございました。

補足日時:2006/06/26 12:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています